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