При разработке механизмов обмена данными и регистрации изменений часто возникает необходимость определить момент, когда происходит удаление записей независимого или подчиненного регистра сведений. Рассмотрим, как устроена механика работы платформы 1С при очистке регистров и как правильно обработать этот момент в событии ПередЗаписью модуля набора записей.
Проанализируем особенность архитектуры платформы: в регистрах сведений не существует отдельного типа объекта УдалениеОбъекта, как у справочников или документов. Физическое удаление данных независимого регистра сведений всегда выполняется путем записи пустого набора записей (где Количество() = 0) с установленным отбором по измерениям.
Даже если в коде вызывается метод МенеджерЗаписи.Удалить(), платформа транслирует его в процедуру очистки: создается и записывается пустой набор записей с отбором по всем измерениям. Кроме того, при записи с включенным замещением (Замещение = Истина) платформа сначала очищает записи по отбору в базе данных, а затем записывает новые.
Для базового определения записи пустого набора в обработчике ПередЗаписью модуля набора записей достаточно проверить количество элементов в текущем объекте:
Процедура ПередЗаписью(Отказ, Замещение)
Если Не ОбменДанными.Загрузка И ОбменДанными.Получатели.Автозаполнение Тогда
ОбменДанными.Получатели.Очистить();
// Выясняем, передается ли пустой набор записей
УдалениеЗаписи = (ЭтотОбъект.Количество() = 0);
Если ПараметрыСеанса.ЭтоУдаленнаяТочка Или УдалениеЗаписи Тогда
ПланОбменаОбщие.ВключитьРегистрацию(ОбменДанными);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проверки одного лишь условия ЭтотОбъект.Количество() = 0 не всегда достаточно. Если пустой набор записывается по отбору, для которого в базе данных и без того нет записей, фактического удаления данных не происходит. Чтобы точно определить, существовали ли данные в базе до вызова текущей операции, разберем следующий алгоритм:
ЭтотОбъект.Количество() = 0).ЭтотОбъект.Отбор.Посмотрим на дополнительные способы управления логикой записи и регистрации изменений:
1. Использование коллекции ДополнительныеСвойства
Если процедура очистки или удаления вызывается из внешнего алгоритма программно, можно передать флаг-признак напрямую в набор записей: НаборЗаписей.ДополнительныеСвойства.Вставить("ПричинаЗаписи", "Удаление"). В событии ПередЗаписью этот параметр легко считывается и учитывается в бизнес-логике.
2. Сохранение состояния для сравнения
При необходимости сравнить удаляемые или изменяемые данные (например, для детального логирования) в обработчике ПередЗаписью считываются текущие записи из БД и сохраняются в ДополнительныеСвойства. Затем в событии ПриЗаписи вы можете сопоставить сохраненные данные с итоговым состоянием набора.