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

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

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

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

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

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

Чем имя значения отличается от синонима и почему это важно

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

Функция Строка(ЗначениеПеречисления) возвращает именно синоним (представление), а не имя. Если синоним изменят при доработке конфигурации, весь код, который сравнивал строковое представление с «жёстко зашитым» текстом, перестанет работать. Поэтому для обменов и технической логики всегда используйте имя, а для вывода пользователю — представление.

Способ 1. Получить имя через XMLСтрока

Самый простой и работающий везде способ — функция глобального контекста XMLСтрока(). Она преобразует значение в строковое представление по правилам XML-сериализации, и для перечислений это как раз имя значения из конфигуратора.

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

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

Преимущества способа: работает и на клиенте, и на сервере, не требует обращения к метаданным, доступен в тонком и веб-клиенте. Обратная операция выполняется функцией XMLЗначение(), которой нужно передать тип перечисления и строку с именем.

Ограничение: если передать в XMLСтрока() пустую ссылку перечисления, вернётся пустая строка, а не какое-то служебное значение. Это нужно учитывать при выгрузках, чтобы не получить неожиданно пустые поля.

Способ 2. Получить имя через метаданные

Когда нужно получить имя «по-настоящему», через объектную модель конфигурации, используется обращение к метаданным. Этот способ доступен только на сервере (и в толстом клиенте), потому что объект «Метаданные» недоступен в тонком клиенте.

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

МетаданныеПеречисления = Значение.Метаданные();
ИндексЗначения = Перечисления.СтавкиНДС.Индекс(Значение);
ИмяЗначения = МетаданныеПеречисления.ЗначенияПеречисления[ИндексЗначения].Имя; // "НДС20"

Логика такая: менеджер перечисления возвращает индекс значения в коллекции, а по индексу из метаданных берётся объект описания значения, у которого есть свойства Имя и Синоним. Так можно получить оба свойства за один проход.

Этот способ оправдан, когда нужно не только имя, но и другие свойства метаданных: синоним, комментарий, порядок следования значений. Для простой задачи «получить имя» он избыточен и медленнее, чем XMLСтрока().

Способ 3. Обратная задача — получить значение по имени

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

Первый — обращение через квадратные скобки к менеджеру перечисления: Перечисления.СтавкиНДС["НДС20"]. Если значения с таким именем нет, обращение вернёт Неопределено, что удобно для проверки существования. Второй — уже упомянутая функция XMLЗначение(): она выбросит исключение при неверном имени, поэтому её вызов стоит оборачивать в попытку.

bsl
Имя = "НДС20";
Значение = Перечисления.СтавкиНДС[Имя];
Если Значение = Неопределено Тогда
    // имени нет в перечислении — обработать ситуацию
КонецЕсли;

Сравнение способов и когда какой выбирать

Сравнение вариантов

XMLСтрока()

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

Через метаданные и Индекс()

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

Строка() или Наименование

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

Обращение по [Имя]

Обратная задача: получить значение по имени. Возвращает Неопределено при отсутствии — удобно для безопасного поиска.

Для типовой задачи «выгрузить значение перечисления в файл/JSON/сообщение» выбирайте XMLСтрока(). Для построения универсальных обработчиков, которые обходят все значения перечисления и строят таблицу соответствий, — метаданные. Для показа пользователю — синоним через Строка().

Типовые ошибки и как их избежать

Типичные ошибки
01
Использование Строка(Значение) для обмена данными: при смене синонима интеграция ломается. Решение — XMLСтрока().
02
Сравнение имени с синонимом: XMLСтрока возвращает имя, а разработчик сравнивает результат с текстом синонима — условие никогда не срабатывает.
03
Вызов метаданных на клиенте: код падает с ошибкой. Выносите получение имени в серверную процедуру или используйте XMLСтрока.
04
Обращение Перечисления.Вид[Имя] без проверки на Неопределено: дальше по коду возникает ошибка обращения к свойству.
05
Ожидание служебного значения для пустой ссылки: XMLСтрока вернёт пустую строку, что может нарушить формат выгрузки.

Отдельная частая ошибка — попытка найти несуществующий метод вроде «ПолучитьИмяЗначенияПеречисления» как встроенную функцию платформы. В современных версиях платформы такой глобальной функции нет; в старых конфигурациях с таким названием встречаются самописные функции общих модулей, которые внутри используют именно обращение к метаданным. Если вы встретили такой вызов в чужом коде — ищите его реализацию в общих модулях конфигурации.

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

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

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

Сравните результат XMLСтрока со свойством «Имя» в конфигураторе
Норма

Строки совпадают посимвольно, включая регистр

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

Вернулся синоним (текст с пробелами/кириллицей вместо идентификатора) — значит использована Строка()

Поведение при пустой ссылке
Норма

Получена пустая строка, код её корректно обрабатывает

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

Пустое значение попадает в выгрузку как валидное

Обратное преобразование
Норма

XMLЗначение по полученному имени возвращает исходное значение

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

Исключение или Неопределено — имя получено неверно

Самый быстрый способ проверить себя — открыть конфигуратор, найти перечисление и посмотреть колонку «Имя» у нужного значения. Затем в отладчике выполнить XMLСтрока(Значение) и сравнить. Совпадение посимвольно, включая регистр, — признак корректной работы.

Итог

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

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

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

Чем XMLСтрока отличается от Строка для перечисления?

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

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

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

Почему XMLСтрока вернула пустую строку?

Скорее всего, передана пустая ссылка перечисления (значение не заполнено). Перед выгрузкой проверяйте значение на заполненность через ЗначениеЗаполнено() и обрабатывайте пустой случай отдельно.

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

Да, через XMLСтрока() — она доступна на клиенте. Способ через метаданные на тонком клиенте недоступен: объект «Метаданные» существует только на сервере и в толстом клиенте.

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

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

Имя или синоним хранить в регистре соответствий для интеграции?

Имя. Синоним может быть изменён при доработке конфигурации или локализации, и тогда сопоставление развалится. Имя стабильно, пока значение не переименуют осознанно в конфигураторе.