В практике сопровождения баз данных 1С (особенно в файловом формате DBF на платформе 1С 7.7) периодически возникает ситуация, когда документ визуально отображается в журнале как проведенный (установлен соответствующий флаг), однако при формировании отчетов данные по нему отсутствуют. При ручном перепроведении документ сразу попадает в отчет. Разберем по шагам, почему возникает такое расхождение и как обнаружить и устранить подобные ошибки в конфигурации.
В базе данных 1С признак проведения документа хранится как отдельное поле в таблице журнала документов (1SJOURN). Сами движения регистров записываются в отдельные таблицы движений (RA*.DBF) и итогов (RG*.DBF). Связь между ними обеспечивает встроенный язык платформы и логика конфигурации. Если в процессе работы программы или записи объекта произошел сбой, признак проведения может остаться установленным, даже если в таблицах регистров строки отсутствуют или были очищены.
Проанализируем распространенную ситуацию: пользователь провел документ (например, с пустой табличной частью или с одними данными), затем открыл форму, внес изменения или добавил строки и нажал кнопку сохранения вместо проведения.
Процедура ПриОткрытии()
// Принудительно перепроводить документ при записи, если он уже проведен
ПриЗаписиПерепроводить(1);
КонецПроцедуры
Выясним причину возможного отсутствия движений непосредственно в коде процедуры ОбработкаПроведения:
Возврат; до блока формирования регистровых записей. Если условие срабатывает, алгоритм прекращает работу, не вызывая очистку флага проведения или отмену транзакции.Регистр.ИмяРегистра.Остаток(...) без учета позиции документа, при проведении задним числом остаток может определиться как нулевой, и цикл создания движений просто будет пропущен.В сетевом файловом режиме при аварийном завершении работы программы или сбоях сети табличные файлы и индексы могут рассинхронизироваться. Повреждение индексных файлов (*.CDX) приводит к тому, что запросы и выборки отчетов перестают видеть существующие записи регистров.
Для устранения этой проблемы выполним регламентные действия:
*.CDX и запустить 1С Предприятие в монопольном режиме для автоматического перестроения индексов.Посмотрим на пример обработки для автоматического поиска всех проведенных накладных, у которых отсутствуют движения по регистру:
Процедура НайтиДокументыБезДвижений()
Перем Док, Рег;
Док = СоздатьОбъект("Документ.Накладная");
Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Проведен() = 1 Тогда
// Проверяем наличие движений по документу в регистре
Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
Если Рег.ПолучитьДвижение() = 0 Тогда
Сообщить("Документ без движений: " + глПредставлениеДокумента(Док.ТекущийДокумент()) +
" от " + Док.ДатаДок);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После выявления проблемных документов достаточно выполнить их групповое перепроведение в хронологическом порядке для восстановления корректных движений и остатков по регистрам.