Как конвертировать данные из справочника в перечисление в 1С: Конвертация данных?

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

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

Возможные причины ошибок при конвертации

Выясним причину, по которой стандартная выгрузка может не срабатывать:

  1. Несовпадение идентификаторов. Ошибка возникает, если строковое значение, передаваемое в базу-приемник, не совпадает с реальным именем значения перечисления в метаданных (требуется системное «Имя» из конфигуратора, а не «Синоним»).
  2. Конфликт кэширования. Справочник — это ссылочный объект с уникальным идентификатором (GUID), тогда как значения перечисления хранятся в метаданных. Если механизм попытается кэшировать выгруженный элемент справочника как перечисление, возникнет внутренний сбой структуры файла обмена.

Рассмотрим несколько проверенных способов настройки правил для корректного переноса данных.

Способ 1: Переопределение переменной УзелСсылки (Рекомендация 1С)

Проблема конвертации несовпадающих типов решается с помощью обработчиков событий. Посмотрим на пример с использованием специальной переменной УзелСсылки. Для этого необходимо создать Правило Конвертации Объектов (ПКО), где источником выступает справочник, а приемником — перечисление.

В обработчике «После выгрузки» этого ПКО напишем код конвертации:


Если Источник.Реквизит = "1" Тогда
    УзелСсылки = "ЗначениеПеречисления1";
Иначе
    УзелСсылки = "ЗначениеПеречисления2";
КонецЕсли;
Отказ = ИСТИНА;

В данном коде переменная Источник предоставляет доступ к выгружаемому справочнику. В переменную УзелСсылки мы записываем системное имя значения перечисления, как оно должно попасть в выходной файл. Строка Отказ = ИСТИНА; строго обязательна — с ее помощью мы прерываем штатную выгрузку справочника и возвращаем сформированное нами значение.

Далее в этом же правиле в обработчике «Перед выгрузкой» добавим строку:

Приемник = Источник;

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

Критически важный момент: поскольку наш алгоритм формирует нестандартный XML-узел, в настройках ПКО строго обязательно установите флажок «Не запоминать выгруженные объекты». Иначе при повторном обращении к тому же элементу в течение сеанса платформа попытается извлечь его из кэша и выдаст ошибку.

Способ 2: Отказ от ПКО в пользу обработки внутри ПКС

Зачастую для конвертации ссылочного реквизита в перечисление отдельное ПКО вообще не требуется. Разберем этот оптимальный вариант. В Правиле Конвертации Свойств (ПКС), где источник — реквизит-справочник, а приемник — реквизит-перечисление, достаточно просто очистить поле «Правило» (оставить его пустым).

В этом ПКС в обработчике «Перед выгрузкой» присвоим системной переменной Значение строковое имя нужного перечисления. Посмотрим на пример с сопоставлением единиц измерения:


Если СокрЛП(Источник.БазоваяЕдиница.ОКЕИ.Наименование) = "шт" Тогда
    Значение = "Штука";
ИначеЕсли СокрЛП(Источник.БазоваяЕдиница.ОКЕИ.Наименование) = "компл" Тогда
    Значение = "Комплект";
КонецЕсли;

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

Способ 3: Использование пустого источника в ПКО

Если архитектура обмена требует наличия отдельного ПКО для переноса (например, когда реквизит ссылается на справочник, требующий предварительной подготовки), создадим правило, в котором поле «Объект-источник» остается пустым, а заполнен только «Объект-приемник» (Перечисление).

В таком случае передача нужного значения также прописывается алгоритмом в ПКС или через переменные выгрузки. Это позволяет разорвать жесткую типизацию ссылочных типов между источником и приемником.

Способ 4: Табличное сопоставление значений без программирования

Если элементы справочника в базе-источнике являются предопределенными или их список ограничен и не меняется, воспользуемся штатным механизмом синхронизации. В созданном ПКО (Справочник -> Перечисление) перейдем на вкладку сопоставления значений.

В визуальном интерфейсе каждому элементу справочника жестко сопоставляется элемент перечисления. Этот способ исключает необходимость писать программный код с множеством проверок и надежно защищает от синтаксических ошибок и опечаток в именах перечислений.

← На главную