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

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

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

Рассмотрим подробнее, почему это происходит, какими методами можно добиться сохранения движений и какие риски несет в себе подобное решение.

Механика работы платформы при удалении

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

Способ 1: Использование флага ОбменДанными.Загрузка

Разберем самый эффективный программный способ, который позволяет «обмануть» стандартные механизмы конфигурации. При установке свойства ОбменДанными.Загрузка в значение Истина, платформа отключает выполнение большинства прикладных проверок и обработчиков событий в модулях объектов и подписках.

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


// Получаем объект документа по ссылке
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();

// Устанавливаем признак пометки на удаление
ОбъектДокумента.ПометкаУдаления = Истина;

// Важный момент: документ перестает быть проведенным в данных заголовка,
// но мы не вызываем процедуру отмены проведения
ОбъектДокумента.Проведен = Ложь;

// Включаем режим загрузки данных, чтобы пропустить типовые механизмы очистки движений
ОбъектДокумента.ОбменДанными.Загрузка = Истина;

Попытка
    // Записываем объект в режиме записи (не проведения!)
    ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ помечен на удаление, движения сохранены.");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

В данном сценарии мы используем РежимЗаписиДокумента.Запись. Поскольку установлен флаг Загрузка = Истина, код в подписках на события, который обычно отвечает за удаление записей из регистров, не будет выполнен. Движения останутся в базе данных «зависшими» за этим документом.

Способ 2: Использование свойства Активность движений

Выясним причину, по которой иногда движения нужно оставить, но сделать их «невидимыми» для отчетов. В системе 1С у каждой записи регистра есть свойство Активность. Если Активность = Ложь, записи физически присутствуют в таблице БД, но не участвуют в расчете итогов и не отображаются в стандартных отчетах.

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


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

// Проходим по всем наборам записей (движениям) документа
Для Каждого НаборЗаписей Из ОбъектДокумента.Движения Цикл
    НаборЗаписей.Прочитать();
    Для Каждого Запись Из НаборЗаписей Цикл
        Запись.Активность = Ложь; // Делаем движения неактивными
    КонецЦикла;
    НаборЗаписей.Записывать = Истина;
КонецЦикла;

ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);

Способ 3: Ручная корректировка движений

Проанализируем ситуацию, когда в документе включен флаг РучнаяКорректировка. В многих типовых решениях (например, в Бухгалтерии предприятия), если пользователь установил признак ручной правки движений, система перестает автоматически управлять наборами записей при перепроведении или отмене проведения. Если программно установить этот флаг и пометить документ на удаление, в некоторых конфигурациях движения могут сохраниться автоматически, так как система «боится» удалить то, что пользователь правил руками.

Контекст проблемы: Чек ККМ и льготные рецепты

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

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

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

Проанализируем, к чему может привести наличие движений у удаленного документа:

  1. Расхождения в отчетах: Ведомость по товарам на складах покажет списание, но при попытке найти документ-основание пользователь увидит «перечеркнутый» объект, что вызовет недоумение.
  2. Проблемы с удалением объектов: Стандартная обработка Удаление помеченных объектов не сможет окончательно удалить такой документ, так как обнаружит ссылки на него в регистрах (те самые движения, которые мы оставили).
  3. Сбои при закрытии месяца: Регламентные операции по восстановлению последовательностей и расчету себестоимости могут игнорировать такие документы или выдавать ошибки при попытке обращения к их данным.

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

← На главную