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

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

При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда в источнике (например, в «Комплексной автоматизации 1.1» или «УПП») ставка НДС реализована как Перечисление, а в приемнике (например, в «УНФ» или «ERP») — как Справочник. Поскольку это разные типы метаданных, простое сопоставление полей «по умолчанию» не сработает. Рассмотрим подробно, как решить эту задачу в «1С:Конвертация данных 2.1».

Постановка задачи и анализ проблемы

Допустим, мы переносим документ ПриходнаяНакладная. В источнике реквизит СтавкаНДС — это ПеречислениеСсылка.СтавкиНДС (значения: НДС20, НДС20_120, БезНДС). В приемнике это СправочникСсылка.СтавкиНДС (элементы: «20%», «20% / 120%», «Без НДС»). Прямое присвоение невозможно, так как система не сможет сопоставить GUID перечисления и GUID элемента справочника.

Рассмотрим по шагам, как настроить правила конвертации объектов (ПКО) и свойств (ПКС) для корректного поиска.

Способ 1. Создание отдельного ПКО для связи «Перечисление -> Справочник»

Это самый «чистый» и правильный метод с точки зрения архитектуры КД 2.1. Мы создаем правило, которое объясняет системе, как превратить значение перечисления в ссылку на справочник.

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

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


Если Источник = Перечисления.СтавкиНДС.БезНДС Тогда
    Значение = "Без НДС";
ИначеЕсли Источник = Перечисления.СтавкиНДС.НДС20 Тогда
    Значение = "20%";
ИначеЕсли Источник = Перечисления.СтавкиНДС.НДС20_120 Тогда
    Значение = "20% / 120%";
Иначе
    Значение = Строка(Источник); // Попытка привести к строке, если нет явного соответствия
КонецЕсли;

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

Способ 2. Использование параметра «Выражение» в ПКС

Иногда программисты пытаются использовать параметр Выражение для поиска объекта прямо в базе-приемнике. Разберем, как это работает, и каких ошибок следует избегать. Параметр Выражение — это строка кода, которая будет выполнена на стороне приемника в момент загрузки.

Если мы хотим найти ставку НДС по наименованию непосредственно при загрузке документа, в ПКС реквизита СтавкаНДС (в правиле конвертации документа) можно написать следующее в обработчике Перед выгрузкой:


Если Источник.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
    Выражение = "Справочники.СтавкиНДС.НайтиПоНаименованию(""Без НДС"")";
ИначеЕсли Источник.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
    Выражение = "Справочники.СтавкиНДС.НайтиПоНаименованию(""20%"")";
КонецЕсли;

Проанализируем типичную ошибку: неправильное экранирование кавычек. Поскольку Выражение само по себе является строкой, все кавычки внутри него (для строковых параметров методов 1С) должны быть двойными. Также не забывайте про точку с запятой в конце выражения, если этого требует версия обработки обмена.

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

Типичные ошибки при реализации

Рассмотрим ситуации, из-за которых данные могут не заполниться:

Оптимизация: кэширование поиска

Если вы переносите тысячи документов, постоянный поиск справочника по наименованию создаст нагрузку на базу. Чтобы ускорить загрузку, проанализируем возможность использования кэша. В обработчике Перед началом конвертации или в Перед загрузкой данных можно создать соответствие и заполнить его ссылками на справочник СтавкиНДС.

Пример кода в ПКС документа (Перед выгрузкой) с передачей кода объекта:


// В источнике определяем только имя или код для поиска
Если Источник.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
    Значение = "00001"; // Код элемента "20%" в справочнике приемника
КонецЕсли;

В этом случае в ПКО для СтавкиНДС поиск должен быть настроен по Коду. Поиск по коду (индексному полю) всегда быстрее, чем по наименованию.

Итоговый алгоритм настройки (резюме)

Рассмотрим финальную последовательность действий, которая гарантированно приведет к результату:

  1. Приведите наименования элементов справочника в приемнике к понятному виду (например, «Без НДС», «20%»).
  2. В ПКС для свойства Наименование (в ПКО справочника) напишите Значение = Строка(Источник);.
  3. Установите галку «Поиск объекта при загрузке по свойству» для этого ПКС.
  4. В настройках ПКО справочника снимите галку «Искать по внутреннему идентификатору».
  5. В ПКС документа выберите созданное ПКО для реквизита СтавкаНДС.

Таким образом, система при выгрузке превратит ссылку перечисления в строку (наименование), а при загрузке выполнит поиск в справочнике по этой строке и подставит найденную ссылку в документ.

← На главную