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