При настройке правил обмена в Конвертации данных 2.0 часто возникают ситуации, когда данные, отобранные в ПВД (Правила Выгрузки Данных) через Произвольный алгоритм, попадают в файл выгрузки частично. Чаще всего проблема заключается в том, что реквизиты простых типов (строка, число, дата) выгружаются успешно, а реквизиты ссылочного типа (например, СправочникСсылка.Контрагенты) остаются пустыми или вовсе отсутствуют в структуре XML. Давайте разберем, как устроена передача данных и как исправить эту ошибку.
Основная причина заключается в непонимании механизмов работы ПКО (Правил Конвертации Объектов) и ПКС (Правил Конвертации Свойств). Когда вы используете произвольный алгоритм, вы фактически берете на себя ответственность за подготовку данных. Однако для того чтобы Конвертация данных смогла превратить ссылку источника в ссылку приемника, ей недостаточно просто получить значение в алгоритме. Ей необходимо:
ПКО для контрагентов).ПКС).Частая ошибка — попытка «передать» ссылку без создания правил для самого справочника. Даже если вы ранее переносили контрагентов в рамках других задач, в текущем наборе правил должно существовать ПКО для этого справочника. Без него система не знает, как сопоставить объект приемника с объектом источника.
В созданном ПКО для контрагентов обязательно настройте правила поиска (например, по коду или наименованию). Также убедитесь, что в ПКС этого справочника настроены необходимые реквизиты. Если вы не хотите выгружать сам объект (а хотите передавать его только как ссылку), используйте в ПКО событие Перед выгрузкой, установив флаг:
ТолькоПолучитьУзелСсылки = Истина;
Для корректной работы с произвольным алгоритмом в ПВД, мы рекомендуем использовать структуру ИсходящиеДанные. Это «золотой стандарт» при работе с кастомными выборками. Давайте рассмотрим, как правильно организовать цикл выгрузки.
Вместо прямой записи значений, мы формируем структуру, которую Конвертация данных сможет «понять» и соотнести с правилами конвертации свойств:
Выборка = ВыборкаДанных.Выбрать();
Пока Выборка.Следующий() Цикл
ИсходящиеДанные = Новый Структура("Наименование, Контрагент");
ЗаполнитьЗначениеСвойств(ИсходящиеДанные, Выборка);
// Выгружаем объект по правилу, передавая структуру с данными
ВыгрузитьПоПравилу(,, ИсходящиеДанные,, "ИмяВашегоПКО");
КонецЦикла;
Отказ = Истина;
Здесь важно отметить следующее: метод ВыгрузитьПоПравилу вызывается с параметром ИсходящиеДанные. Ключи этой структуры должны совпадать с именами свойств в вашем ПКО. Когда система видит, что передается ссылочный тип, она обращается к соответствующему ПКС внутри этого ПКО. Если правила для контрагентов настроены верно, Конвертация данных автоматически выполнит поиск или создание элемента в приемнике.
После того как вы подготовили структуру и вызвали выгрузку, необходимо проверить ПКС в ПКО основного объекта. Убедитесь, что для свойства «Контрагент»:
ПКО Контрагентов).Именно этот флаг сообщает системе: «не ищи значение в самом объекте источника, а возьми его из той структуры, которую мы подготовили в ПВД».
Если после выполнения алгоритма вы все равно получаете «пустоту» в приемнике, пройдитесь по этому чек-листу:
ПКО для ссылочного объекта?ПКО поле для поиска (код/наименование)?ПВД (произвольный алгоритм) вы действительно заполняете структуру ИсходящиеДанные?ПКС основного объекта стоит флаг Получить из входящих данных?ПКО в методе ВыгрузитьПоПравилу?Соблюдение этих простых правил позволит избежать потери ссылочных данных и обеспечит корректную связь между объектами в базе приемнике.