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

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

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

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

Под «идентификатором перечисления» в 1С разработчики обычно понимают одно из трёх: имя значения перечисления, заданное в конфигураторе; уникальный идентификатор (GUID) предопределённого значения; либо строковое представление для обмена данными. Это разные вещи, и путать их — частая причина ошибок в интеграциях и обработках.

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

Ниже разобраны все рабочие способы: получение имени значения, позиции (индекса) в списке, GUID для предопределённых значений, строкового представления для XDTO-обмена, а также обратная задача — получение значения перечисления по строке.

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

Перечисление — это жёстко заданный в конфигураторе список значений. Каждое значение имеет имя (идентификатор в терминах встроенного языка), синоним (представление для пользователя) и порядковый номер в списке. Имя — единственный стабильный идентификатор, который не меняется при переименовании синонима и не зависит от локали.

Если перечисление содержит предопределённые значения (так бывает, когда перечисление используется в механизмах, требующих ссылочной целостности, либо в расширениях), у таких значений может быть полноценный GUID. Однако в классических конфигурациях обычные перечисления ссылок не создают, и рассчитывать на GUID нельзя.

Поэтому первый шаг — определить, какой именно «идентификатор» нужен: для логики внутри кода, для хранения в другом поле, для обмена с внешней системой или для сопоставления при загрузке данных. От этого зависит выбор метода.

Получение имени значения через XMLСтрока

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

ЗначениеСтатуса = Перечисления.СтатусыЗаказа.Оплачен;

ИмяЗначения = XMLСтрока(ЗначениеСтатуса);

// Результат: "Оплачен"

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

ТипПеречисления = Тип("ПеречислениеСсылка.СтатусыЗаказа");

ЗначениеСтатуса = XMLЗначение(ТипПеречисления, "Оплачен");

Этот способ особенно удобен в обменах: строка имени стабильна между информационными базами с одинаковой конфигурацией, в отличие от порядкового номера, который может измениться при вставке нового значения в середину списка.

Получение имени через метаданные и индекс

Если нужно перебрать все значения перечисления или получить имя по порядковому номеру, используется объект метаданных. Коллекция Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления содержит описания всех значений, у каждого есть свойства Имя и Синоним.

МетаданныеПеречисления = Метаданные.Перечисления.СтатусыЗаказа;

Для Каждого ЗначениеМД Из МетаданныеПеречисления.ЗначенияПеречисления Цикл

Сообщить(ЗначениеМД.Имя + " — " + ЗначениеМД.Синоним);

КонецЦикла;

Для конкретного значения можно получить индекс методом Индекс() менеджера перечисления, а затем по индексу — объект метаданных и его имя:

ЗначениеСтатуса = Перечисления.СтатусыЗаказа.Оплачен;

ИндексЗначения = Перечисления.СтатусыЗаказа.Индекс(ЗначениеСтатуса);

ИмяЗначения = Метаданные.Перечисления.СтатусыЗаказа

.ЗначенияПеречисления[ИндексЗначения].Имя;

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

XMLСтрока() выполняется быстрее и читается проще, но обращение через метаданные даёт больше контекста — синоним, комментарий, позицию. Для разовой операции разницы нет; в цикле по тысячам значений предпочтительнее XMLСтрока.
ПЗ
Практическое замечание

Уникальный идентификатор (GUID) предопределённого значения

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

// Только если значение является ссылкой

GUID = XMLСтрока(ЗначениеСсылка.УникальныйИдентификатор());

Проверить, является ли значение ссылкой, можно функцией ЭтоСсылка() из общих модулей БСП или сравнением типа. Если перечисление обычное, попытка вызвать УникальныйИдентификатор() завершится ошибкой «Метод объекта не обнаружен».

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

Обратная задача — восстановить значение перечисления по имени из строки — решается обращением к менеджеру перечисления как к коллекции. Если имени нет в перечислении, обращение вернёт Неопределено, что удобно для проверки корректности загружаемых данных.

ИмяИзФайла = "Оплачен";

