При настройке нетиповых обменов данными между конфигурациями (например, между 1С:Зарплата и управление персоналом 3.1 и 1С:Управление производственным предприятием) часто возникает необходимость отсекать выгрузку устаревших, помеченных на удаление или неактуальных данных. Типичный пример — справочник ПодразделенияОрганизаций, в котором расформированные подразделения (Расформировано = Истина) не должны переноситься в базу-приемник.
Разберем подробно, почему фильтрация на уровне правил регистрации объектов (ПРО) может не срабатывать сразу, как правильно настроить отсечку в правилах конвертации (ПКО) и почему при отмене выгрузки объекты не «зависают» в очереди изменений плана обмена.
Самый быстрый и надежный способ исключить объект из выгрузки — перехватить его обработку непосредственно в обработчике события ПередВыгрузкой правила конвертации соответствующего справочника в конфигурации «Конвертация данных 2».
Рассмотрим пошагово реализацию данного подхода:
ПодразделенияОрганизаций.ПередВыгрузкой.
Если Источник.Расформировано = Истина Тогда
Отказ = Истина;
КонецЕсли;
Проанализируем, как работает этот механизм. Когда система начинает выгрузку зарегистрированных изменений, она считывает объект из базы-источника и передает его в обработчик. Переменная Отказ = Истина; сообщает процедуре выгрузки, что данный объект не нужно сериализовать в результирующий XML-пакет. Формирование узла объекта прерывается, и в файл попадают только актуальные элементы.
У многих разработчиков возникает резонный вопрос: если объект был зарегистрирован к обмену, но в момент выгрузки сработал Отказ = Истина;, не останется ли он в таблице регистрации изменений бесконечно?
Разберем внутренний механизм работы планов обмена платформы 1С:Предприятие 8:
Отказ = Истина данные в XML не записываются, однако платформа фиксирует, что попытка передачи данных в рамках сообщения № 45 была выполнена.ПланыОбмена.ЗарегистрироватьИзменения все записи, привязанные к этому номеру, включая те объекты, выгрузка которых была отменена в обработчике.Таким образом, «хвостов» в зарегистрированных изменениях не остается, если сеансы обмена проходят штатно с фиксацией квитанций.
Более академичный и производительный подход — предотвратить саму регистрацию изменений в базе, чтобы не создавать лишних записей в таблицах плана обмена. Для этого используются Правила регистрации объектов (ПРО).
Однако при настройке ПРО разработчики нередко сталкиваются с ситуацией, когда условие добавлено, но объект все равно регистрируется при записи. Выясним причины такого поведения и способы их устранения:
Авторегистрация должно быть установлено в значение Запретить. Если там стоит «Разрешить», регистрация выполняется на уровне платформы СУБД в обход правил БСП.Если требуется описать условие на встроенном языке в правилах регистрации, откроем правило регистрации для справочника ПодразделенияОрганизаций в Конвертации данных и перейдем в обработчик ПередОбработкой:
// Проверяем заполненность реквизита объекта
Если ЗначениеЗаполнено(Объект.Расформировано) И Объект.Расформировано = Истина Тогда
Отказ = Истина;
КонецЕсли;
Обратите внимание: в контексте обработчика ПередОбработкой параметр Объект представляет собой объектную сущность или ссылку, переданную из подписки на событие. Присвоение Отказ = Истина; отменяет запись в таблицу изменений только для текущего события.
Для создания отказоустойчивой системы обмена данными рекомендуется сочетать оба метода:
Отказ = Истина в событии ПередВыгрузкой, что гарантирует защиту от передачи нежелательных данных в случаях ручной регистрации изменений или связанных ссылочных выгрузок.