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

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

При настройке правил обмена в конфигурации Конвертация данных (ред. 2.1) часто возникает необходимость сопоставить реквизит типа СправочникСсылка из конфигурации-источника с реквизитом типа ПеречислениеСсылка в конфигурации-приемнике. Например, в документе поступления товаров ставка НДС в источнике хранится в справочнике, а в приемнике — в перечислении.

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

Выясним причину проблемы

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

Проанализируем три практических способа корректного преобразования справочника в перечисление.

Способ 1. Конвертация непосредственно в ПКС (без отдельного ПКО)

Это наиболее чистый и рекомендуемый подход, не требующий создания лишних правил конвертации объектов.

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

Если Источник.СтавкаНДС.Наименование = "10%" Тогда
    Значение = "НДС10";
ИначеЕсли Источник.СтавкаНДС.Наименование = "18%" Тогда
    Значение = "НДС18";
КонецЕсли;

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


Если Источник.СтавкаНДС.Наименование = "10%" Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС10";
ИначеЕсли Источник.СтавкаНДС.Наименование = "18%" Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС18";
КонецЕсли;

Способ 2. Настройка ПКО с подменой УзелСсылки и отмена выгрузки

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

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

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

  1. В обработчике ПКО «После выгрузки» подменяем имя узла ссылки и отменяем стандартное формирование XML-узла объекта:

Если Источник.Наименование = "10%" Тогда
    УзелСсылки = "НДС10";
ИначеЕсли Источник.Наименование = "18%" Тогда
    УзелСсылки = "НДС18";
КонецЕсли;

Отказ = ИСТИНА;

Благодаря этому вместо структуры справочника в XML запишется только текстовый идентификатор перечисления, а переменная Отказ = ИСТИНА предотвратит выгрузку ненужных реквизитов.

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

Посмотрим на ещё один способ, при котором в файл передается строковое значение, а поиск перечисления происходит в базе-приемнике.

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

Значение = Перечисления.СтавкиНДС[Значение];

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

← На главную