Как определить отбор по организации и отменить регистрацию для определенных узлов в Правилах регистрации объектов 1С?

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

При настройке обмена данными через Правила регистрации объектов (ПРО) периодически возникает задача гибкой фильтрации документов. Например, нужно проверить, по какой организации настроен отбор в конкретном узле плана обмена, и если у документа установлен определенный дополнительный реквизит (например, флаг Не выгружать в БП), отменить его регистрацию для данного узла, сохранив регистрацию для остальных.

Рассмотрим, как правильно реализовать такую логику в обработчиках событий правил регистрации объектов и на что обратить внимание при работе с массивом получателей.

Анализ механизмов регистрации объектов

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

В обработчике Перед обработкой отказ от регистрации устанавливается глобально через параметр Отказ = Истина. Однако если требуется отменить регистрацию выборочно (только для некоторых узлов из списка), целесообразно перенести проверку в обработчик После обработки и скорректировать содержимое массива Получатели.

Решение: Фильтрация узлов в обработчике "После обработки"

Разберем практический пример. Нам необходимо проверить отборы по организации для узлов типа СинхронизацияДанныхЧерезУниверсальныйФормат, сопоставить их с данными документа и удалить лишние узлы из массива Получатели.

Проанализируем следующий алгоритм реализации в обработчике После обработки:


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

Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("МассивУзлов", Получатели);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Индекс = Получатели.Найти(Выборка.ПланОбмена);
	Если Индекс <> Неопределено Тогда
		Получатели.Удалить(Индекс);
	КонецЕсли;
КонецЦикла;

В данном примере запрос передает текущие узлы из массива Получатели в параметр &МассивУзлов, анализирует табличную часть Организации узла плана обмена и проверяет значение дополнительного реквизита в документе. Если условия для отмены регистрации выполняются, найденный узел удаляется из массива Получатели.

Рекомендации по оптимизации и безопасности кода

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

  1. Оптимизация обхода массивов: При прямом поиске и удалении элементов из массива во время итераций рекомендуется соблюдать осторожность. Если элементы исключаются по индексу в цикле Для, обход массива следует выполнять с конца к началу, либо собирать список исключаемых элементов во вспомогательный массив.
  2. Влияние на скорость проведения: Обработчики правил регистрации вызываются непосредвственно в транзакции записи или проведения объектов. Выполнение тяжелых запросов с множественными ЛЕВОЕ СОЕДИНЕНИЕ и обращением к дополнительным реквизитам при каждой записи документа может снижать производительность. Передавайте условия по ИНН и свойствам через параметры запроса без обращения к реквизитам через точку.
  3. Декларативная альтернатива (ПРОП): Если логика проверки отбора по организации стандартная, рекомендуется настраивать Правила по свойствам плана обмена (ПРОП) в редакторе правил регистрации. В этом случае платформа производит отбор автоматически на уровне механизмов БСП без написания ручных запросов.
← На главную