Как получить имя значения перечисления в алгоритмах Конвертации данных

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

При разработке правил обмена в конфигурации «Конвертация данных» (КД 2) часто возникает задача сопоставить значение перечисления базы-источника с предопределенным элементом справочника или плана видов расчета в базе-приемнике. Начинающие разработчики нередко пытаются получить идентификатор значения через конструкцию ОбъектКоллекции.ВидОперации.Метаданные().Имя или .Метаданные.Имя, однако такой подход приводит к ошибке или возвращает имя самого объекта конфигурации (например, ВидыОпераций), а не выбранного элемента (например, НачисленоДоход).

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

Почему Метаданные.Имя не возвращает имя элемента перечисления

Проанализируем структуру ссылочных типов платформы. У объекта типа ПеречислениеСсылка.<ИмяПеречисления> метод Метаданные() возвращает объект метаданных всей коллекции перечисления, а не конкретного пункта списка. Поэтому обращение к свойству Имя всегда возвращает имя метаданного объекта из дерева конфигурации.

Для получения имени конкретного значения или проверки условия в коде необходимо использовать специализированные механизмы платформы или библиотеки стандартных подсистем (БСП).

Способ 1. Использование системной функции XMLСтрока

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

Посмотрим на пример использования функции:


ИмяЗначения = XMLСтрока(ОбъектКоллекции.ВидОперации);
Если ИмяЗначения = "НачисленоДоход" Тогда
    Значение = "ОКЛ";
    ИмяПКО = "НачисленияЗарплата";
КонецЕсли;

Способ 2. Прямое сравнение ссылок перечисления

Если вам требуется проверить конкретное условие в коде источника, нет необходимости преобразовывать значение в строку. Надежнее и производительнее сравнивать ссылку со значением менеджера перечислений напрямую:


Если ОбъектКоллекции.ВидОперации = Перечисления.ВидыОпераций.НачисленоДоход Тогда
    Значение = "ОКЛ";
    ИмяПКО = "НачисленияЗарплата";
КонецЕсли;

Если код должен быть универсальным или имя перечисления определяется динамически, можно использовать функцию ПредопределенноеЗначение():


Если ОбъектКоллекции.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОпераций.НачисленоДоход") Тогда
    Значение = "ОКЛ";
    ИмяПКО = "НачисленияЗарплата";
КонецЕсли;

Способ 3. Использование функций Библиотеки стандартных подсистем (БСП)

Если база-источник построена на базе БСП (например, ЗУП 3.1, ERP 2, УТ 11, БП 3.0), для получения строкового имени значения перечисления доступна готовая экспортная функция общего модуля:


ИмяЭлемента = ОбщегоНазначения.ИмяЗначенияПеречисления(ОбъектКоллекции.ВидОперации);
Если ИмяЭлемента = "НачисленоДоход" Тогда
    Значение = "ОКЛ";
    ИмяПКО = "НачисленияЗарплата";
КонецЕсли;

Способ 4. Универсальное получение имени через коллекцию метаданных

В случаях, когда конфигурация не содержит БСП, а имя типа перечисления заранее неизвестно, имя значения можно получить программно через поиск индекса элемента в коллекции менеджера:


ЗначениеПеречисления = ОбъектКоллекции.ВидОперации;
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеПеречисления));

Если ОбъектМетаданных <> Неопределено Тогда
    Индекс = Перечисления[ОбъектМетаданных.Имя].Индекс(ЗначениеПеречисления);
    ИмяЗначения = ОбъектМетаданных.ЗначенияПеречисления[Индекс].Имя;
    
    Если ИмяЗначения = "НачисленоДоход" Тогда
        Значение = "ОКЛ";
        ИмяПКО = "НачисленияЗарплата";
    КонецЕсли;
КонецЕсли;

Правила заполнения переменных в обработчиках ПКС (Конвертация данных)

При программной обработке свойств в правилах конвертации (обработчики «Перед выгрузкой» или «При выгрузке») важно учитывать логику работы механизма выгрузки:

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