Как в Конвертации данных 2.1 выгрузить субконто через структуру с измененными реквизитами?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных 2.1» нередко возникает задача переноса проводок в документ ОперацияБух. Часто требуется не просто перенести существующую аналитику, но и подменить некоторые свойства объекта — например, выгрузить договор контрагента с новым наименованием. Однако разработчики сталкиваются с тем, что передача обычной структуры вместо ссылки в субконто приводит к тому, что субконто вовсе не выгружается в файл обмена. Разберем причины такого поведения платформы и детально рассмотрим рабочие способы решения этой задачи.

Выясним причину: почему структура не выгружается в субконто по умолчанию?

Для того чтобы понять, почему обычная передача структуры дает сбой, проанализируем внутренний механизм выгрузки субконто в КД 2.1:

  1. Составной тип данных: субконто на счетах бухгалтерского учета базируются на Плане видов характеристик и имеют составной тип. При выгрузке ссылки движок правил обмена автоматически определяет ТипЗнч(Значение) (например, СправочникСсылка.ДоговорыКонтрагентов) и по этому типу находит соответствующее ПКО (Правило конвертации объектов).
  2. Потеря соответствия типов: если вместо ссылки передать объект типа Структура, движок видит тип источника как Структура. В правилах нет сопоставления между типом Структура и планом видов характеристик субконто, поэтому КД 2.1 не может определить целевое ПКО и тихо игнорирует значение.
  3. Особенности ПКО без источника: если правило создано без указания объекта-источника для приема структуры данных, оно не может быть выбрано механизмом автоматически — такое правило требует исключительно явного вызова.

Способ 1. Принудительная выгрузка через функцию ВыгрузитьПоПравилу

Рассмотрим решение, к которому пришел автор темы. Если реальной ссылки на объект нет или данные полностью формируются «на лету» в виде структуры, мы можем принудительно выполнить сериализацию объекта в XML через процедуру ВыгрузитьПоПравилу.

Разберем по шагам, как реализовать этот подход в обработчиках КД 2.1:

  1. Создаем ПКО для справочника ДоговорыКонтрагентов, где поле «Объект-источник» оставляем пустым, а «Объект-приемник» указываем как справочник договоров. Настраиваем необходимые ПКС (например, Наименование, Владелец и поля поиска).
  2. В обработчике, где формируется таблица проводок или конкретная строка субконто (например, в ПВД или перед выгрузкой группы свойств), формируем структуру с полями договора и вызываем выгрузку:

СтруктураДоговора = Новый Структура;
СтруктураДоговора.Вставить("Наименование", "Договор с новым наименованием");
СтруктураДоговора.Вставить("Владелец", КонтрагентСсылка);

// Выполняем принудительную выгрузку объекта по правилу
ВыгрузитьПоПравилу(СтруктураДоговора, , , , "ДоговорыКонтрагентов_БезИсточника");

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

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

Рассмотрим более изящный способ, который позволяет сохранить штатный механизм типизации КД 2.1. Если в исходной базе ссылка на договор все же существует, нам не обязательно заменять ее на структуру целиком. Мы можем передать саму ссылку для сохранения типа субконто, а новое наименование передать через механизм контекстных данных.

Разберем по шагам реализацию данного сценария:

  1. В обработчике «Перед выгрузкой» свойства проводки или самого субконто формируем структуру дополнительных данных:

// Передаем ссылку штатно в Значение
Значение = Проводка.СубконтоДтДоговор;

// В ИсходящиеДанные помещаем новое значение для реквизита
ИсходящиеДанные = Новый Структура("НовоеНаименование", "Договор с новым наименованием");
  1. В ПКО для справочника ДоговорыКонтрагентов открываем ПКС для свойства Наименование и в обработчике «Перед выгрузкой» переопределяем выгружаемое значение:

Если ВходящиеДанные <> Неопределено И ВходящиеДанные.Свойство("НовоеНаименование") Тогда
    Значение = ВходящиеДанные.НовоеНаименование;
КонецЕсли;

При таком подходе движок правил штатно сопоставляет ссылку с нужным ПКО, сохраняет тип субконто в проводке, но при этом значение реквизита подменяется на лету.

Способ 3. Явное указание ИмяПКО при передаче структуры в субконто

Посмотрим еще на один вариант решения, когда в субконто передается структура данных, но выгрузка должна пройти в штатном потоке обработки ПКС без отдельного вызова функций.

Для этого в обработчике «Перед выгрузкой» соответствующего ПКС субконто нужно директивно указать имя правила, отключив автоматический поиск по типу источника:


Значение = СтруктураДоговора;
ИмяПКО = "ДоговорыКонтрагентов_ПоСтруктуре";

При явном указании переменной ИмяПКО конвертация не пытается вычислить правило по типу переданного значения, а сразу обращается к указанному алгоритму обработки объекта.

Важные нюансы при работе со структурами в субконто

При реализации любого из описанных решений важно учитывать следующие технические особенности:

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