Ситуация, при которой в информационной базе обнаруживаются непроведенные документы с заполненными и активными движениями по регистрам бухгалтерии или накопления, встречается достаточно часто. Такие документы искажают оборотно-сальдовую ведомость и расчетные остатки, так как платформенные виртуальные таблицы формируют итоги на основании поля Регистратор и признака Активность, совершенно не проверяя реквизит Проведен самого документа. Выясним причину этой проблемы и рассмотрим по шагам методы её устранения.
Проанализируем основные факторы, приводящие к рассинхронизации статуса документа и записей в регистрах:
ОбменДанными.Загрузка = Истина): когда сторонний обмен или разработчик в коде устанавливает свойство ОбменДанными.Загрузка в значение Истина, платформа полностью отключает прикладные проверки, обработчики событий проведения и автоматическую очистку движений при записи объекта.ДокументОбъект.Проведен = Ложь и записать объект в обычном режиме РежимЗаписиДокумента.Запись, процедура ОбработкаУдаленияПроведения не сработает, и движения сохранятся.Важно помнить: стандартная процедура «Тестирование и исправление» проверяет только наличие физической ссылки в поле Регистратор. Если документ существует в базе (пусть даже непроведенный), тестирование не сочтет проводки ошибочными и не удалит их.
Для обнаружения проблемных документов выполним запрос к регистру бухгалтерии, связав его с таблицей документа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Хозрасчетный.Регистратор КАК Регистратор
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
| И НЕ Хозрасчетный.Регистратор.Проведен";
Результат = Запрос.Выполнить().Выгрузить();
Если непроведенный документ не должен влиять на учет, наиболее безопасным и быстрым способом является очистка набора записей без вызова тяжелых прикладных обработчиков документа:
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Запись пустого набора очищает движения в базе данных
НаборЗаписей.Записать();
Этот метод не изменяет версию самого объекта документа и предотвращает лишнюю регистрацию изменений в планах обмена.
Если необходимо, чтобы сработали все прикладные механизмы конфигурации, используем стандартную отмену проведения:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Обратите внимание: этот вариант модифицирует документ, обновляет дату его изменения и вызовет повторную отправку объекта в узлы РИБ.
Если удалять строки нельзя (например, требуется сохранить исторические данные для сверки или аудита), можно отключить признак Активность. Проводки останутся в базе, но перестанут влиять на отчеты и остатки:
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Активность = Ложь;
КонецЦикла;
НаборЗаписей.Записать();
Бывают ситуации, когда проводки верны и соответствуют закрытому периоду, но сам документ ошибочно числится непроведенным. В этом случае документ переводят в статус проведенного без повторного пересчета сумм:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Проведен = Истина;
// Записываем только шапку документа без вызова обработчиков проведения
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
После применения любого из выбранных вариантов обязательно сформируйте оборотно-сальдовую ведомость за проблемный период, чтобы убедиться в восстановлении корректности учетных данных.