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

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

При переносе данных между конфигурациями 1С с использованием «Конвертации данных 2.1» разработчики часто сталкиваются с ситуацией, когда реквизиту-приемнику необходимо присвоить конкретное предопределенное значение. Задача существенно усложняется, если реквизит приемника имеет составной тип данных, например, включает в себя сразу несколько Планов видов характеристик или Справочников.

В этой статье разберем, почему стандартное присвоение через переменные Значение и ИмяПКО не всегда работает, и рассмотрим эффективные способы решения этой задачи.

Причина возникновения проблемы

Проанализируем механику работы «Конвертации данных 2.1». Когда реквизит приемника имеет составной тип (например, ПланВидовХарактеристикСсылка.СтатьиРасходов и ПланВидовХарактеристикСсылка.СтатьиАктивовПассивов), система должна точно определить, к какому именно метаданному типу из составного относится передаваемое значение.

Если в обработчике «Перед выгрузкой» Правила конвертации свойств (ПКС) прописать код вида:


Значение = "ПрочиеПассивы";
ИмяПКО = "СтатьиАктивовПассивов";

или попытаться передать структуру:

Значение = Новый Структура("СтатьиАктивовПассивов", "ПрочиеПассивы");

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

Способ 1. Использование переменной «Выражение» в ПКС (Рекомендуемый)

Рассмотрим наименее трудоемкий и наиболее изящный способ установки предопределенного значения. В «Конвертации данных 2.1» обработчик «Перед выгрузкой» ПКС содержит специальную переменную Выражение.

Для реализации этого метода выполним следующие шаги:

  1. Откроем Правило конвертации свойств (ПКС) для нужного реквизита (в нашем примере — реквизит СтатьяРасходов в табличной части).
  2. Поле **Правило** в настройках ПКС оставим пустым.
  3. В обработчике «Перед выгрузкой» напишем условие и присвоим переменной Выражение строковое представление объекта базы-приемника:

Если Источник.ВидОперации = Перечисления.ВидыОперацийСписаниеДенежныхСредств.ПрочиеРасчетыСКонтрагентами Тогда    
    Если Источник.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками Тогда
        Выражение = "ПланыВидовХарактеристик.СтатьиАктивовПассивов.ПрочиеПассивы";
    Иначе
        Отказ = Истина;
    КонецЕсли;    
КонецЕсли;

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

Обратите внимание: Выражение исполняется на стороне базы-приемника, поэтому обращения к метаданным (названия справочников, планов видов характеристик и предопределенных элементов) должны строго соответствовать конфигурации-приемнику.

Способ 2. Создание отдельного ПКО с пустым источником

Если необходимо выполнить полноценный поиск или сопоставление по имени предопределенного элемента через правила, разберем второй подход — создание специального ПКО.

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

Значение = "ПрочиеПассивы";
ИмяПКО = "ИмяСозданногоПКО";

При такой настройке КД 2.1 передаст строку "ПрочиеПассивы" в указанное ПКО, которое однозначно определит тип приемника и найдет нужный элемент по полю поиска.

Способ 3. Заполнение реквизита в обработчике «После загрузки»

Рассмотрим ситуацию, когда логика подстановки значения сложна или зависит от контекста загруженного документа. В этом случае заполнение реквизита можно вынести в обработчик «После загрузки» самого ПКО документа.

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


Для Каждого Стр Из Объект.Расшифровка Цикл
    Если Не ЗначениеЗаполнено(Стр.СтатьяРасходов) Тогда
        Стр.СтатьяРасходов = ПланыВидовХарактеристик.СтатьиАктивовПассивов.ПрочиеПассивы;
    КонецЕсли;
КонецЦикла;

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

Резюме

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

← На главную