В процессе разработки правил обмена данными в «1С:Конвертация данных 2.1» (КД 2.1) часто возникают ситуации, когда в базе-источнике есть важная информация, которую необходимо передать, но в базе-приемнике для нее нет соответствующего реквизита. Вместо создания лишних полей в конфигурации-приемнике правильным архитектурным решением будет использование механизма параметров объекта. Рассмотрим подробнее, как настроить такую передачу, избежать типичных ошибок сериализации и правильно обработать данные на стороне приемника.
Представим ситуацию: нам нужно передать значение «Вид взаиморасчетов» из документа «Расходный кассовый ордер», но в приемнике такого реквизита нет. На основании этого значения мы планируем программно заполнить «Счет расчетов» в приемнике. Разберем по шагам, как это реализовать.
Для начала создадим ПКС (Правило конвертации свойства) внутри нужного ПКО (Правила конвертации объекта). В настройках этого ПКС выполним следующие действия:
ВидРасчетов.Часто программисты сталкиваются с тем, что при попытке получить параметр в приемнике они видят странную строку вида {"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e...}. Проанализируем причину: если передаваемый реквизит является ссылочным типом, система пытается сериализовать его в XML. Если для этого параметра не указано конкретное ПКО, 1С выгружает внутреннее представление ссылки, которое неудобно обрабатывать вручную.
Выясним, как решить эту проблему. У нас есть два пути:
Рассмотрим пример кода в обработчике «Перед выгрузкой» для ПКС:
// Передаем не саму ссылку, а наименование, чтобы избежать проблем с типами
Значение = Источник.ВидВзаиморасчетовСПодотчетником.Наименование;
Теперь перейдем к самому важному — извлечению данных. Все параметры, для которых в ПКС был установлен флаг «Передавать в параметр», попадают в специальную структуру ПараметрыОбъекта. Эта структура доступна в обработчиках загрузки ПКО.
Наиболее подходящим местом для логики заполнения реквизитов является обработчик «После загрузки». Посмотрим на пример кода, который позволит нам извлечь параметр и использовать его для поиска нужного счета:
Если ПараметрыОбъекта <> Неопределено Тогда
// Извлекаем переданное строковое значение
ИмяВидаРасчетов = ПараметрыОбъекта["ВидРасчетов"];
// Пример логики заполнения другого реквизита
Если ИмяВидаРасчетов = "РасчетыСПоставщиками" Тогда
Объект.СчетРасчетов = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
ИначеЕсли ИмяВидаРасчетов = "Прочее" Тогда
Объект.СчетРасчетов = ПланыСчетов.Хозрасчетный.ПрочиеРасчеты;
КонецЕсли;
КонецЕсли;
Важный нюанс: Обработчик «После загрузки» выполняется, когда объект уже может быть записан в базу. Если вы изменяете реквизиты объекта в этом обработчике, убедитесь, что это не приведет к необходимости повторной записи (или используйте обработчик «При загрузке», если объект еще находится в памяти до основной записи).
Проанализируем ситуацию, когда данные нужно передать не из шапки документа, а из строки табличной части. В этом случае стандартный механизм ПараметрыОбъекта может работать не совсем так, как ожидается, поскольку он относится ко всему объекту целиком.
Если вы настраиваете ПКС внутри табличной части, помните о правильном обращении к данным в обработчике «Перед выгрузкой»:
Источник для обращения к самому документу (владельцу ТЧ).ОбъектКоллекции для обращения к текущей строке табличной части.Пример кода для ПКС в строке ТЧ:
// Получаем данные из конкретной строки текущей выгружаемой таблицы
Значение = ОбъектКоллекции.СпецификацияНоменклатуры.Наименование;
Не путайте параметры объекта с глобальными параметрами конвертации. Глобальные параметры задаются на отдельной вкладке в КД 2.1 и доступны во всех правилах через структуру Параметры. Они удобны для передачи настроек обмена (например, «Склад по умолчанию»), в то время как ПараметрыОбъекта уникальны для каждой конкретной выгружаемой единицы данных (документа или элемента справочника).
Таким образом, использование параметров — это мощный инструмент, позволяющий гибко управлять данными без изменения структуры конфигурации-приемника. Следуя этим правилам, мы обеспечиваем чистоту кода и стабильность процесса обмена.