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