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