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

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

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

Метод 1. Программное формирование узла ссылки в ПКО

Рассмотрим наиболее распространенный способ решения задачи через обработчики событий ПКО. Этот метод удобен, когда нам нужно полностью контролировать процесс подмены объекта справочника на значение перечисления. В этом случае мы создаем ПКО, где Источник — это наш справочник, а Приемник — перечисление. Для более удобного написания кода в событиях и навигации по правилам подойдёт доработанная конфигурация КД с подсказками по обработчикам.

Для корректной работы нам потребуется написать код в обработчике "После выгрузки". Проанализируем пример кода для конвертации ставок НДС:


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

Отказ = Истина;

Важные моменты:

  1. Переменная УзелСсылки должна содержать строковое имя (идентификатор) значения перечисления в конфигурации-приемнике.
  2. Установка Отказ = Истина в конце обработчика обязательна. Это говорит системе, что стандартную выгрузку объекта выполнять не нужно, так как мы сформировали ссылку вручную.
  3. Необходимо учитывать типы данных в источнике. Если реквизит Ставка числовой, сравнение идет с числами. Если это ссылка на другой справочник, нужно обращаться к его реквизитам.

Метод 2. Использование ПКС и переменной "Значение"

Если логика сопоставления достаточно проста, мы можем избежать создания отдельного ПКО для перечисления и реализовать всё в Правиле Конвертации Свойства (ПКС) конкретного объекта (например, в ПКС СтавкаНДС справочника Номенклатура).

Для этого в настройках ПКС установим флаг "Отключить автоматическое копирование данных из источника" и в обработчике "Перед выгрузкой" напишем следующий код:


// Определяем строковое значение для перечисления-приемника
Если Источник.СтавкаНДС.Наименование = "18%" Тогда
    Значение = "НДС18";
ИначеЕсли Источник.СтавкаНДС.Наименование = "10%" Тогда
    Значение = "НДС10";
Иначе
    Значение = "БезНДС";
КонецЕсли;

В данном случае в переменную Значение мы передаем имя элемента перечисления. Система при загрузке сама найдет нужное значение по этому имени.

Проблема кэширования: Почему все объекты становятся одинаковыми?

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

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

Решение: В настройках ПКО необходимо установить флаг "Не запоминать выгруженные объекты". Это заставит систему каждый раз заново выполнять код обработчиков и не полагаться на таблицу соответствий в оперативной памяти.

Метод 3. Работа с составными типами данных

Ситуация усложняется, если реквизит в базе-приемнике имеет составной тип (например, может принимать значения и справочников, и перечислений). В этом случае простой передачи строки в Значение или УзелСсылки недостаточно, так как загрузчик не поймет, к какому именно метаданному относится эта строка.

Рассмотрим, как правильно указать тип в обработчике "Перед выгрузкой" ПКС:


Если ТипЗнч(ОбъектКоллекции.СтавкаНДС) = Тип("СправочникСсылка.СтавкиНДС") Тогда
    ТипПриемника = "ПеречислениеСсылка.СтавкиНДС";
    // Далее логика определения конкретного значения
    Значение = "НДС18"; 
КонецЕсли;

Использование переменной ТипПриемника позволяет явно прописать в XML-файле тип выгружаемого значения, что гарантирует корректную интерпретацию данных на стороне базы-приемника. Для проверки корректности сформированного файла обмена до загрузки в приемник можно использовать обработку для анализа состава выгруженных данных.

Метод 4. Оптимизация через параметры и "Соответствие"

Если справочник-источник содержит тысячи элементов, постоянный поиск по наименованию или ставкам в коде может замедлить выгрузку. Посмотрим на пример оптимизации с использованием глобального соответствия.

1. В обработчике конвертации "Перед выгрузкой данных" инициализируем таблицу сопоставления:


Параметры.СоответствиеСтавок = Новый Соответствие;
// Заполняем таблицу (можно запросом или поиском)
Ссылка18 = Справочники.СтавкиНДС.НайтиПоНаименованию("18%");
Параметры.СоответствиеСтавок.Вставить(Ссылка18, "НДС18");

2. В ПКС или ПКО используем это соответствие:


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

Резюме и рекомендации

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

Рассмотренные подходы позволяют гибко настраивать обмен данными в 1С:Конвертация данных 2.1, обеспечивая высокую точность переноса информации даже при значительных различиях в архитектуре конфигураций. Если подготовленные правила планируется применять для постоянной синхронизации, можно автоматизировать регулярный обмен данными между базами 1С по расписанию без изменения самих конфигураций.

← На главную