Как перенести табличную часть в реквизиты справочника и почему не работают ПВД при автообмене в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С через «Конвертацию данных 2.1» (КД 2.1) часто возникает задача перенести данные из табличной части объекта-источника (например, «Дополнительные реквизиты») в отдельные реквизиты объекта-приемника. Однако разработчики сталкиваются с ситуацией, когда правила отлично работают при ручной выгрузке через обработку УниверсальныйОбменДаннымиXML, но вызывают ошибки при автоматической синхронизации по плану обмена.

Рассмотрим, почему возникает эта проблема, как устроены механизмы выгрузки и как правильно настроить конвертацию табличной части в реквизиты.

Анализ проблемы: разница между универсальным обменом и автоматической синхронизацией

Разберем по шагам, почему поведение правил обмена различается в зависимости от способа запуска:

  1. Выгрузка через универсальную обработку: обработка формирует выборку объектов и последовательно вызывает Правила Выгрузки Данных (ПВД). В обработчике ПередВыгрузкой ПВД инициализируется структура ИсходящиеДанные, которая затем успешно передается в Правило Конвертации Объекта (ПКО).
  2. Автоматическая синхронизация (по плану обмена): выгрузка происходит по зарегистрированным изменениям. В этом режиме система выгружает объекты по ссылке, минуя ПВД! Управление передается напрямую в обработчики ПКО.

Так как обработчик ПВД при автообмене просто не исполняется, структура ИсходящиеДанные не формируется. В результате параметр ВходящиеДанные в ПКО остается равен Неопределено, а Правила Конвертации Свойств (ПКС) с флагом «Получать из входящих данных» вызывают исключение «Получение элемента по индексу для значения не определено».

Кроме того, при выгрузке по ссылке переменная Источник содержит не объект (СправочникОбъект), а ссылку (СправочникСсылка). Передача ссылки в функции вроде ЗаполнитьЗначенияСвойств() или прямое обращение к ТЧ через точку приводит к ошибкам типов на стороне платформы.

Способ 1. Перенос формирования входящих данных из ПВД в ПКО

Для гарантированного исполнения кода при любом способе обмена перенесем логику формирования структуры ИсходящиеДанные из ПВД в обработчик ПередВыгрузкой соответствующего ПКО (например, ПКО_Номенклатура).

Этот обработчик исполняется всегда — как при явной выгрузке, так и при автоматической синхронизации по ссылке.

Поскольку в переменной Источник может находиться ссылка, считывать табличную часть нужно с помощью запроса. Рассмотрим пример кода в обработчике ПередВыгрузкой ПКО:


ИсходящиеДанные = Новый Структура;

// Безопасно считываем значения из табличной части через запрос
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТЧ.Свойство.Наименование КАК ИмяСвойства,
	|	ТЧ.Значение КАК Значение
	|ИЗ
	|	Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТЧ
	|ГДЕ
	|	ТЧ.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Источник);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Выборка.ИмяСвойства = "Артикул производителя" Тогда
			ИсходящиеДанные.Вставить("АртикулПроизводителя", Выборка.Значение);
		ЭлИф Выборка.ИмяСвойства = "Ширина" Тогда
			ИсходящиеДанные.Вставить("Ширина", Выборка.Значение);
		КонецЕсли;
	КонецЦикла;
КонецЕсли;

После создания структуры в ПКО переходим к ПКС соответствующих реквизитов приемника и устанавливаем настройки:

Способ 2. Заполнение значений непосредственно в ПКС

Выясним, как обойтись без использования структуры ИсходящиеДанные. Можно вычислять значение реквизита прямо в обработчике ПередВыгрузкой конкретного ПКС.

Для этого в ПКС реквизита приемника прописываем поиск нужной строки ТЧ и передаем полученное значение в служебную переменную Значение:


Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ТЧ.Значение КАК Значение
	|ИЗ
	|	Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТЧ
	|ГДЕ
	|	ТЧ.Ссылка = &Ссылка
	|	И ТЧ.Свойство.Наименование = &ИмяСвойства";

Запрос.УстановитьПараметр("Ссылка", Источник);
Запрос.УстановитьПараметр("ИмяСвойства", "Артикул производителя");

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
	Значение = Выборка.Значение;
Иначе
	Значение = Неопределено;
КонецЕсли;

Как отлаживать правила при автообмене

Для поиска причин ошибок при автоматическом фоновом обмене рекомендуем использовать следующие инструменты:

  1. Модуль отладки правил КД 2.1: в конфигурации «Конвертация данных» можно включить режим отладки и выгрузить модуль правил в файл. Подключив его в конфигураторе базы-источника, вы сможете пошагово пройти отладчиком все обработчики ПКО и ПКС при выполнении синхронизации.
  2. Журнал регистрации: для быстрой проверки типа Источник и заполнения параметров используйте вызов ЗаписьЖурналаРегистрации() прямо из кода обработчиков.
← На главную