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

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

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

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

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

Главный инструмент для получения программного имени значения — метод ПолучитьИмяЗначенияПеречисления (в англоязычном синтаксисе GetEnumValueName). Он возвращает имя, заданное разработчиком в конфигураторе, и доступен как на сервере, так и на тонком клиенте. Для пользовательского представления используется свойство Синоним объекта метаданных, а для механизмов обмена — функция XMLСтрока.

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

Что такое имя значения перечисления и чем оно отличается от синонима

В конфигураторе у каждого значения перечисления есть два ключевых строковых свойства. Имя — это идентификатор, по которому значение адресуется в коде: Перечисления.СтавкиНДС.НДС20. Синоним — это представление для пользователя, которое показывается в формах и отчётах: «НДС 20%». Путать их нельзя: имя стабильно и не должно меняться, а синоним может редактироваться без влияния на код.

Кроме того, у значения перечисления есть «представление по умолчанию» — то, что возвращает строковое приведение Строка(Значение). Обычно оно совпадает с синонимом, но полагаться на него в программной логике небезопасно: представление может зависеть от настроек и не подходит для сравнений и сериализации.

Основной способ: метод ПолучитьИмяЗначенияПеречисления

Метод вызывается у менеджера конкретного перечисления и принимает значение, имя которого нужно получить. Результат — строка с именем или Неопределено, если значение не принадлежит этому перечислению либо пустое.

Типовой пример:

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

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

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

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

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

Обратная задача: получить значение по имени

Часто вместе с получением имени требуется и обратное преобразование — восстановить значение перечисления по строке, например при загрузке данных из файла или внешней системы. Для этого используется индексация коллекции значений перечисления по имени:

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

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

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

// имя не найдено — обработать ошибку

КонецЕсли;

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

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

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

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

Представление = МетаданныеЗначения.Синоним; // "НДС 20%"

Если имя значения известно только в виде строки, сначала получают объект метаданных через коллекцию ЗначенияПеречисления с поиском по имени. Учтите, что работа с метаданными доступна только на сервере — в клиентском контексте тонкого и веб-клиента такой код выполнять нельзя.

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

Сравнение способов

ПолучитьИмяЗначенияПеречисления

Возвращает программное имя. Работает на клиенте и сервере. Подходит для логики, логов, ключей.

Синоним из метаданных

Возвращает пользовательское представление. Только сервер. Подходит для интерфейсов и печатных форм.

XMLСтрока

Возвращает имя для сериализации и обмена. Удобна для универсального кода без привязки к типу.

Универсальный вариант: XMLСтрока для обмена данными

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

СтрокаДляОбмена = XMLСтрока(Перечисления.СтавкиНДС.НДС20); // "НДС20"

ЗначениеНазад = XMLЗначение(Тип("ПеречислениеСсылка.СтавкиНДС"), СтрокаДляОбмена);

Это удобно, когда код работает с произвольными значениями разных типов: одна и та же функция корректно обрабатывает перечисления, ссылки, даты и примитивные типы. Обратное преобразование выполняется через XMLЗначение с явным указанием типа.

Перебор всех значений и построение таблицы соответствий

Если нужны имена всех элементов перечисления — например, для заполнения списка выбора или построения соответствия «имя → значение» — перебирается коллекция значений через менеджер перечисления:

Для Каждого ЗначениеПеречисления Из Перечисления.СтавкиНДС Цикл

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

Сообщить(Имя + " = " + Строка(ЗначениеПеречисления));

КонецЦикла;

Альтернатива — перебор через метаданные, когда нужны и имена, и синонимы одновременно. Такой подход применяется при генерации документации по конфигурации или при динамическом построении интерфейсов на сервере.

Порядок действий для получения имени
  1. 1
    Определите, что нужно: программное имя, синоним или строка для обмена
  2. 2
    Для имени вызовите ПолучитьИмяЗначенияПеречисления у менеджера перечисления
  3. 3
    Для синонима обратитесь к метаданным значения на сервере
  4. 4
    Проверьте результат на Неопределено перед использованием
  5. 5
    Протестируйте код на пустом значении перечисления

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

Самая частая ошибка — попытка получить имя у пустого значения перечисления. Метод вернёт Неопределено, и последующая работа с результатом как со строкой вызовет ошибку. Всегда проверяйте значение на заполненность или результат на Неопределено.

Вторая распространённая проблема — сравнение значения перечисления со строкой его имени напрямую: Если Ставка = "НДС20" Тогда. Такое сравнение всегда ложно, потому что сравниваются разные типы. Корректно сравнивать либо значения перечисления между собой, либо имена как строки.

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

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

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

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

Если имя используется для обратного преобразования, протестируйте полный цикл: значение → имя → значение. Результат должен совпасть с исходным значением. Расхождение означает, что где-то подменяется тип или используется представление вместо имени.

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

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

Тип результата ПолучитьИмяЗначенияПеречисления
Норма

Строка с именем из конфигуратора

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

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

Обратное преобразование Перечисления.Вид[Имя]
Норма

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

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

Неопределено — имя не существует в метаданных

Совпадение имени с конфигуратором
Норма

Имя в точности равно имени в палитре свойств

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

Отличается регистр или есть опечатка

FAQ

Что вернёт ПолучитьИмяЗначенияПеречисления для пустого значения?

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

Можно ли получить имя значения перечисления в запросе?

Напрямую в языке запросов такой функции нет. Обычно выбирают ссылку, а имя получают уже в коде при обходе выборки. Альтернатива — хранить нужное имя в дополнительном реквизите или соответствии, если оно требуется массово.

Чем XMLСтрока отличается от ПолучитьИмяЗначенияПеречисления?

Для перечисления результат одинаков — это имя значения. Разница в универсальности: XMLСтрока работает с любым сериализуемым типом и не требует знать конкретное перечисление, поэтому удобна в общих механизмах обмена.

Как получить имя, если известен только синоним?

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

Работает ли ПолучитьИмяЗначенияПеречисления на тонком клиенте?

Да, метод доступен на тонком клиенте, веб-клиенте и сервере, так как не требует обращения к метаданным. А вот получение синонима через объект Метаданные доступно только на сервере.

Изменится ли имя значения при переименовании синонима?

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

Итог

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

Программное имя значения перечисления получают методом ПолучитьИмяЗначенияПеречисления, пользовательское представление — через Синоним метаданных на сервере, строку для обмена — через XMLСтрока. Всегда проверяйте результат на Неопределено и не используйте синоним как ключ хранения.