К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить перечисление по имени в 1С

Как получить значение перечисления по имени в 1С: через ПредопределенноеЗначение, метаданные и менеджер перечисления. Примеры кода, ошибки и проверка результата.

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

Если имя перечисления и имя значения известны заранее, правильный путь — прямое обращение вида Перечисления.СтавкиНДС.НДС20. Такой код проверяется компилятором, работает быстро и подсвечивается в конфигураторе. Динамическое получение по строковому имени нужно реже: при универсальных обработках загрузки, сопоставлении данных из внешних систем и в механизмах, где тип объекта не зафиксирован.

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

Прямое обращение через менеджер перечисления

Самый простой и надёжный способ — обращение через коллекцию Перечисления глобального контекста. Доступны два синтаксиса: через точку и через квадратные скобки со строковым именем.

// Имя известно на этапе разработки

Ставка = Перечисления.СтавкиНДС.НДС20;

// Имя значения задано строкой

ИмяЗначения = "НДС20";

Ставка = Перечисления.СтавкиНДС[ИмяЗначения];

// Имя перечисления тоже строкой

Ставка = Перечисления["СтавкиНДС"]["НДС20"];

Синтаксис с квадратными скобками не проверяется компилятором: если значения с таким именем нет, ошибка возникнет только в момент выполнения. Поэтому перед обращением по строке стоит проверять существование значения через метаданные либо оборачивать вызов в попытку.

Получение значения через ПредопределенноеЗначение

Функция ПредопределенноеЗначение принимает полный путь к предопределённому элементу в виде строки и возвращает само значение. Для перечислений путь строится по шаблону Перечисление.ИмяПеречисления.ИмяЗначения.

Ставка = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");

// Динамически

ПолноеИмя = "Перечисление." + ИмяПеречисления + "." + ИмяЗначения;

Ставка = ПредопределенноеЗначение(ПолноеИмя);

Если путь некорректен, функция возвращает Неопределено — исключения не будет. Это удобно для безопасного разбора внешних данных: достаточно сравнить результат с Неопределено, чтобы понять, что значение не найдено. Минус — отсутствие диагностики: по результату нельзя отличить опечатку в имени перечисления от опечатки в имени значения.

bsl
Значение = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");
Если Значение = Неопределено Тогда
    ВызватьИсключение "Значение перечисления не найдено";
КонецЕсли;

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

Когда имя приходит извне (файл обмена, настройка, параметр отчёта), корректный подход — сначала убедиться, что перечисление и значение существуют в конфигурации. Для этого используется объект Метаданные.

Функция НайтиЗначениеПеречисления(ИмяПеречисления, ИмяЗначения)

МетаПеречисление = Метаданные.Перечисления.Найти(ИмяПеречисления);

Если МетаПеречисление = Неопределено Тогда

Возврат Неопределено;

КонецЕсли;

МетаЗначение = МетаПеречисление.ЗначенияПеречисления.Найти(ИмяЗначения);

Если МетаЗначение = Неопределено Тогда

Возврат Неопределено;

КонецЕсли;

Возврат Перечисления[ИмяПеречисления][ИмяЗначения];

КонецФункции

Такой подход даёт понятную диагностику: можно отдельно сообщить, что не найдено перечисление, а что — значение. Это особенно полезно в обработках загрузки, где ошибку нужно показать пользователю в читаемом виде, а не в виде системного исключения.

Безопасный порядок получения значения по строке
  1. 1
    Проверьте существование перечисления через Метаданные.Перечисления.Найти(Имя)
  2. 2
    Проверьте существование значения через ЗначенияПеречисления.Найти(ИмяЗначения)
  3. 3
    Получите значение через Перечисления[Имя][Значение] или ПредопределенноеЗначение
  4. 4
    Проверьте результат на Неопределено и залогируйте ошибку при неудаче

Получение имени значения из самого значения (обратная задача)

Часто встречается и обратная задача: есть значение перечисления, нужно получить его имя как строку — например, для выгрузки в XML, JSON или для записи в лог. Прямого свойства «Имя» у значения перечисления нет, имя извлекается через метаданные.

Функция ИмяЗначенияПеречисления(Значение)

МетаЗначение = Значение.Метаданные();

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

Возврат МетаЗначение.ЗначенияПеречисления[Индекс].Имя;

КонецФункции

// Пример: вернёт "НДС20"

Имя = ИмяЗначенияПеречисления(Перечисления.СтавкиНДС.НДС20);

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

Сравнение способов и условия выбора

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

Способы получения значения

