Логическая целостность журналов документов

12.12.13

Разработка - Инструментарий разработчика

Большинство 1сников уверены, что клиент серверная версия 1с застрахована от потери целостности данных, если не лазить шаловливыми ручками напрямую в базу данных. Я тоже думал так до недавнего времени.

И тут мне пришло письмо с проблемой - в журнале документов документ имеет один номер и не проведен, а открываешь его - номер другой и сам документ проведен.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ПроверкаЛогическойЦелостностиЖурналов
.erf 8,87Kb ver:003
51
51 Скачать (1 SM) Купить за 1 850 руб.
ИсправлениеЛогическойЦелостностиЖурналов
.epf 12,83Kb
29
29 Скачать (1 SM) Купить за 1 850 руб.

Один из вариантов решения этой проблемы - на картинке анонса, это проведение ТиИ с проверкой логической целостности. По крайней мере, я надеюсь, что это так, но проверить это предположение у меня возможности не было - база очень большая, и логическая целостность выполняется весьма продолжительное время, остановить работу на пару суток не представляется возможным.

Причиной является расхождение данных в основной таблице документа _DocumentXXX и данных в таблице журнала _DocumentJournalXXX. Определить это возможно с помощью прямого сравнения этих таблиц, даже стандартными запросами 1с (с незначительным ограничением, если графа журналов неограниченной длины).

Проверить свою базу на наличие таких вот скрытых "мин" вы можете, воспользовавшись отчетом "ПроверкаЛогическойЦелостностиЖурналов" из данной публикации, который в удобном виде выдаст результат сравнения. Или ничего не выдаст - тогда можете радоваться - значит данные в таблицах документов и таблицах журнаолв согласованы. Ну, по крайней мере без учета реквизитов неограниченной длины, которые не сравнить в запросе в общем виде.

Отчет работает на любых видах баз - клиент-серверных и файловых. Скорость выполнения отчета естественно, зависит размера и структуры базы, однако на нормальном сервере MS SQL для 500гб базы он формируется несколько минут. На других СУБД, естественно, не проверял.

Из-за того, что отчет использует запросы 1с, при использовании общих реквизитов в режиме разделения данных "независимо" - отчет строится только для данных в пределах текущего разделителя (так как из запроса не обратиться к такому реквизиту).

В обновленной версии псевдонимы длятаблиц запросов поменяны на менее вероятные (было - "Журнал" и "Документы", стало "ТабПроверяемыйЖурнал" и "ТабПроверяемыеДокументы", спасибо kapustinag за указание на ошибку)

Что делать, если отчет показал не пустой результат? Прямых средств воздействия на значения в таблице журналов у нас нет. Изменение "кривых" документов не помогает - в таблице журналов все равно остаются неправильные данные (Ну, по крайней мере у меня не прокатило). Можно сделать Тестирование и Исправление, однако это требует монопольного доступа, а также занимает очень много времени, зачастую, на которое остановить работу невозможно.

Обработка "ИсправлениеЛогическойЦелостностиЖурналов" - это "генератор запросов" для исправления неправильных данных в таблице журналов документов. Обработка работает, цепляясь через ADO к серверу СУБД и напрямую изменяя там данные. Обработка используя методы 1с, такие как ПолучитьСтруктуруХраненияБазыДанных() определяет таблицы, в которых находятся неправильные данные, а также предлагает "для ознакомления" (из-за лицензионных ограничений 1с) тексты запросов для СУБД, которые бы могли бы исправить ситуацию. Сначала генерируется запрос для удаления строк, которые не совпадают с данными в основных таблицах документов, или вообще не должны быть в журнале (например, докумены другого вида, или удаленные из основной таблицы), потом для создания строк, которых не хватает в журнале (т.е. строк с правильными данными взамен удаленных на первом шаге, а также те, которые в принципе отсутствовали в журнале)

Из-за того, что используется ADO, работает только на windows (win-сервере или в неуправляемых формах), протестирована на MS SQL, однако учитывая то, что используются элементарные запросы вида "DELETE FR OM table WH ERE field = value" и "INS ERT INTO table (field) VALUES (val ue)" работать должна на любой СУБД. Данные для удаления и вставки получаются целиком срествами 1с, аналогично получению данных в отчете.

Так как политика 1с запрещает прямое изменение данных (но при этом предоставляет некоторую информацию о физическом размещении), обработка не делает никаких прямых запросов, а только показывает тексты запросов, которые бы сделали нужные действия.

ВНИМАНИЕ! Если вы (вдруг) решите использовать сгенерированные запросы, сначала протестируйте их на копии - ведь никто не застрахован от ошибок, вдруг я не учел какой-то случай, особенно если в базе активно используются разделители.

Журналы документов логическая целостность мистика

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    171893    962    403    

924

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14376    109    46    

108

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    17314    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    27305    96    48    

138

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11917    45    27    

67

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    191284    1152    0    

920

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18101    7    32    

