Как передать значение из документа в ПКО справочника для поиска по дополнительным реквизитам

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

При разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» часто возникает задача, когда поиск объекта в базе-приемнике должен зависеть от контекста его владельца или документа, в котором он указан. Рассмотрим классическую ситуацию: нам необходимо выгрузить документ (например, ПоступлениеТоваровУслуг), в котором есть реквизит Контрагент. При этом в базе-приемнике контрагента нужно искать не просто по ИНН, а по связке ИНН + ГруппаДоступа. Сложность заключается в том, что в базе-источнике у справочника Контрагенты нет реквизита ГруппаДоступа, но его значение соответствует наименованию организации из документа.

Поскольку при выполнении ПКО (Правила конвертации объектов) для контрагента в качестве Источника выступает сам контрагент, мы не имеем прямого доступа к реквизитам документа. Проанализируем, как можно «пробросить» нужные данные сквозь цепочку правил выгрузки.

Способ 1. Использование структуры ВходящиеДанные и ИсходящиеДанные

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

Шаг 1. Настройка ПКС в ПКО документа

В правиле конвертации документа (например, ПоступлениеУслуг) найдем строку ПКС для реквизита Контрагент. В обработчике «Перед выгрузкой» этого свойства нам нужно сформировать структуру, которая будет передана в подчиненное правило. Пропишем следующий код:


ИсходящиеДанные = Новый Структура;
Если ЗначениеЗаполнено(Источник.Организация) Тогда
    // Передаем наименование организации для последующего поиска Группы доступа
    ИсходящиеДанные.Вставить("НаименованиеОрганизации", Источник.Организация.Наименование);
КонецЕсли;

Шаг 2. Настройка ПКО справочника Контрагенты

Теперь перейдем в ПКО Контрагенты. Нам нужно создать новое ПКС (правило конвертации свойства). В качестве Приемника выберем реквизит ГруппаДоступа, а поле Источник оставим пустым. В настройках этого ПКС крайне важно установить флаг «Получать из входящих данных».

В обработчике «Перед выгрузкой» этого ПКС добавим логику извлечения данных:


Если ЗначениеЗаполнено(ВходящиеДанные) И ВходящиеДанные.Свойство("НаименованиеОрганизации") Тогда
    Значение = ВходящиеДанные.НаименованиеОрганизации;
КонецЕсли;

Шаг 3. Настройка поиска

Чтобы система использовала это поле для идентификации объекта, в таблице ПКС для свойства ГруппаДоступа необходимо установить флаг «Поиск». Теперь при загрузке система будет формировать поисковый запрос, включающий ИНН и полученную ГруппуДоступа.

Способ 2. Использование обработчика «Поля поиска»

Иногда простой установки флага «Поиск» в ПКС недостаточно, особенно если логика поиска сложная (например, если не нашли по ИНН + Группе, нужно поискать только по ИНН). Проанализируем, как использовать обработчик «Поля поиска» на уровне ПКО.

Когда данные переданы через ВходящиеДанные, они становятся доступны в этом обработчике. Мы можем программно управлять процессом:

  1. Система помещает переданные значения в структуру СвойстваПоиска.
  2. Мы можем использовать СвойстваПоиска["ГруппаДоступа"] для выполнения запроса к базе-приемнику.
  3. Если нам нужно найти саму ссылку на группу доступа (так как это справочник), мы можем предварительно вызвать поиск или использовать НайтиПоНаименованию прямо в коде загрузки.

Пример кода в обработчике «Поля поиска»:


Если НомерВариантаПоиска = 1 Тогда
    // Пытаемся найти по ИНН и Группе доступа
    ИНН = СвойстваПоиска["ИНН"];
    НаименованиеГруппы = СвойстваПоиска["ГруппаДоступа"];
    
    // Логика поиска ссылки ГруппыДоступа в приемнике
    СсылкаНаГруппу = Справочники.ГруппыДоступа.НайтиПоНаименованию(НаименованиеГруппы);
    
    Если Не СсылкаНаГруппу.Пустая() Тогда
        СсылкаНаОбъект = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН, , СсылкаНаГруппу);
    КонецЕсли;
КонецЕсли;

Способ 3. Передача через глобальные параметры выгрузки

Если организация в рамках сессии выгрузки одна и та же (или меняется редко), мы можем использовать коллекцию Параметры. Это избавит нас от необходимости прописывать ИсходящиеДанные в каждом документе.

В ПВД (Правила выгрузки данных) в обработчике «Перед обработкой» можно сохранить текущую организацию:

Параметры.Вставить("ТекущаяОрганизация", ОрганизацияДляВыгрузки);

Тогда в ПКО Контрагенты мы сможем напрямую обратиться к этому значению:

Значение = Параметры.ТекущаяОрганизация.Наименование;

Важные нюансы и типичные ошибки

Проанализируем технические тонкости, которые часто приводят к ошибкам при реализации подобных схем:

  1. Флаг «Получать из входящих данных»: Если вы установили этот флаг, 1С ожидает, что структура ВходящиеДанные будет передана всегда. Если объект Контрагент будет выгружаться по другому правилу или из другого места, где ИсходящиеДанные не заполнены, вы можете получить ошибку обращения к свойству. Поэтому всегда добавляйте проверку Если ЗначениеЗаполнено(ВходящиеДанные)....
  2. Типы данных: Если ГруппаДоступа в приемнике является ссылкой на справочник, а вы передаете строку (наименование), убедитесь, что для этого ПКС указано соответствующее правило конвертации (например, Строка_в_ГруппуДоступа), которое умеет искать группу по наименованию.
  3. Порядок выгрузки: Убедитесь, что данные, по которым идет поиск (в нашем примере — Группа доступа), уже существуют в базе-приемнике или могут быть созданы «на лету». Лучше всего передавать не просто строку, а объект, выгруженный через ВыгрузитьПоПравилу.

Используя механизм ВходящиеДанные, мы обеспечиваем гибкую связь между объектами разного уровня, позволяя справочникам «узнавать» контекст своей выгрузки и корректно синхронизироваться с данными в целевой информационной базе.

← На главную