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