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

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

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

Механика работы платформы 1С при удалении записей

Проанализируем особенность архитектуры платформы: в регистрах сведений не существует отдельного типа объекта УдалениеОбъекта, как у справочников или документов. Физическое удаление данных независимого регистра сведений всегда выполняется путем записи пустого набора записей (где Количество() = 0) с установленным отбором по измерениям.

Даже если в коде вызывается метод МенеджерЗаписи.Удалить(), платформа транслирует его в процедуру очистки: создается и записывается пустой набор записей с отбором по всем измерениям. Кроме того, при записи с включенным замещением (Замещение = Истина) платформа сначала очищает записи по отбору в базе данных, а затем записывает новые.

Базовая проверка на пустой набор в событии ПередЗаписью

Для базового определения записи пустого набора в обработчике ПередЗаписью модуля набора записей достаточно проверить количество элементов в текущем объекте:


Процедура ПередЗаписью(Отказ, Замещение)
    
    Если Не ОбменДанными.Загрузка И ОбменДанными.Получатели.Автозаполнение Тогда
        
        ОбменДанными.Получатели.Очистить();
        
        // Выясняем, передается ли пустой набор записей
        УдалениеЗаписи = (ЭтотОбъект.Количество() = 0);
        
        Если ПараметрыСеанса.ЭтоУдаленнаяТочка Или УдалениеЗаписи Тогда
            ПланОбменаОбщие.ВключитьРегистрацию(ОбменДанными);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Точная проверка фактического удаления записей из базы данных

Проверки одного лишь условия ЭтотОбъект.Количество() = 0 не всегда достаточно. Если пустой набор записывается по отбору, для которого в базе данных и без того нет записей, фактического удаления данных не происходит. Чтобы точно определить, существовали ли данные в базе до вызова текущей операции, разберем следующий алгоритм:

  1. Проверяем условие, что записываемый набор записей пуст (ЭтотОбъект.Количество() = 0).
  2. Если набор пуст, с помощью запроса обращаемся к физической таблице регистра сведений в базе данных с условием по измерениям из ЭтотОбъект.Отбор.
  3. Если запрос возвращает существующие записи, значит, происходит **реальное удаление** имеющихся данных из базы.
  4. Если запрос к БД пуст, то операция записи пустого набора не приводит к фактическому изменению данных.

Альтернативные подходы и передача контекста

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

1. Использование коллекции ДополнительныеСвойства

Если процедура очистки или удаления вызывается из внешнего алгоритма программно, можно передать флаг-признак напрямую в набор записей: НаборЗаписей.ДополнительныеСвойства.Вставить("ПричинаЗаписи", "Удаление"). В событии ПередЗаписью этот параметр легко считывается и учитывается в бизнес-логике.

2. Сохранение состояния для сравнения

При необходимости сравнить удаляемые или изменяемые данные (например, для детального логирования) в обработчике ПередЗаписью считываются текущие записи из БД и сохраняются в ДополнительныеСвойства. Затем в событии ПриЗаписи вы можете сопоставить сохраненные данные с итоговым состоянием набора.

← На главную