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