Перечисления.Имя.Значение

Когда имя известно при разработке. Проверяется компилятором, самый быстрый и надёжный вариант

Перечисления[Имя][Значение]

Когда имена динамические. Требует проверки через метаданные или обработки исключений

ПредопределенноеЗначение

Когда есть полный путь строкой и допустимо получить Неопределено вместо исключения. Удобно для разбора внешних данных

Через Метаданные + менеджер

Когда нужна диагностика ошибок и сообщения пользователю в обработках загрузки

Для серверного кода с известными именами всегда выбирайте прямое обращение через точку. Динамические варианты оставляйте для универсальных механизмов, где тип данных действительно не определён заранее.

Типичные ошибки и ограничения

Типичные ошибки
01
Опечатка в строковом имени без проверки — ошибка проявляется только в рантайме и только на конкретных данных
02
Использование синонима вместо имени — синоним может быть на русском и с пробелами, обращение по нему невозможно, нужно имя из конфигуратора
03
Ожидание исключения от ПредопределенноеЗначение — функция возвращает Неопределено, и код молча работает с пустым значением
04
Получение значения на клиенте в тонком клиенте там, где недоступен контекст — обращение к перечислениям допустимо, но логику лучше держать на сервере
05
Игнорирование переименования значения при обновлении конфигурации — внешние обработки со строковыми именами ломаются после обновления

Отдельно стоит ограничение внешних обработок: если обработка обращается к перечислению по строковому имени, а в новой версии конфигурации значение переименовали, обработка перестанет работать без какого-либо предупреждения на этапе подключения. Поэтому в коде, зависящем от строковых имён, полезно добавить самопроверку при старте — попытку получить все используемые значения с понятным сообщением об ошибке.

Проверка результата

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

Контрольные точки

Как проверить результат

Результат получения значения
Норма

Значение не равно Неопределено, ТипЗнч показывает ПеречислениеСсылка.ИмяПеречисления

Тревожный признак

Неопределено или значение другого типа

Обратное получение имени
Норма

ИмяЗначенияПеречисления возвращает исходную строку

Тревожный признак

Возвращается другое имя или пустая строка

Использование в запросе
Норма

Запрос с параметром-перечислением отбирает ожидаемые записи

Тревожный признак

Пустой результат при заведомо существующих данных

Для отладки удобно вывести полученное значение через Сообщить или в журнал регистрации вместе с типом: ТипЗнч(Значение). Это сразу показывает, получена ли ссылка на перечисление или что-то иное.

Итог

Что важно запомнить

Известное имя — обращение через точку. Строковое имя — квадратные скобки или ПредопределенноеЗначение с проверкой на Неопределено. Для внешних данных сначала проверяйте существование через Метаданные. Обратное получение имени — через Индекс и ЗначенияПеречисления или функции БСП.

Частые вопросы

Чем отличается Перечисления.СтавкиНДС.НДС20 от ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20")?

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

Можно ли получить значение перечисления по синониму, например «НДС 20%»?

Нет, обращение возможно только по имени, заданному в конфигураторе. Синоним — это представление для пользователя, оно может содержать пробелы и меняться без влияния на код. Если извне приходит синоним, нужно заранее построить таблицу соответствия синонимов именам.

Почему ПредопределенноеЗначение возвращает Неопределено, хотя значение есть?

Чаще всего причина в неверном пути: лишний пробел, неправильный регистр не влияет, а вот пропущенный сегмент «Перечисление.» или опечатка в имени — да. Проверьте путь по шаблону Перечисление.ИмяПеречисления.ИмяЗначения и сверьте имена с конфигуратором.

Как перебрать все значения перечисления?

Через метаданные: цикл по Метаданные.Перечисления[Имя].ЗначенияПеречисления, внутри цикла получение значения как Перечисления[Имя][МетаЗначение.Имя]. Это стандартный способ заполнить список выбора или таблицу соответствия.

Работает ли обращение по строковому имени на тонком клиенте?

Да, менеджеры перечислений и функция ПредопределенноеЗначение доступны на клиенте. Однако обращение к Метаданные на клиенте ограничено в некоторых режимах, поэтому проверки существования надёжнее выполнять в серверной процедуре.

Что делать, если имена значений приходят из файла обмена другой конфигурации?

Имена в разных конфигурациях могут не совпадать даже для одинаковых по смыслу перечислений. Создайте таблицу соответствия «внешнее имя — внутреннее имя», а при отсутствии соответствия фиксируйте ошибку загрузки вместо подстановки Неопределено.