При разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» часто возникает задача, когда поиск объекта в базе-приемнике должен зависеть от контекста его владельца или документа, в котором он указан. Рассмотрим классическую ситуацию: нам необходимо выгрузить документ (например, ПоступлениеТоваровУслуг), в котором есть реквизит Контрагент. При этом в базе-приемнике контрагента нужно искать не просто по ИНН, а по связке ИНН + ГруппаДоступа. Сложность заключается в том, что в базе-источнике у справочника Контрагенты нет реквизита ГруппаДоступа, но его значение соответствует наименованию организации из документа.
Поскольку при выполнении ПКО (Правила конвертации объектов) для контрагента в качестве Источника выступает сам контрагент, мы не имеем прямого доступа к реквизитам документа. Проанализируем, как можно «пробросить» нужные данные сквозь цепочку правил выгрузки.
Это основной и наиболее рекомендуемый метод для передачи произвольных параметров между правилами. Разберем по шагам реализацию этого механизма.
Шаг 1. Настройка ПКС в ПКО документа
В правиле конвертации документа (например, ПоступлениеУслуг) найдем строку ПКС для реквизита Контрагент. В обработчике «Перед выгрузкой» этого свойства нам нужно сформировать структуру, которая будет передана в подчиненное правило. Пропишем следующий код:
ИсходящиеДанные = Новый Структура;
Если ЗначениеЗаполнено(Источник.Организация) Тогда
// Передаем наименование организации для последующего поиска Группы доступа
ИсходящиеДанные.Вставить("НаименованиеОрганизации", Источник.Организация.Наименование);
КонецЕсли;
Шаг 2. Настройка ПКО справочника Контрагенты
Теперь перейдем в ПКО Контрагенты. Нам нужно создать новое ПКС (правило конвертации свойства). В качестве Приемника выберем реквизит ГруппаДоступа, а поле Источник оставим пустым. В настройках этого ПКС крайне важно установить флаг «Получать из входящих данных».
В обработчике «Перед выгрузкой» этого ПКС добавим логику извлечения данных:
Если ЗначениеЗаполнено(ВходящиеДанные) И ВходящиеДанные.Свойство("НаименованиеОрганизации") Тогда
Значение = ВходящиеДанные.НаименованиеОрганизации;
КонецЕсли;
Шаг 3. Настройка поиска
Чтобы система использовала это поле для идентификации объекта, в таблице ПКС для свойства ГруппаДоступа необходимо установить флаг «Поиск». Теперь при загрузке система будет формировать поисковый запрос, включающий ИНН и полученную ГруппуДоступа.
Иногда простой установки флага «Поиск» в ПКС недостаточно, особенно если логика поиска сложная (например, если не нашли по ИНН + Группе, нужно поискать только по ИНН). Проанализируем, как использовать обработчик «Поля поиска» на уровне ПКО.
Когда данные переданы через ВходящиеДанные, они становятся доступны в этом обработчике. Мы можем программно управлять процессом:
СвойстваПоиска.СвойстваПоиска["ГруппаДоступа"] для выполнения запроса к базе-приемнику.НайтиПоНаименованию прямо в коде загрузки.Пример кода в обработчике «Поля поиска»:
Если НомерВариантаПоиска = 1 Тогда
// Пытаемся найти по ИНН и Группе доступа
ИНН = СвойстваПоиска["ИНН"];
НаименованиеГруппы = СвойстваПоиска["ГруппаДоступа"];
// Логика поиска ссылки ГруппыДоступа в приемнике
СсылкаНаГруппу = Справочники.ГруппыДоступа.НайтиПоНаименованию(НаименованиеГруппы);
Если Не СсылкаНаГруппу.Пустая() Тогда
СсылкаНаОбъект = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН, , СсылкаНаГруппу);
КонецЕсли;
КонецЕсли;
Если организация в рамках сессии выгрузки одна и та же (или меняется редко), мы можем использовать коллекцию Параметры. Это избавит нас от необходимости прописывать ИсходящиеДанные в каждом документе.
В ПВД (Правила выгрузки данных) в обработчике «Перед обработкой» можно сохранить текущую организацию:
Параметры.Вставить("ТекущаяОрганизация", ОрганизацияДляВыгрузки);
Тогда в ПКО Контрагенты мы сможем напрямую обратиться к этому значению:
Значение = Параметры.ТекущаяОрганизация.Наименование;
Проанализируем технические тонкости, которые часто приводят к ошибкам при реализации подобных схем:
ВходящиеДанные будет передана всегда. Если объект Контрагент будет выгружаться по другому правилу или из другого места, где ИсходящиеДанные не заполнены, вы можете получить ошибку обращения к свойству. Поэтому всегда добавляйте проверку Если ЗначениеЗаполнено(ВходящиеДанные)....ГруппаДоступа в приемнике является ссылкой на справочник, а вы передаете строку (наименование), убедитесь, что для этого ПКС указано соответствующее правило конвертации (например, Строка_в_ГруппуДоступа), которое умеет искать группу по наименованию.ВыгрузитьПоПравилу.Используя механизм ВходящиеДанные, мы обеспечиваем гибкую связь между объектами разного уровня, позволяя справочникам «узнавать» контекст своей выгрузки и корректно синхронизироваться с данными в целевой информационной базе.