Как пометить документ на удаление в 1С и сохранить его движения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Программное управление записью объекта

Если вам необходимо пометить документ на удаление программно, используя изменение недоступных реквизитов объекта, и при этом предотвратить штатное срабатывание механизма удаления движений, можно воспользоваться режимом ОбменДанными.Загрузка. Рассмотрим этот способ подробнее.

При установке свойства ОбменДанными.Загрузка = Истина, платформа перестает выполнять стандартные проверки и обработчики, связанные с проведением или отменой проведения документа. Это позволяет записать объект в базу данных, сохранив текущее состояние движений.

Код для реализации данного подхода или редактирования движений в универсальном менеджере выглядит следующим образом:


Док = Документы.НайтиПоСсылке(СсылкаНаДокумент);
Объект = Док.ПолучитьОбъект();
Объект.ПометкаУдаления = Истина;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();

Важное предупреждение: Использование данного метода требует максимальной осторожности (рекомендуется заранее предусмотреть откат группового изменения реквизитов). Вы пропускаете всю бизнес-логику и проверки, которые заложены в стандартные процедуры ОбработкаУдаленияПроведения или ОбработкаПроведения. В результате в базе могут появиться «фантомные» записи, которые не соответствуют актуальному состоянию учета.

Метод 2: Настройка режима записи движений

В конфигураторе для каждого регистра можно изменить свойство Режим записи или использовать редактор объектов информационной базы для ручной правки. Если установить значение Не удалять автоматически, платформа перестанет принудительно очищать движения при снятии документа с проведения.

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

Метод 3: Использование документа «Корректировка регистров»

Это самый правильный с точки зрения архитектуры способ, который повсеместно используется в типовых конфигурациях (например, в БП 3.0, УТ 11 или ERP). Вместо того чтобы пытаться «сломать» логику работы основного документа, мы действуем следующим образом:

  1. Помечаем основной документ на удаление штатным образом.
  2. Полностью очищаем движения этого документа (чтобы не дублировать данные).
  3. Создаем документ Корректировка регистров (или его аналог), куда переносим все необходимые записи, которые должны остаться в учете.

Этот метод гарантирует целостность данных и чистоту индексов базы, так как движения теперь принадлежат объекту, который предназначен именно для этой цели. В типовых конфигурациях функционал Ручная корректировка движений работает именно по такому принципу.

Риски и последствия

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

1. Недостоверная отчетность: Отчеты по остаткам будут показывать данные, не подтвержденные активными документами, что затруднит сверку данных.

2. Ошибки закрытия периода: Механизмы регламентных операций (расчет себестоимости, закрытие месяца) часто проверяют статус проведения документов. Наличие «повисших» движений может вызвать исключения при расчетах.

3. Повреждение индексов: Частая практика «вредительства» через обход стандартных механизмов приводит к тому, что индексы таблиц регистров становятся фрагментированными и неактуальными, что требует вмешательства администратора базы данных.

В заключение: если ваша задача — сохранить историю, лучше всего использовать Корректировку регистров. Если же вы программно управляете пометкой удаления, всегда держите в уме необходимость последующей очистки движений через ОбменДанными.Загрузка или явное удаление наборов записей, чтобы ваша база оставалась целостной и быстрой.

← На главную