42

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1136    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Danil.Potapov 517 19.08.13 19:08 Сейчас в теме
Наверное актуально для тех, у кого база работала еще на версии 8.1, там в каком-то релизе был ваг в работе журналов.
3. Fragster 1152 19.08.13 19:31 Сейчас в теме
(1) Dpotapov, в текущей базе нашлось 17 "кривых" документов, последний - июля этого года, хотя база на 8.2 работает уже больше года (правда режим совместимости 8.1 сняли совсем недавно).
2. kapustinag 19.08.13 19:22 Сейчас в теме
(0) Интересное совпадение по времени. Не далее как в субботу боролся с проблемой, которая, похоже, имеет схожие корни с описанными в данной статье.

Клиент-серверная 1С УПП 1.3.41.1, платформа 8.2.16.368, MS SQL 2005.

Ситуация:
- Пытаюсь удалить организацию, помеченную на удаление. Контроль возможности удаления выдает один документ "Требование-накладная", в котором есть ссылка на эту организацию. И еще одна ссылка в регистре сведений "Учетная политика по расчету з/п организаций". Всего две ссылки по всей базе;
- В самом документе ссылки на организацию нет (ни при открытии форм документа, ни при использовании "Инспектора объектов", консоли запросов и т.п.);
- нет ссылки на организацию и в движениях документа;
- в регистрах, по которым 1С не показывает наличие движений этого документа, но в которых "требование-накладная" входит в перечень документов-регистраторов - ссылки на организацию тоже нет.

Тестирование и исправление (контроль логической целостности) выполнил, но среди сообщений не было упоминания о данном документе. И ссылка на организацию по-прежнему как-бы есть.

Обошел проблему, так как время поджимало: создал новый документ копированием этого сбойного "требование-накладная", провел его, проверил идентичность движений, отменил проведение проблемного документа, пометил его на удаление, и он успешно удалился вместе с организацией. Такой обходной вариант, конечно, доступен далеко не всегда.
Попробую Ваш отчет на копии базы. Интересно все-же, где конкретно "сидит" эта невидимая ссылка.
4. Fragster 1152 19.08.13 19:33 Сейчас в теме
(2) kapustinag, будет интересно, если причина именно в кривой записи в журнале и логическая целостность не помогает... У меня просто нет возможности ТиИ делать на базе, по этому приходится извращаться, а так я думал, что оно помогает :)
5. kapustinag 19.08.13 19:42 Сейчас в теме
Да, вот еще что: "Редактор объекта БД (ИР)" из "мобильных инструментов разработчика" версии 2.82 при открытии данного "требования-накладной" выругался, но все-же открыл объект. Ошибка была "В поле введены некорректные данные. Отменить ввод?" - это я ввел номер документа в поле выбора.
Может быть, это означает несоответствие индекса по номеру документа реальным данным. Но переиндексирование я тоже сделал во время ТИИ, оно молча выполнилось, а проблема осталась.
6. kapustinag 19.08.13 21:05 Сейчас в теме
Запускал Ваш отчет на проблемной информационной базе. Устанавливал отбор по "Вид документа" содержит, или "Ссылка" равно, или "Дата" равно, или вообще без отборов - отчет выполнялся, в строке состояния менялись сообщения о проверке журналов и документов, и во всех вариантах получил одну и ту же ошибку:

Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{ВнешнийОтчет.ПроверкаЛогическойЦелостностиЖурналов.МодульОбъекта(158)}: Ошибка при вызове метода контекста (Выполнить)

по причине:
{(14, 6)}: Неоднозначное поле "Документы.Ссылка"
<<?>>Документы.Ссылка,

Причина нашлась: в конфигурации "Управление производственным предприятием", в документе "ОтменаСкидокНоменклатуры", есть табличная часть "Документы", а в запросе в процедуре ПолучитьТаблицуКривыхДокументов() использовался синоним "Документы", что и вызывало неоднозначность.
Если заменить в запросе синоним "Документы", например, на "ПроверяемыеДокументы" - ошибка устраняется.

К сожалению, отчет показал отсутствие расхождений между данными документов и журналов в проблемной базе. Ладно, будет время - покопаюсь еще.

Прикладываю файл - исправленный отчет (0).
Прикрепленные файлы:
ПроверкаЛогическойЦелостностиЖурналов_002испр.erf
Fragster; +1 Ответить
7. Fragster 1152 20.08.13 12:55 Сейчас в теме
(6) kapustinag, спасибо за замечание, поправил в публикации
8. hanio 58 21.08.13 12:24 Сейчас в теме
Отлично а теперь бы еще физическую целостность да и что-то взамен реструктуризации была бы вообще песня ))
9. Fragster 1152 22.08.13 17:40 Сейчас в теме
(8) hanio, Ну, про физическую целостность - это вряд-ли получится. А про реструктуризацию - мысли есть, просто требуют проработки. если востребовано - то готов сделать (по аналогии с текущей обработкой). Но там надо будет несколько больше кнопок жать, ибо программно определить, чем отличаются конфигурация БД от текущей конфигурации - вряд-ли возможно.
10. hanio 58 22.08.13 22:32 Сейчас в теме
Ну на Ваше усмотрение если не отнимет много времени и конечно желательно не переводить в платную вещь ))
11. mybracho 29.11.13 19:13 Сейчас в теме
{ВнешнийОтчет.ПроверкаЛогическойЦелостностиЖурналов.МодульОбъекта(158)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(14, 6)}: Неоднозначное поле "Документы.Ссылка"
<<?>>Документы.Ссылка,


