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

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

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

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

Имя значения перечисления — это идентификатор, заданный в конфигураторе (например, НаличныйРасчет у перечисления «ВидыОплат»). Оно нужно при обмене данными, сериализации в XML и JSON, отладке и логировании, потому что представление может меняться, а имя остаётся стабильным ключом.

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

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

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

Путаница возникает, когда синоним отличается от имени. Например, значение с именем БезналичныйРасчет может иметь синоним «Безналичный расчёт (по карте)». Если в обмене данными записать синоним, при загрузке на стороне-приёмнике значение не найдётся. Поэтому для интеграций всегда нужно получать именно имя.

Способ 1: функция XMLСтрока — самый быстрый вариант

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

ЗначениеОплаты = Перечисления.ВидыОплат.НаличныйРасчет;

ИмяЗначения = XMLСтрока(ЗначениеОплаты);

// Результат: "НаличныйРасчет"

// Обратное преобразование:

ВосстановленноеЗначение = XMLЗначение(

Тип("ПеречислениеСсылка.ВидыОплат"), "НаличныйРасчет");

Способ работает и в толстом, и в тонком клиенте, и на сервере, не требует обращения к метаданным и выполняется быстро. Ограничение: для пустой ссылки перечисления XMLСтрока вернёт пустую строку — это нужно учитывать при обработке.

bsl
Имя = XMLСтрока(Перечисления.ВидыОплат.НаличныйРасчет); // "НаличныйРасчет"

Способ 2: ПолучитьИмяЗначенияПеречисления из БСП

В конфигурациях на базе Библиотеки стандартных подсистем есть готовая функция ОбщегоНазначения.ИмяЗначенияПеречисления() (в некоторых версиях — ПолучитьИмяЗначенияПеречисления). Она принимает ссылку на значение перечисления и возвращает его имя, используя метаданные внутри.

Имя = ОбщегоНазначения.ИмяЗначенияПеречисления(

Перечисления.ВидыОплат.НаличныйРасчет);

// Результат: "НаличныйРасчет"

Перед использованием проверьте, есть ли функция в вашей версии БСП — название и модуль могут отличаться. Если конфигурация самописная и БСП не подключена, реализуйте аналог через метаданные самостоятельно (см. следующий раздел).

Способ 3: через метаданные и индекс значения

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

Функция ИмяЗначенияПеречисления(ЗначениеПеречисления) Экспорт

МетаданныеПеречисления = ЗначениеПеречисления.Метаданные();

Индекс = Перечисления[МетаданныеПеречисления.Имя].Индекс(ЗначениеПеречисления);

Возврат МетаданныеПеречисления.ЗначенияПеречисления[Индекс].Имя;

КонецФункции

Метод Индекс() у менеджера перечисления возвращает позицию значения в коллекции, а коллекция ЗначенияПеречисления объекта метаданных хранит имена в том же порядке. Учтите: обращение к метаданным выполняется только на сервере и в толстом клиенте — в тонком и веб-клиенте такой код недоступен.

Способ 4: имя перечисления как объекта метаданных

Иногда требуется не имя значения, а имя самого перечисления — например, чтобы построить динамический запрос или проверить тип ссылки. Здесь всё проще: у любой ссылки есть метод Метаданные(), возвращающий объект описания.

ИмяОбъекта = ЗначениеОплаты.Метаданные().Имя;

// Результат: "ВидыОплат"

ПолноеИмя = ЗначениеОплаты.Метаданные().ПолноеИмя();

// Результат: "Перечисление.ВидыОплат"

Полное имя удобно для функций ПредопределенноеЗначение(): строка вида "Перечисление.ВидыОплат.НаличныйРасчет" позволяет получить значение без прямого обращения через точку, что безопасно при работе с расширениями и внешними источниками.

Сравнение способов получения имени

XMLСтрока

Быстро, работает везде, включая тонкий клиент. Не подходит, если нужен перебор всех значений

Функция БСП

Готовое решение, но зависит от версии библиотеки и требует её наличия в конфигурации

Метаданные и индекс

Универсально, позволяет перебирать значения. Не работает в тонком и веб-клиенте

Метаданные().Имя

Получает имя объекта, а не значения — используйте для другой задачи

Проверка результата и типичные ошибки

После получения имени проверьте его обратным преобразованием: XMLЗначение или ПредопределенноеЗначение должны вернуть исходное значение. Если возвращается Неопределено или исключение — имя получено неверно либо в конфигурации-приёмнике такого значения нет.

Частая ошибка — использование Строка(Значение) вместо имени. Пока синоним совпадает с именем, код «работает», но после первого же переименования синонима обмен ломается. Вторая типичная ошибка — попытка вызвать Метаданные() в тонком клиенте: платформа выдаст ошибку о недоступности метода.

Типичные ошибки
01
Использование Строка() вместо XMLСтрока() — в обмен уходит синоним, и значение не находится при загрузке
02
Вызов Метаданные() в тонком клиенте — метод доступен только на сервере и в толстом клиенте
03
Отсутствие проверки пустой ссылки — XMLСтрока вернёт пустую строку, и логика обмена сломается
04
Жёсткое кодирование имён строками без использования ПредопределенноеЗначение — при переименовании значения код перестаёт работать без ошибки компиляции

Как выбрать подходящий способ

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

Маршрут решения

Как выбрать способ

Нужно имя одного значения в любом клиентеИспользуйте XMLСтрока(Значение)
Конфигурация на базе БСПВызовите ОбщегоНазначения.ИмяЗначенияПеречисления()
Нужно перебрать все значения перечисления с именамиОбойдите коллекцию Метаданные.ЗначенияПеречисления на сервере
Нужно имя самого перечисления, а не значенияВозьмите Значение.Метаданные().Имя или ПолноеИмя()
Итог

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

Имя значения перечисления получают через XMLСтрока, штатную функцию БСП или метаданные по индексу. Строка() возвращает представление, а не имя — для обменов это критично. Код с метаданными работает только на сервере и в толстом клиенте.

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

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

Так происходит, когда передана пустая ссылка перечисления. У пустой ссылки нет соответствующего значения метаданных, поэтому сериализация даёт пустую строку. Перед вызовом проверяйте значение функцией ЗначениеЗаполнено().

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

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

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

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

Чем имя отличается от представления в журнале регистрации?

В журнале регистрации и сообщениях платформа показывает представление — синоним на текущем языке. Имя — это идентификатор из конфигуратора, он не зависит от языка и не меняется при правке синонима.

Работает ли XMLСтрока для перечислений из расширения конфигурации?

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

Что быстрее: XMLСтрока или обращение к метаданным?

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