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