Перечисления — один из самых часто используемых объектов метаданных в 1С:Предприятие 8.3. Однако у разработчиков нередко возникает задача: получить имя значения перечисления, заданное в конфигураторе (а не синоним и не представление), в т.ч. прямо в запросе. В этой статье разберём все основные способы решения этой задачи.
Что такое имя, синоним и представление перечисления
Прежде чем переходить к коду, важно различать три понятия:
- Имя — идентификатор значения перечисления, заданный в конфигураторе (например,
ОплатаПоставщику). Используется в коде и запросах. - Синоним — пользовательское представление значения (например, «Оплата поставщику»).
- Представление — то, что видит пользователь; по умолчанию совпадает с синонимом.
Получение имени значения перечисления встроенным языком
Классический способ получить имя значения перечисления, через метаданные и индекс значения:
ЗначениеПеречисления = Перечисления.ВидыОперацийРКО.ОплатаПоставщику; ИмяПеречисления = ЗначениеПеречисления.Метаданные.Имя; ИндексЗначения = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления); ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления] .ЗначенияПеречисления[ИндексЗначения].Имя; Сообщить(ИмяЗначения); // "ОплатаПоставщику"
Этот код универсален: он работает для любого значения любого перечисления, поскольку имя самого перечисления получается динамически через метод Метаданные.
Универсальная функция
Функция ПолучитьИмяЗначенияПеречисления(ЗначениеПеречисления) Экспорт ИмяПеречисления = ЗначениеПеречисления.Метаданные.Имя; Индекс = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления); Возврат Метаданные.Перечисления[ИмяПеречисления] .ЗначенияПеречисления[Индекс].Имя; КонецФункции
Получение имени перечисления в запросе 1С
Язык запросов 1С не имеет встроенной функции для получения имени значения перечисления, заданного в метаданных. Но есть несколько практических подходов.
Способ 1. Функция ЗНАЧЕНИЕ для сравнения
Чаще всего имя значения перечисления нужно не «вывести», а использовать для отбора. Для этого применяется литерал функционального типа ЗНАЧЕНИЕ:
ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, Контрагенты.Статус КАК Статус ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.Статус = ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрагента.ИП)
Здесь в параметре функции ЗНАЧЕНИЕ указывается полный путь к значению перечисления: Перечисление.ИмяПеречисления.ИмяЗначения.
Способ 2. Представление значения через ПРЕДСТАВЛЕНИЕ
Если нужно вывести значение перечисления в виде строки (синоним), используйте функцию ПРЕДСТАВЛЕНИЕ:
ВЫБРАТЬ ЧекККМ.Номер КАК Номер, ПРЕДСТАВЛЕНИЕ(ЧекККМ.ВидОперации) КАК ВидОперацииСтрокой ИЗ Документ.ЧекККМ КАК ЧекККМ
Учтите: эта функция возвращает представление (синоним), а не имя из метаданных.
Способ 3. Перебор значений через ВЫБОР
Если нужно получить именно имя значения в результате запроса, можно явно перечислить варианты:
ВЫБРАТЬ ЧекККМ.Ссылка КАК Ссылка, ВЫБОР КОГДА ЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Продажа) ТОГДА "Продажа" КОГДА ЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Возврат) ТОГДА "Возврат" ИНАЧЕ "Неопределено" КОНЕЦ КАК ИмяЗначенияПеречисления ИЗ Документ.ЧекККМ КАК ЧекККМ
Способ 4. Преобразование в строку встроенным языком
После выполнения запроса значение перечисления можно преобразовать в строку функциями Строка или XMLСтрока. При этом XMLСтрока для перечислений возвращает именно имя значения из метаданных:
ИмяЗначения = XMLСтрока(Перечисления.ВидыОперацийРКО.ОплатаПоставщику); // Результат: "ОплатаПоставщику"
Это самый короткий способ получить имя значения перечисления без обращения к метаданным.
Получение имени перечисления по синониму
Иногда стоит обратная задача — по известному синониму найти имя значения. Решается перебором метаданных:
Функция ИмяПеречисленияПоСинониму(СинонимПеречисления) Экспорт Для Каждого МетаПеречисление Из Метаданные.Перечисления Цикл Для Каждого Значение Из МетаПеречисление.ЗначенияПеречисления Цикл Если Значение.Синоним = СинонимПеречисления Тогда Возврат Значение.Имя; КонецЕсли; КонецЦикла; КонецЦикла; Возврат ""; КонецФункции
- Для получения имени значения перечисления в коде используйте
Метаданные+Индекслибо краткий вариант —XMLСтрока. - В запросах для отбора по значению перечисления применяйте функцию
ЗНАЧЕНИЕ. - Для вывода строкового представления в запросе используйте
ПРЕДСТАВЛЕНИЕили конструкциюВЫБОР. - Помните о разнице между именем, синонимом и представлением, это избавит от многих ошибок.
Эти приёмы покрывают практически все сценарии работы с перечислениями в 1С:Предприятие 8.2 и 8.3, как во встроенном языке, так и в языке запросов.