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

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

При настройке правил регистрации объектов (ПРО) в конфигурации «1С:Конвертация данных 2.1» нередко возникает задача регистрировать документы только при совпадении строго определенных комбинаций нескольких реквизитов. Классический пример — выгрузка документов РеализацияТоваровУслуг только по определенным парам «Организация — Контрагент», которые заданы в табличной части узла плана обмена.

Разберем, почему штатный визуальный отбор в дереве правил не справляется с этой задачей, и рассмотрим практические способы правильной реализации фильтрации.

Почему не работает стандартное дерево отбора в ПРО?

Проанализируем типовую ошибку при попытке настроить условие через визуальный редактор отборов. Если в табличной части узла плана обмена заданы допустимые пары:

  1. Организация «А» — Контрагент «К»
  2. Организация «Б» — Контрагент «Л»

И в правиле регистрации задаются условия вида:

  1. Организация Равно [Состав].Организация
  2. Контрагент Равно [Состав].Контрагент

В этом случае платформа проверяет каждую колонку табличной части отдельно от другой. Внутренний механизм преобразует каждую колонку в отдельный массив значений и выполняет логическую проверку:

Объект.Организация В Списке (Организации) И Объект.Контрагент В Списке (Контрагенты)

В результате возникает эффект декартова произведения: документ с сочетанием Организация «А» и Контрагент «Л» также успешно пройдет проверку и зарегистрируется к обмену, поскольку Организация «А» есть в списке организаций, а Контрагент «Л» — в списке контрагентов. Штатный визуальный отбор не умеет сопоставлять колонки как единый строковый кортеж.

Решение через обработчик события «После обработки»

Выясним причину успешного решения: чтобы проверить наличие именно конкретной строки с парой значений, необходимо программно обратиться к табличной части узла и отфильтровать список узлов-получателей в обработчике правила регистрации объекта.

Рассмотрим по шагам программную реализацию в обработчике «После обработки» правила регистрации объектов:


СтруктураОтбора = Новый Структура("Организация, Контрагент");
ЗаполнитьЗначенияСвойств(СтруктураОтбора, Объект);

i = 0;
Пока i < Получатели.Количество() Цикл
    // Проверяем наличие строки с точным сочетанием обоих реквизитов
    Если Получатели[i].Состав.НайтиСтроки(СтруктураОтбора).Количество() = 0 Тогда
        Получатели.Удалить(i);
    Иначе
        i = i + 1;
    КонецЕсли;
КонецЦикла;

В этом коде мы формируем структуру с текущими значениями реквизитов документа и методом НайтиСтроки() проверяем, есть ли такое строгое совпадение в табличной части Состав каждого узла из коллекции Получатели. Если совпадений нет, узел удаляется из списка регистрации.

Оптимизация производительности при массовой регистрации

Обратим внимание на важный нюанс: прямое обращение к табличной части через свойство ссылки узла Получатели[i].Состав при проведении или перезаписи большого количества документов порождает повторные запросы к базе данных, что существенно замедляет работу системы.

Для оптимизации скорости выполнения обмена разберем следующие рекомендации:

  1. Кэширование соответствий: Таблицы допустимых сочетаний для узлов обмена следует выгружать один раз и сохранять в модуле с повторным использованием значений или в параметрах сеанса, проверяя сочетания по кэшированной таблице в оперативной памяти.
  2. Использование независимого регистра сведений: Вместо табличной части плана обмена можно создать непериодический регистр сведений с измерениями УзелОбмена, Организация, Контрагент. Проверка существования комбинации через регистр выполняется быстрым индексным запросом или через считывание среза/ключа записи.

Альтернативные варианты решения

Если требуется реализовать фильтрацию без перебора коллекции Получатели в коде ПРО, можно применить следующие подходы:

  1. Синтетический составной ключ: В табличную часть узла и в объект метаданных добавляется строковый реквизит (например, КлючМаршрутизации), в который записывается конкатенация уникальных идентификаторов или кодов (например, УИД_Организации + "_" + УИД_Контрагента). В этом случае в визуальном дереве ПРО настраивается одна строка отбора по равенству составных ключей.
  2. Отказ от авторегистрации и использование подписок на события: Для объекта в плане обмена авторегистрация отключается (значение Запретить). В конфигурации создается собственная подписка на событие ПередЗаписью или ПриЗаписи, где в коде модуля проверяется валидность комбинации и вызывается стандартный метод платформы ПланыОбмена.ЗарегистрироватьИзменения(Узел, Ссылка).
← На главную