В современных конфигурациях на базе 1С:ERP Управление предприятием 2 и Комплексная автоматизация 2 технические специалисты часто сталкиваются с парадоксальной ситуацией: документ помечен на удаление (иконка в списке изменилась), однако он продолжает делать движения по регистрам накопления, влиять на остатки, расчет себестоимости и отчеты. Рассмотрим подробнее, почему так происходит, проанализируем внутренние механизмы системы и выясним, как гарантированно очистить «фантомные» записи.
Проанализируем базовые настройки метаданных. В типовых решениях ERP для большинства документов в свойстве «Удаление движений» выбрано значение Удалять автоматически при отмене проведения. Это фундаментальный момент. Платформа 1С:Предприятие 8.3 разделяет понятия «отмена проведения» и «пометка на удаление». Если вы просто присваиваете реквизиту документа значение Истина через код, автоматическая очистка движений может не сработать.
Разберем пример некорректного кода, который часто становится причиной проблемы:
// ОШИБОЧНЫЙ ВАРИАНТ
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДок.ПометкаУдаления = Истина;
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
В данном случае мы просто записали объект в режиме обычной записи. Платформа видит изменение реквизита, но статус Проведен при этом может формально остаться (хотя визуально пометка удаления его перекрывает), и триггер на удаление движений не срабатывает. — решается через инструмент исправления движений у непроведенных документов.
Как правильно: Для корректной обработки всегда используйте штатный метод УстановитьПометкуУдаления(). Рассмотрим правильный подход:
// КОРРЕКТНЫЙ ВАРИАНТ
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДок.УстановитьПометкуУдаления(Истина);
Этот метод внутри себя инициирует транзакцию, которая сначала выполняет отмену проведения (с очисткой движений согласно свойству метаданных), а затем устанавливает пометку на удаление.
Выясним, как на ситуацию влияют регламентные операции. В ERP существует сложная система отложенного проведения и фонового формирования движений. Когда вы нажимаете «Провести», документ может записать только оперативные движения (например, по регистру Товары на складах), а финансовые движения и записи по партиям формируются позже специальным заданием «Расчет себестоимости» или «Формирование движений по партиям».
Рассмотрим ситуацию:
Себестоимость товаров или Выручка и себестоимость продаж уже после того, как пометка удаления была установлена. В итоге мы получаем помеченный документ с актуальными финансовыми движениями.
Проанализируем ситуацию, возникающую при синхронизации данных. Если документ прилетает из другой базы (например, из «Бухгалтерии предприятия» или через «Универсальный обмен данными»), часто используется флаг ОбменДанными.Загрузка = Истина.
В этом режиме платформа отключает большинство проверок и стандартных обработчиков событий (включая процедуру ОбработкаУдаленияПроведения). Если в файле обмена объект идет с пометкой на удаление, 1С просто записывает его «как есть». Если в текущей базе документ был проведен, движения останутся нетронутыми, так как логика очистки была проигнорирована ради скорости загрузки.
Решение для разработчика: При загрузке помеченных на удаление объектов через DataExchange, необходимо либо временно отключать флаг загрузки для таких объектов, либо явно вызывать процедуру очистки движений. Посмотрим на пример кода в обработчике обмена:
Если Объект.ПометкаУдаления И Объект.Проведен Тогда
Объект.ОбменДанными.Загрузка = Ложь;
Объект.УстановитьПометкуУдаления(Истина);
Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Если в базе уже накопилось много документов с «фантомными» движениями, рассмотрим, как написать универсальную обработку для исправления, используя примеры корректировки записей регистра. Нам нужно принудительно очистить наборы записей всех регистров, где данный документ является регистратором. Для этой задачи есть обработка для поиска и удаления лишних данных в регистрах.
Разберем алгоритм по шагам:
Пример кода обработки:
Процедура ОчиститьДвиженияПомеченных(ДокументСсылка)
ОбъектДок = ДокументСсылка.ПолучитьОбъект();
// Проходим по всем регистрам, которые может двигать документ
Для Каждого Движение Из ОбъектДок.Движения Цикл
// Создаем пустой набор записей
Набор = Движения[Движение.Метаданные().Имя];
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
// Записываем пустой набор, тем самым удаляя старые записи
Набор.Записать(Истина);
КонецЦикла;
// Дополнительно сбрасываем флаг проведенности, если он остался
Если ОбъектДок.Проведен Тогда
ОбъектДок.Проведен = Ложь;
ОбъектДок.ОбменДанными.Загрузка = Истина; // Чтобы не вызывать лишних проверок при записи
ОбъектДок.Записать();
КонецЕсли;
КонецПроцедуры
Чтобы минимизировать появление подобных ошибок в будущем, рекомендуем придерживаться следующих правил:
ПометкаУдаления простым присваиванием в коде. Метод УстановитьПометкуУдаления(Истина) — единственный безопасный путь.Подводя итог, можно сказать, что в ERP 2 появление движений у помеченных объектов — это чаще всего результат некорректного программного вмешательства или прерывания транзакций фоновыми процессами — поможет диагностика и принудительная очистка записей в регистрах. Использование стандартных процедур 1С и понимание механизмов отложенного проведения позволяет полностью исключить эти ошибки.