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