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