ЗначениеСтатуса = Перечисления.СтатусыЗаказа[ИмяИзФайла];

Если ЗначениеСтатуса = Неопределено Тогда

// Имя не найдено — строка некорректна или конфигурации различаются

КонецЕсли;

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

Порядок действий при интеграции
  1. 1
    Определите, что требуется внешней системе: имя значения или синоним
  2. 2
    Получите имя через XMLСтрока(Значение) в выгружающей базе
  3. 3
    Передайте строку и при загрузке получите значение через Перечисления.Имя[Строка]
  4. 4
    Проверьте результат на Неопределено и залогируйте несопоставленные имена

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

СпособЧто возвращаетКогда применятьОграничение
XMLСтрока()Имя значенияОбмен, хранение, логированиеНе даёт синоним
Метаданные + Индекс()Имя, синоним, позицияПеребор значений, таблицы соответствийГромоздкий код
Строка(Значение)Синоним (представление)Только вывод пользователюЗависит от языка, нестабилен
УникальныйИдентификатор()GUIDТолько для ссылочных значенийНедоступен для обычных перечислений

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

Типичные ошибки
01
Вызов УникальныйИдентификатор() у значения перечисления — ошибка времени выполнения, так как метод существует только у ссылок
02
Использование Строка(Значение) для обмена — синоним меняется при переименовании и зависит от языка, сопоставление ломается
03
Хранение индекса значения в другой базе — при вставке нового значения в середину списка все индексы смещаются
04
Обращение Перечисления.Имя[Строка] без проверки на Неопределено — неочевидные пустые значения в загруженных данных

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

После получения идентификатора убедитесь, что получено именно то, что ожидалось. Для имени значения простой тест — обратное преобразование: строка, полученная через XMLСтрока(), должна однозначно возвращать исходное значение через обращение к менеджеру перечисления.

Исходное = Перечисления.СтатусыЗаказа.Оплачен;

Имя = XMLСтрока(Исходное);

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

// Восстановленное должно быть равно Исходное

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

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

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

Обратное преобразование имени
Норма

Перечисления.Имя[XMLСтрока(Значение)] возвращает исходное значение

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

Возвращается Неопределено — имя не совпадает с метаданными

Стабильность идентификатора
Норма

Имя одинаково в обеих базах обмена

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

Имена различаются — конфигурации разных версий

Тип значения
Норма

ТипЗнч возвращает ПеречислениеСсылка.Имя

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

Значение имеет тип Строка — идентификатор не преобразован обратно

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

Можно ли получить GUID обычного значения перечисления?

Нет. Значения перечислений не являются объектами базы данных и не имеют уникальных идентификаторов. Если интеграция требует GUID, используйте имя значения как ключ либо замените перечисление справочником, у элементов которого GUID есть всегда.

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

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

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

Переберите коллекцию Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления в цикле и заполните таблицу значений колонками из свойств Имя и Синоним каждого элемента. Это стандартный приём для построения таблиц соответствий при миграциях.

Что вернёт обращение Перечисления.Имя[Строка], если такого значения нет?

Будет возвращено Неопределено, ошибки не произойдёт. Поэтому при загрузке данных из внешних источников результат всегда проверяют на Неопределено, иначе в документы попадут пустые значения без каких-либо сообщений.

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

Нет. Имя и синоним — независимые свойства. Имя изменится, только если разработчик переименует само значение в конфигураторе, что потребует обновления всех мест, где имя использовалось как строка.

Как передать значение перечисления через веб-сервис или HTTP-запрос?

Сериализуйте значение через XMLСтрока() в передающей системе и восстановите через обращение к менеджеру перечисления или XMLЗначение() с указанием типа в принимающей. Передавать внутреннее представление или индекс не следует.

Итог

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

У значений перечислений нет GUID — их идентификатор это имя из метаданных. Получайте его через XMLСтрока(), восстанавливайте через Перечисления.Имя[Строка] с проверкой на Неопределено. Не используйте синоним и индекс как идентификаторы для обмена.