Получение имени значения перечисления в 1С:Предприятие 8.3

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Перечисления — один из самых часто используемых объектов метаданных в 1С:Предприятие 8.3. Однако у разработчиков нередко возникает задача: получить имя значения перечисления, заданное в конфигураторе (а не синоним и не представление), в т.ч. прямо в запросе. В этой статье разберём все основные способы решения этой задачи.

Что такое имя, синоним и представление перечисления

Прежде чем переходить к коду, важно различать три понятия:

  • Имя — идентификатор значения перечисления, заданный в конфигураторе (например, ОплатаПоставщику). Используется в коде и запросах.
  • Синоним — пользовательское представление значения (например, «Оплата поставщику»).
  • Представление — то, что видит пользователь; по умолчанию совпадает с синонимом.

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

Классический способ получить имя значения перечисления, через метаданные и индекс значения:

ЗначениеПеречисления = Перечисления.ВидыОперацийРКО.ОплатаПоставщику;

ИмяПеречисления = ЗначениеПеречисления.Метаданные.Имя;
ИндексЗначения = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления]
 .ЗначенияПеречисления[ИндексЗначения].Имя;

Сообщить(ИмяЗначения); // "ОплатаПоставщику"

Этот код универсален: он работает для любого значения любого перечисления, поскольку имя самого перечисления получается динамически через метод Метаданные.

Универсальная функция

Функция ПолучитьИмяЗначенияПеречисления(ЗначениеПеречисления) Экспорт
 ИмяПеречисления = ЗначениеПеречисления.Метаданные.Имя;
 Индекс = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
 Возврат Метаданные.Перечисления[ИмяПеречисления]
 .ЗначенияПеречисления[Индекс].Имя;
КонецФункции

Получение имени перечисления в запросе 1С

Язык запросов 1С не имеет встроенной функции для получения имени значения перечисления, заданного в метаданных. Но есть несколько практических подходов.

Способ 1. Функция ЗНАЧЕНИЕ для сравнения

Чаще всего имя значения перечисления нужно не «вывести», а использовать для отбора. Для этого применяется литерал функционального типа ЗНАЧЕНИЕ:

ВЫБРАТЬ
 Контрагенты.Наименование КАК Наименование,
 Контрагенты.Статус КАК Статус
ИЗ
 Справочник.Контрагенты КАК Контрагенты
ГДЕ
 Контрагенты.Статус = ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрагента.ИП)

Здесь в параметре функции ЗНАЧЕНИЕ указывается полный путь к значению перечисления: Перечисление.ИмяПеречисления.ИмяЗначения.

Способ 2. Представление значения через ПРЕДСТАВЛЕНИЕ

Если нужно вывести значение перечисления в виде строки (синоним), используйте функцию ПРЕДСТАВЛЕНИЕ:

ВЫБРАТЬ
 ЧекККМ.Номер КАК Номер,
 ПРЕДСТАВЛЕНИЕ(ЧекККМ.ВидОперации) КАК ВидОперацииСтрокой
ИЗ
 Документ.ЧекККМ КАК ЧекККМ

Учтите: эта функция возвращает представление (синоним), а не имя из метаданных.

Способ 3. Перебор значений через ВЫБОР

Если нужно получить именно имя значения в результате запроса, можно явно перечислить варианты:

ВЫБРАТЬ
 ЧекККМ.Ссылка КАК Ссылка,
 ВЫБОР
 КОГДА ЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Продажа)
 ТОГДА "Продажа"
 КОГДА ЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Возврат)
 ТОГДА "Возврат"
 ИНАЧЕ "Неопределено"
 КОНЕЦ КАК ИмяЗначенияПеречисления
ИЗ
 Документ.ЧекККМ КАК ЧекККМ

Способ 4. Преобразование в строку встроенным языком

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


ИмяЗначения = XMLСтрока(Перечисления.ВидыОперацийРКО.ОплатаПоставщику);
// Результат: "ОплатаПоставщику"

Это самый короткий способ получить имя значения перечисления без обращения к метаданным.

Получение имени перечисления по синониму

Иногда стоит обратная задача — по известному синониму найти имя значения. Решается перебором метаданных:

Функция ИмяПеречисленияПоСинониму(СинонимПеречисления) Экспорт
 Для Каждого МетаПеречисление Из Метаданные.Перечисления Цикл
 Для Каждого Значение Из МетаПеречисление.ЗначенияПеречисления Цикл
 Если Значение.Синоним = СинонимПеречисления Тогда
 Возврат Значение.Имя;
 КонецЕсли;
 КонецЦикла;
 КонецЦикла;
 Возврат "";
КонецФункции
  1. Для получения имени значения перечисления в коде используйте Метаданные + Индекс либо краткий вариант — XMLСтрока.
  2. В запросах для отбора по значению перечисления применяйте функцию ЗНАЧЕНИЕ.
  3. Для вывода строкового представления в запросе используйте ПРЕДСТАВЛЕНИЕ или конструкцию ВЫБОР.
  4. Помните о разнице между именем, синонимом и представлением, это избавит от многих ошибок.

Эти приёмы покрывают практически все сценарии работы с перечислениями в 1С:Предприятие 8.2 и 8.3, как во встроенном языке, так и в языке запросов.