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

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

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

Особенности конвертации типов «Справочник — Перечисление»

Проанализируем базовый принцип: перечисление в 1С — это фиксированный набор значений, а справочник — это динамическая сущность. При конвертации перечисления в справочник системе необходимо указать, какому конкретному элементу справочника соответствует значение перечисления. Рассмотрим два основных способа реализации этой задачи.

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

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


Если Строка(Источник) = "Запас" Тогда 
    Значение = "Товары"; 
Иначе 
    Значение = "Услуги"; 
КонецЕсли;

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

Работа с табличными частями: Источник vs ОбъектКоллекции

Разберем одну из самых частых ошибок, с которой сталкиваются разработчики при написании кода в ПКС. Когда свойство (например, «Ставка НДС») находится в табличной части документа, попытка обратиться к нему через Источник.СтавкаНДС часто приводит к ошибке «Поле объекта не обнаружено» или к некорректной выгрузке всего документа.

Выясним причину: в контексте выполнения ПКС для реквизита табличной части переменная Источник может указывать на сам документ-владелец, а не на текущую строку. Для доступа к данным текущей строки табличной части необходимо использовать переменную ОбъектКоллекции.

Рассмотрим правильный пример обращения к ставке НДС внутри табличной части:


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

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

Сложная логика определения ставки НДС

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


// Обращаемся к реквизитам справочника СтавкиНДС через ОбъектКоллекции (строку ТЧ)
Если ОбъектКоллекции.СтавкаНДС.Ставка = 10 И ОбъектКоллекции.СтавкаНДС.Облагается Тогда 
    Значение = "НДС10_110"; 
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 18 И ОбъектКоллекции.СтавкаНДС.Облагается Тогда 
    Значение = "НДС18_118"; 
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Облагается Тогда 
    Значение = "НДС20_120"; 
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 0 И НЕ ОбъектКоллекции.СтавкаНДС.Облагается Тогда 
    Значение = "НДС0"; 
Иначе 
    Значение = "БезНДС"; 
КонецЕсли;

Здесь мы программно подготавливаем строковый идентификатор перечисления для базы-приемника. В приемнике (например, БП 3.0) эти значения сопоставятся с именами перечисления СтавкиНДС.

Поиск объектов в базе-приемнике по наименованию

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

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

// Для планов счетов
Значение = "26"; // Передаем код, а в ПКО счетов включаем поиск по коду

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


Значение = "Расход на мобильник"; // Имя будет использовано для поиска в приемнике

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

Часто программисты создают ПКО (Правило конвертации объектов), загружают правила в базу, но не видят новый тип документа в списке для выгрузки. Выясним причину этого поведения.

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

Чтобы ваша «Реализация» или «Поступление» появились в списке:

Итоговые рекомендации

Подводя итог, проанализируем основные правила успешной конвертации:

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

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

← На главную