При разработке правил обмена в среде «1С:Конвертация данных 2.0» (КД 2.0) часто возникают ситуации, когда в базе-приемнике необходимо создать объекты, которых физически не существует в базе-источнике. Например, на основании одной строки запроса или таблицы значений нужно сформировать сразу два документа, причем один из них должен быть указан в качестве значения реквизита другого. Рассмотрим типичную проблему, с которой сталкиваются разработчики при попытке реализовать такую логику через последовательные вызовы функции ВыгрузитьПоПравилу, и разберем правильный механизм решения задачи.
Рассмотрим ситуацию, когда программист пытается создать документ «Ввод остатков» и документ «Первичный документ» (партия). В коде это часто выглядит так: сначала вызывается ВыгрузитьПоПравилу для партии, результат попытки записывается в переменную, которая затем передается в структуру для выгрузки основного документа. Проанализируем, к чему это приводит.
Функция ВыгрузитьПоПравилу в КД 2.0 при выгрузке в файл не возвращает ссылку на объект или XML-узел. Она записывает данные непосредственно в XML-поток выгрузки и возвращает Неопределено (или пустое значение). Когда мы пытаемся присвоить результат вызова переменной, например Партия = ВыгрузитьПоПравилу(...), и передать её в следующий вызов, система получает пустое значение. В результате в базе-приемнике создаются «битые» или пустые объекты, так как связь между ними не была установлена корректно.
Кроме того, при таком подходе часто создаются лишние копии документов. Это происходит из-за того, что КД пытается обработать каждый вызов независимо, и если настройки поиска (поля поиска) в ПКО (Правила Конвертации Объектов) не заданы жестко, система «плодит» объекты, не понимая, что они должны быть связаны.
Самый надежный и стандартный способ связать два «виртуальных» объекта в Конвертации данных — это использование вложенных структур. Механизм КД 2.0 спроектирован так, что он умеет рекурсивно обрабатывать переданные данные. Если в качестве значения реквизита (свойства) передать не готовую ссылку, а другую Структуру, система поймет, что для этого реквизита нужно запустить поиск или создание объекта по соответствующему ПКО.
Разберем этот алгоритм по шагам:
ВыгрузитьПоПравилу только один раз — для основного объекта.Проанализируем пример кода, который позволяет корректно выгрузить документ «Ввод остатков» вместе с «Партией», не создавая дублей и пустых узлов. Данный код обычно размещается в обработчике «Перед обработкой» Правила Выгрузки Данных (ПВД):
// 1. Формируем структуру данных для подчиненного документа (Партии)
СтруктураПартии = Новый Структура();
СтруктураПартии.Вставить("Номер", "ПАРТ-001");
СтруктураПартии.Вставить("Дата", ТекущаяДата());
СтруктураПартии.Вставить("Организация", ОрганизацияИсточник);
// Добавляем другие необходимые реквизиты...
// 2. Формируем структуру данных для основного документа (Ввод остатков)
ДокументВводаОстатков = Новый Структура();
ДокументВводаОстатков.Вставить("Номер", "ВВОД-001");
ДокументВводаОстатков.Вставить("Дата", '20201231');
ДокументВводаОстатков.Вставить("Склад", СкладИсточник);
// 3. Самый важный момент: вкладываем структуру партии в основной документ
// КД сама определит нужное ПКО для реквизита "Партия" на основании настроек ПКС
ДокументВводаОстатков.Вставить("Партия", СтруктураПартии);
// 4. Выгружаем только основной объект
// ПКО "ВводОстатковТМЦ" должно быть настроено на получение данных из структуры
ВыгрузитьПоПравилу(ДокументВводаОстатков, , , , "ВводОстатковТМЦ");
// 5. Отменяем стандартную выгрузку, если мы работаем в ПВД
Отказ = Истина;
Чтобы приведенный выше код сработал, необходимо правильно настроить правила в интерфейсе КД:
Во-первых, в Правиле Конвертации Объекта (ПКО) для документа «Ввод остатков» найдите ПКС (Поле Конвертации Свойства) для реквизита Партия. В колонке «Правило» обязательно должно быть указано ПКО подчиненного документа («ПервичныйДокумент»).
Во-вторых, обратите внимание на настройку поиска. Поскольку у «виртуальных» объектов, созданных из структур, нет уникального идентификатора (GUID) источника, поиск в приемнике будет осуществляться по полям поиска. Перейдите в ПКО подчиненного документа и на закладке «Настройки» отметьте галочками ключевые поля (например, Номер, Дата, Организация) и установите флаг «Поиск». Также рекомендуется включить опцию «Продолжить поиск по полям поиска, если по идентификатору объект не найден».
В-третьих, если вы передаете вложенные структуры, убедитесь, что в ПКС не стоит галочка «Получить из входящих данных», если вы не планируете использовать специальный параметр ВходящиеДанные. При передаче структуры напрямую в реквизит, КД воспринимает её как сам объект источника (вместо ссылки).
Использование вложенных структур вместо множественных вызовов ВыгрузитьПоПравилу дает несколько важных преимуществ:
Таким образом, мы выяснили, что для решения задачи связки объектов необходимо отказаться от идеи получения «узла» или «ссылки» во время выгрузки. Вместо этого следует использовать мощный механизм рекурсивной обработки структур, заложенный в ядро Конвертации данных 2.0.