Как быть ?
12. mybracho 29.11.13 19:13 Сейчас в теме
{ВнешнийОтчет.ПроверкаЛогическойЦелостностиЖурналов.МодульОбъекта(158)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(14, 6)}: Неоднозначное поле "Документы.Ссылка"
<<?>>Документы.Ссылка,
13. Fragster 1152 30.11.13 15:08 Сейчас в теме
(12) mybracho, в модуле отчета в процедуре "ПолучитьТаблицуКривыхДокументов" поменяйте запрос на что-нибудь типа

	ШаблонЗапроса = "ВЫБРАТЬ
	                |	Журнал.Ссылка,
	                |	Журнал.Дата,
	                |	Журнал.Номер,
	                |	Журнал.Проведен,
	                |	Журнал.ПометкаУдаления,
	                |	&_Графы
	                |ИЗ
	                |	&_Журнал КАК Журнал
	                |ГДЕ
	                |	&_УсловиеСсылки
	                |	И НЕ (Журнал.Ссылка, Журнал.Дата, Журнал.Номер, Журнал.Проведен, Журнал.ПометкаУдаления, &_Графы) В
	                |				(ВЫБРАТЬ
	                |					ПсевдонимТаблицыДокументы.Ссылка,
	                |					ПсевдонимТаблицыДокументы.Дата,
	                |					ПсевдонимТаблицыДокументы.Номер,
	                |					ПсевдонимТаблицыДокументы.Проведен,
	                |					ПсевдонимТаблицыДокументы.ПометкаУдаления,
	                |					&_РеквизитыГрафов
	                |				ИЗ
	                |					&_Документы КАК ПсевдонимТаблицыДокументы)
	                |
	                |ОБЪЕДИНИТЬ ВСЕ
	                |
	                |ВЫБРАТЬ
	                |	ПсевдонимТаблицыДокументы.Ссылка,
	                |	NULL,
	                |	NULL,
	                |	NULL,
	                |	NULL,
	                |	&_РеквизитыГрафов
	                |ИЗ
	                |	&_Документы КАК ПсевдонимТаблицыДокументы
	                |ГДЕ
	                |	НЕ (ПсевдонимТаблицыДокументы.Ссылка, ИСТИНА) В
	                |				(ВЫБРАТЬ
	                |					Журнал.Ссылка,
	                |					ИСТИНА
	                |				ИЗ
	                |					&_Журнал КАК Журнал)";
Показать


Ну а так - я не знаю, насколько правильно называть реквизит/табличную часть "документы". Это в типовой?
14. Fragster 1152 12.12.13 13:12 Сейчас в теме
(12) Обновил версию, теперь таблицы в этом запросе называются ТабПроверяемыйЖурнал и ТабПроверяемыеДокументы, что должно исключить ошибку "неоднозначное поле". Ну, конечно, если у вас нет реквизитов с таким именем.
15. xten 49 27.12.13 12:36 Сейчас в теме
Извиняюсь, это все дело для обычных форм или только для управляемых?
16. Fragster 1152 27.12.13 13:13 Сейчас в теме
17. xten 49 27.12.13 13:47 Сейчас в теме
ок, спасибо большое и с наступающим Новым Годом! ))
18. 3762515 27.11.15 15:59 Сейчас в теме
Не работает:
{ВнешняяОбработка.ИсправлениеЦелостностиЖурналов.МодульОбъекта(237)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(7, 85)}: Поле не найдено "ТабПроверяемыйЖурнал.Номер"
И НЕ (ТабПроверяемыйЖурнал.Ссылка, ТабПроверяемыйЖурнал.Дата, ТабПроверяемыйЖурнал.<<?>>Номер, ТабПроверяемыйЖурнал.Проведен, ТабПроверяемыйЖурнал.ПометкаУдаления, ИСТИНА, ТабПроверяемыйЖурнал.НалоговыйПериод, ТабПроверяемыйЖурнал.Организация, ТабПроверяемыйЖурнал.Ответственный, ТабПроверяемыйЖурнал.ПериодСоставления) В

Зря СМ только потратил:(
19. Fragster 1152 30.11.15 17:29 Сейчас в теме
(18) 3762515, такая ошибка может быть, если в каком-либо из журналов отсутствует графа "номер". Прошу прислать .cf для того, чтобы можно было бы сделать доработанную обработку.
Оставьте свое сообщение