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

12.12.13

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

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

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

Скачать файлы

Наименование Файл Версия Размер
ПроверкаЛогическойЦелостностиЖурналов
.erf 8,87Kb
48
.erf 003 8,87Kb 48 Скачать
ИсправлениеЛогическойЦелостностиЖурналов
.epf 12,83Kb
26
.epf 12,83Kb 26 Скачать

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

Причиной является расхождение данных в основной таблице документа _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с запрещает прямое изменение данных (но при этом предоставляет некоторую информацию о физическом размещении), обработка не делает никаких прямых запросов, а только показывает тексты запросов, которые бы сделали нужные действия.

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

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119967    656    389    

701

Infostart PrintWizard

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

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

18000 руб.

06.10.2023    7018    20    6    

37

Infostart УДиФ: Управление данными и формами

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

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

10000 руб.

10.11.2023    3253    10    1    

31

SALE! 30%

PowerTools

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

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

3600 2520 руб.

14.01.2013    177356    1071    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99207    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17921    6    8    

38

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27949    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23494    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Danil.Potapov 514 19.08.13 19:08 Сейчас в теме
Наверное актуально для тех, у кого база работала еще на версии 8.1, там в каком-то релизе был ваг в работе журналов.
3. Fragster 1137 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 1137 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 1137 20.08.13 12:55 Сейчас в теме
(6) kapustinag, спасибо за замечание, поправил в публикации
8. hanio 54 21.08.13 12:24 Сейчас в теме
Отлично а теперь бы еще физическую целостность да и что-то взамен реструктуризации была бы вообще песня ))
9. Fragster 1137 22.08.13 17:40 Сейчас в теме
(8) hanio, Ну, про физическую целостность - это вряд-ли получится. А про реструктуризацию - мысли есть, просто требуют проработки. если востребовано - то готов сделать (по аналогии с текущей обработкой). Но там надо будет несколько больше кнопок жать, ибо программно определить, чем отличаются конфигурация БД от текущей конфигурации - вряд-ли возможно.
10. hanio 54 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 1137 30.11.13 15:08 Сейчас в теме
(12) mybracho, в модуле отчета в процедуре "ПолучитьТаблицуКривыхДокументов" поменяйте запрос на что-нибудь типа

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


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

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