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

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

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

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

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

Получить имя значения перечисления «как в конфигураторе» можно несколькими способами: через метаданные, через функцию XMLСтрока, через индекс значения. У каждого подхода есть ограничения по скорости, контексту выполнения (клиент или сервер) и совместимости с режимом совместимости конфигурации. Ниже разобраны рабочие варианты с примерами кода, типичными ошибками и способами проверки результата.

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

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

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

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

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

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

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

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

Тип = Тип("ПеречислениеСсылка.СтавкиНДС");

Значение = XMLЗначение(Тип, "НДС20");

Функция работает на сервере и на толстом клиенте, не требует обращения к метаданным и выполняется быстро, поэтому подходит для циклов и больших выгрузок. Ограничение: на тонком и веб-клиенте в некоторых контекстах сериализация недоступна, поэтому в клиентском коде вызов лучше переносить на сервер.

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

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

Классический подход — найти значение в коллекции метаданных перечисления по индексу. Индекс значения перечисления возвращает функция Перечисления.ИмяПеречисления.Индекс(Значение):

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

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

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

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

Этот способ удобен, когда одновременно нужны и другие свойства метаданных — например, синоним или комментарий. Но для массовой обработки он медленнее: каждое обращение к метаданным и вычисление индекса дороже, чем один вызов XMLСтрока.

В универсальном коде, где тип перечисления заранее неизвестен, имя перечисления получают из метаданных самого значения:

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

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

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

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

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

Обратите внимание: метод Метаданные() у ссылки возвращает объект метаданных перечисления, а не значения — поэтому имя конкретного значения всё равно ищется по индексу.

Способ 3: имя значения в запросе и СКД

В языке запросов прямой функции «имя значения перечисления» нет. Если нужно вывести внутреннее имя в отчёте, есть два практических варианта. Первый — получить представление через функцию ПРЕДСТАВЛЕНИЕ(), но она вернёт синоним, а не имя, что подходит только для отображения.

Второй вариант — обогатить результат запроса на этапе обработки: выгрузить таблицу результата и пройтись по ней циклом, заменив значение перечисления на XMLСтрока(Значение). В СКД то же самое делается в событии ПриКомпоновкеРезультата либо через вычисляемое поле с вызовом функции общего модуля.

Сравнение способов и критерии выбора

СпособСкоростьГде работаетКогда выбирать
XMLСтрокаВысокаяСервер, толстый клиентОбмены, выгрузки, универсальный код
Метаданные + ИндексСредняяСервер, толстый клиентКогда нужны и другие свойства метаданных
ПРЕДСТАВЛЕНИЕ в запросеВысокаяЗапрос, СКДТолько отображение синонима пользователю
Маршрут решения

Как выбрать действие

Нужно имя значения для файла обмена или сопоставления базИспользуйте XMLСтрока(Значение) — быстро и без обращения к метаданным
Нужны одновременно имя, синоним и другие свойства значенияНайдите значение через Метаданные и Индекс
Нужно только показать значение пользователю в отчётеДостаточно ПРЕДСТАВЛЕНИЕ() в запросе, имя не требуется

Типичные ошибки и их последствия

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

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

Третья типичная ситуация — перебор значений перечисления через конструкцию Для Каждого Значение Из Перечисления.ИмяПеречисления Цикл. Менеджер перечисления не является коллекцией значений в привычном смысле; для перебора используют коллекцию метаданных Метаданные.Перечисления.Имя.ЗначенияПеречисления, а ссылку получают как Перечисления.Имя[МетаЗначение.Имя].

Типичные ошибки
01
Сопоставление перечислений по синониму при обмене — после правки синонима обмен ломается
02
Обращение Значение.Имя — у ссылки нет такого свойства, код падает с ошибкой
03
Использование ПРЕДСТАВЛЕНИЕ() в запросе как источника имени — возвращается синоним, а не имя
04
Перебор значений через менеджер перечисления вместо коллекции метаданных

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

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

Для обратной проверки преобразуйте имя обратно в значение через Перечисления.ИмяПеречисления[ИмяЗначения] и убедитесь, что получилась исходная ссылка. Если обращение по имени возвращает Неопределено или ошибку — имя не совпадает с конфигурацией, например после переименования значения в одной из баз обмена.

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

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

Содержимое строки-результата
Норма

Совпадает с именем значения в конфигураторе, без пробелов

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

Содержит пробелы или пользовательскую формулировку — это синоним

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

Возвращается исходная ссылка на значение

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

Ошибка или пустое значение — имя не найдено в метаданных

Поведение после обновления конфигурации
Норма

Сопоставление по имени продолжает работать

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

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

FAQ

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

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

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

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

Работает ли XMLСтрока на тонком клиенте?

В ряде контекстов тонкого и веб-клиента сериализация недоступна, поэтому надёжнее выполнять преобразование в серверной процедуре и возвращать на клиент уже готовую строку. Это также снижает объём клиент-серверных вызовов при пакетной обработке.

Что будет, если значение перечисления удалили из конфигурации, а ссылки остались?

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

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

Через метаданные: найдите значение по индексу в коллекции ЗначенияПеречисления и прочитайте свойство Синоним. Либо просто преобразуйте значение в строку — Строка(Значение) вернёт представление, которое для перечислений совпадает с синонимом.

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

Язык запросов 1С работает с данными таблиц и не предоставляет функции доступа к свойствам метаданных. Имя значения хранится в метаданных конфигурации, а не в таблицах базы, поэтому его получают средствами встроенного языка после выполнения запроса.

Итог

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

Имя значения перечисления «как в конфигураторе» получают через XMLСтрока (быстро, для обменов) или через метаданные по индексу (когда нужны дополнительные свойства). Синоним и ПРЕДСТАВЛЕНИЕ() для сопоставления данных использовать нельзя — только внутреннее имя.