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