При разработке правил обмена в конфигурации «Конвертация данных» (КД 2) часто возникает задача сопоставить значение перечисления базы-источника с предопределенным элементом справочника или плана видов расчета в базе-приемнике. Начинающие разработчики нередко пытаются получить идентификатор значения через конструкцию ОбъектКоллекции.ВидОперации.Метаданные().Имя или .Метаданные.Имя, однако такой подход приводит к ошибке или возвращает имя самого объекта конфигурации (например, ВидыОпераций), а не выбранного элемента (например, НачисленоДоход).
Разберем причины такого поведения платформы 1С:Предприятие и рассмотрим надежные способы получения строкового имени значения перечисления и правильной настройки обработчиков конвертации свойств.
Проанализируем структуру ссылочных типов платформы. У объекта типа ПеречислениеСсылка.<ИмяПеречисления> метод Метаданные() возвращает объект метаданных всей коллекции перечисления, а не конкретного пункта списка. Поэтому обращение к свойству Имя всегда возвращает имя метаданного объекта из дерева конфигурации.
Для получения имени конкретного значения или проверки условия в коде необходимо использовать специализированные механизмы платформы или библиотеки стандартных подсистем (БСП).
Самый быстрый, лаконичный и универсальный способ преобразовать ссылку перечисления в строковый идентификатор, заданный в конфигураторе — вызов платформенной функции XMLСтрока(). Данная функция работает как в обычном коде, так и внутри любых обработчиков «Конвертации данных» без необходимости подключения дополнительных библиотек.
Посмотрим на пример использования функции:
ИмяЗначения = XMLСтрока(ОбъектКоллекции.ВидОперации);
Если ИмяЗначения = "НачисленоДоход" Тогда
Значение = "ОКЛ";
ИмяПКО = "НачисленияЗарплата";
КонецЕсли;
Если вам требуется проверить конкретное условие в коде источника, нет необходимости преобразовывать значение в строку. Надежнее и производительнее сравнивать ссылку со значением менеджера перечислений напрямую:
Если ОбъектКоллекции.ВидОперации = Перечисления.ВидыОпераций.НачисленоДоход Тогда
Значение = "ОКЛ";
ИмяПКО = "НачисленияЗарплата";
КонецЕсли;
Если код должен быть универсальным или имя перечисления определяется динамически, можно использовать функцию ПредопределенноеЗначение():
Если ОбъектКоллекции.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОпераций.НачисленоДоход") Тогда
Значение = "ОКЛ";
ИмяПКО = "НачисленияЗарплата";
КонецЕсли;
Если база-источник построена на базе БСП (например, ЗУП 3.1, ERP 2, УТ 11, БП 3.0), для получения строкового имени значения перечисления доступна готовая экспортная функция общего модуля:
ИмяЭлемента = ОбщегоНазначения.ИмяЗначенияПеречисления(ОбъектКоллекции.ВидОперации);
Если ИмяЭлемента = "НачисленоДоход" Тогда
Значение = "ОКЛ";
ИмяПКО = "НачисленияЗарплата";
КонецЕсли;
В случаях, когда конфигурация не содержит БСП, а имя типа перечисления заранее неизвестно, имя значения можно получить программно через поиск индекса элемента в коллекции менеджера:
ЗначениеПеречисления = ОбъектКоллекции.ВидОперации;
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеПеречисления));
Если ОбъектМетаданных <> Неопределено Тогда
Индекс = Перечисления[ОбъектМетаданных.Имя].Индекс(ЗначениеПеречисления);
ИмяЗначения = ОбъектМетаданных.ЗначенияПеречисления[Индекс].Имя;
Если ИмяЗначения = "НачисленоДоход" Тогда
Значение = "ОКЛ";
ИмяПКО = "НачисленияЗарплата";
КонецЕсли;
КонецЕсли;
При программной обработке свойств в правилах конвертации (обработчики «Перед выгрузкой» или «При выгрузке») важно учитывать логику работы механизма выгрузки:
Значение и ИмяПКО должны принимать корректные значения при любом исходе ветвления условий.
Отказ = Истина;
Это защитит XML-файл от формирования пустых или некорректных узлов.
Значение передается строковое имя предопределенного элемента (например, "ОКЛ"), а в соответствующем ПКО приемника настраивается поиск по имени предопределенных данных.