При настройке обмена данными между информационными базами с помощью конфигурации «Конвертация данных 2.0» нередко возникает задача разделения потоков документов. Типичный пример: из одной центральной базы (например, конфигурации для сельского хозяйства) выгружаются документы сразу в несколько удаленных баз-приемников (например, разные весовые пункты). Чтобы объект загружался только в ту базу, которой он предназначен, разработчики часто добавляют в приемники разделяющие константы и пытаются сопоставить их со свойствами загружаемого документа.
Однако при попытке написать проверку в правилах конвертации объектов (ПКО) новички часто сталкиваются с ситуацией, когда код не отрабатывает, а отмена загрузки игнорируется. Разберем по шагам, почему возникает эта ошибка и как правильно реализовать фильтрацию данных.
Рассмотрим фрагмент кода, который разработчики нередко пытаются поместить в обработчик события При загрузке:
Значение = Константы.ЭтоВесоваяРаздолье.Получить();
Если Не Значение = Приемник.ЭтоВесоваяРаздолье Тогда
Отказ = Истина;
КонецЕсли;
Выясним причину, почему такая конструкция не работает:
Источник и Приемник доступны исключительно на стороне выгрузки данных. На стороне загрузки создаваемый или найденный элемент доступен через переменную Объект.Отказ в обработчике «При загрузке»: в данном событии платформа не предоставляет параметр отмены. Присваивание значения переменной Отказ просто создает локальную переменную внутри процедуры, которая никак не влияет на дальнейший процесс импорта. Кроме того, само событие срабатывает сразу после попытки поиска объекта, когда входящие свойства из XML-файла еще не перенесены в реквизиты.Отказ здесь доступен, сам Объект еще не инициализирован, а доступ к его реквизитам напрямую невозможен без низкоуровневого парсинга XML-потока.Наиболее правильным и штатным местом для подобной валидации на стороне базы-приемника является обработчик После загрузки. На этом этапе значения реквизитов из файла обмена уже прочитаны и помещены в контекстную переменную Объект, но сам объект еще не записан в информационную базу. Здесь разработчику доступен параметр Отказ.
Если реквизит ЭтоВесоваяРаздолье переносится штатно через правило конвертации свойства (ПКС), код обработчика После загрузки в ПКО будет выглядеть следующим образом:
ЗначениеКонстанты = Константы.ЭтоВесоваяРаздолье.Получить();
Если ЗначениеКонстанты <> Объект.ЭтоВесоваяРаздолье Тогда
Отказ = Истина;
КонецЕсли;
При установке флага Отказ = Истина текущий документ не будет сохранен в базе-приемнике.
Иногда нет необходимости добавлять отдельный реквизит в документ базы-приемника или требуется выполнить проверку до того, как реквизиты будут записаны в структуру объекта. В таком случае значение передается через специальный механизм параметров.
Разберем реализацию этого способа по шагам:
ЭтоВесоваяРаздолье.ПараметрыОбъекта, представляющей собой Соответствие:
Если ПараметрыОбъекта <> Неопределено Тогда
ЗначениеФлага = ПараметрыОбъекта["ЭтоВесоваяРаздолье"];
Если ЗначениеФлага <> Константы.ЭтоВесоваяРаздолье.Получить() Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Обратите внимание: коллекция ПараметрыОбъекта доступна только в обработчиках Поля поиска и После загрузки. В событиях Перед загрузкой и При загрузке она равна значению Неопределено.
Хотя отмена записи в базе-приемнике решает функциональную задачу, с точки зрения архитектуры она создает лишнюю нагрузку: источник тратит ресурсы на сериализацию данных в XML, файл передается по каналам связи, а приемник разбирает весь поток, чтобы в итоге отказаться от записи.
Проанализируем более производительное решение — отсекать ненужные документы еще на этапе выгрузки:
Если Не Источник.ЭтоВесоваяРаздолье Тогда
Отказ = Истина;
КонецЕсли;
ПередЗаписьюДокумента, чтобы документ регистрировался к выгрузке только на соответствующем узле.Применяя Отказ = Истина на стороне приемника, важно помнить о следующих нюансах:
Если в том же файле обмена передаются другие связанные данные (например, движения регистров или подчиненные документы, ссылающиеся на отменяемый объект), отмена записи документа может привести к появлению ссылок-«пустышек» (битых ссылок), если для объекта включена синхронизация по уникальному идентификатору (GUID).
Кроме того, если обмен настроен в конфигурациях на базе БСП (Библиотеки стандартных подсистем), исполняемый код обработчиков загрузки берется из правил, хранящихся внутри базы-приемника. Поэтому после корректировки обработчиков После загрузки в «Конвертации данных» обновленные правила необходимо обязательно загрузить в саму базу-приемник.