В практике работы с 1С:ERP специалисты нередко сталкиваются с аномальной ситуацией: документ помечен пользователем на удаление (на иконке стоит характерный «красный крестик»), однако в отчетах по-прежнему видны его движения, а в регистре бухгалтерии сохраняются проводки. В типовой логике системы 1С установка пометки удаления должна автоматически приводить к очистке всех связанных движений. Рассмотрим детально, почему этот механизм может давать сбой и как эффективно решить данную проблему. Для оперативного исправления подобных ошибок вручную можно использовать обработку для выборочного удаления проводок документов.
Проанализируем наиболее частую причину — некорректное программное изменение объекта. В платформе 1С существует специальное свойство ОбменДанными.Загрузка. Если сторонний разработчик или внешняя обработка меняет статус документа, устанавливая этот флаг в значение Истина, система отключает практически все стандартные проверки и обработчики событий, включая механизм автоматической очистки движений при пометке на удаление.
Разберем пример кода, который приводит к возникновению ошибки:
// Пример некорректной пометки на удаление
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДок.ПометкаУдаления = Истина;
ОбъектДок.ОбменДанными.Загрузка = Истина; // Отключает системные механизмы очистки
ОбъектДок.Записать();
В этом случае платформа «доверяет» источнику данных и записывает только изменения в заголовке документа (таблице Header), не инициируя удаление строк из подчиненных регистров. Чтобы избежать этого, программист должен либо явно вызвать метод УдалитьДвижения(), либо не использовать режим загрузки без крайней необходимости.
Выясним, как действия администратора могут повлиять на целостность данных. Стандартная обработка «Групповое изменение реквизитов» имеет скрытые настройки. Если в меню «Дополнительные параметры» включен флаг «Выполнять в режиме загрузки», то при массовой установке пометки удаления на документы возникнет та же проблема, что и в программном коде выше. Проводки останутся в системе, так как типовые процедуры ПередЗаписью и ПриЗаписи, отвечающие за очистку регистров, будут проигнорированы.
В 1С:ERP механизмы управленческого и регламентированного учета зачастую разделены. Проанализируем ситуацию с регистром сведений Отражение документов в регл учете. Проводки в ERP часто формируются не в момент нажатия кнопки «Провести и закрыть», а отложенно — фоновым заданием или через специальное рабочее место.
Рассмотрим сценарий возникновения «записей-сирот»:
Также стоит проверить состояние регистра Отражение документов в регл учете. Если запись в нем осталась в статусе «К отражению» или «Отражено», система может ошибочно удерживать движения.
Посмотрим на работу регистра Взаиморасчеты по документам. В современных версиях ERP движения по этому регистру могут формироваться отложенным заданием. Если документ был проведен, а затем мгновенно помечен на удаление до того, как задание по расчету взаиморасчетов завершило свою работу, возможна десинхронизация данных. Система видит помеченный документ, но задание по расчету может «дозаписать» движения, основываясь на данных, которые были актуальны на момент старта транзакции.
Проанализируем влияние кастомизации системы. В 1С существуют регистры, которые не подчинены документу-регистратору напрямую (режим записи «Независимый»). Если в конфигурации или расширении написан код, который при проведении делает записи в такой регистр, разработчик обязан вручную прописать процедуру удаления этих записей при отмене проведения или пометке удаления. Если этого не сделать, данные в независимом регистре станут «вечными» и не исчезнут при установке «крестика» на документе.
Никогда не полагайтесь только на слова пользователей. Выясним истинную последовательность событий с помощью Журнала регистрации. Нам необходимо выполнить следующие шаги:
Рассмотрим пошагово, как устранить «фантомные» движения и проводки в закрытом или открытом периоде:
Выборка = Документы.АктВыполненныхРабот.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления И Выборка.Движения.Количество() > 0 Тогда
Объект = Выборка.ПолучитьОбъект();
// Принудительно очищаем наборы записей
Для Каждого Набор Из Объект.Движения Цикл
Набор.Очистить();
Набор.Записать();
КонецЦикла;
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
КонецЦикла;
Важное замечание для бухгалтера: Если ошибка обнаружена в закрытом периоде, простое удаление проводок может привести к искажению отчетности. В 1С:ERP сначала проанализируйте, не повлияет ли очистка «забытых» проводок на финансовый результат прошлых месяцев. В случае необходимости используйте документ «Корректировка регистров» для исправления ситуации в текущем периоде. Для упрощения этого процесса можно задействовать расширение для сторнирования и корректировки движений по любому документу.
Подводя итог, можно сказать, что «фантомные» проводки — это почти всегда результат либо прерывания транзакции фонового задания, либо использования некорректного программного кода (режим загрузки). Регулярная проверка отчетов сверки учета позволит вовремя обнаруживать такие инциденты и поддерживать чистоту информационной базы. Если данные импортируются из другой системы, выявлять расхождения после выполнения обмена удобнее через автоматическую сверку проводок между базами 1С.