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