При настройке обмена данными через Правила регистрации объектов (ПРО) периодически возникает задача гибкой фильтрации документов. Например, нужно проверить, по какой организации настроен отбор в конкретном узле плана обмена, и если у документа установлен определенный дополнительный реквизит (например, флаг Не выгружать в БП), отменить его регистрацию для данного узла, сохранив регистрацию для остальных.
Рассмотрим, как правильно реализовать такую логику в обработчиках событий правил регистрации объектов и на что обратить внимание при работе с массивом получателей.
В подсистеме обмена данными Библиотеки Стандартных Подсистем (БСП) при вызове правил регистрации формируется контекст, в котором доступна служебная коллекция Получатели. Это массив узлов планов обмена, претендующих на получение изменений записываемого объекта.
В обработчике Перед обработкой отказ от регистрации устанавливается глобально через параметр Отказ = Истина. Однако если требуется отменить регистрацию выборочно (только для некоторых узлов из списка), целесообразно перенести проверку в обработчик После обработки и скорректировать содержимое массива Получатели.
Разберем практический пример. Нам необходимо проверить отборы по организации для узлов типа СинхронизацияДанныхЧерезУниверсальныйФормат, сопоставить их с данными документа и удалить лишние узлы из массива Получатели.
Проанализируем следующий алгоритм реализации в обработчике После обработки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВложенныйЗапрос.Ссылка КАК ПланОбмена,
| ЕСТЬNULL(Таблица.Значение, ЛОЖЬ) КАК Значение
|ИЗ
| (ВЫБРАТЬ
| СинхронизацияДанныхЧерезУниверсальныйФорматОрганизации.Ссылка КАК Ссылка,
| СинхронизацияДанныхЧерезУниверсальныйФорматОрганизации.Организация КАК Организация
| ИЗ
| ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Организации КАК СинхронизацияДанныхЧерезУниверсальныйФорматОрганизации
| ГДЕ
| СинхронизацияДанныхЧерезУниверсальныйФорматОрганизации.Ссылка В(&МассивУзлов)
| И СинхронизацияДанныхЧерезУниверсальныйФорматОрганизации.Организация.ИНН = ""7701123456"") КАК ВложенныйЗапрос
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.ДополнительныеРеквизиты КАК Таблица
| ПО Док.Ссылка = Таблица.Ссылка
| И (Таблица.Свойство.Заголовок = ""Не выгружать в БП"")
| И (Док.Организация.ИНН = ""7701123456"")
| ПО (Док.Организация = ВложенныйЗапрос.Организация)
|ГДЕ
| Док.Ссылка = &Ссылка
| И Док.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо)
| И ЕСТЬNULL(Таблица.Значение, ЛОЖЬ) = Истина";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("МассивУзлов", Получатели);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Индекс = Получатели.Найти(Выборка.ПланОбмена);
Если Индекс <> Неопределено Тогда
Получатели.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
В данном примере запрос передает текущие узлы из массива Получатели в параметр &МассивУзлов, анализирует табличную часть Организации узла плана обмена и проверяет значение дополнительного реквизита в документе. Если условия для отмены регистрации выполняются, найденный узел удаляется из массива Получатели.
При использовании программной проверки правил регистрации важно учитывать особенности платформы и производительность системы:
Для, обход массива следует выполнять с конца к началу, либо собирать список исключаемых элементов во вспомогательный массив.ЛЕВОЕ СОЕДИНЕНИЕ и обращением к дополнительным реквизитам при каждой записи документа может снижать производительность. Передавайте условия по ИНН и свойствам через параметры запроса без обращения к реквизитам через точку.