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