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

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

Перечисление как строка в 1С: способы преобразования и примеры

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

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

Способов получить строковое представление несколько, и они дают разный результат: пользовательское представление (синоним), имя значения, заданное разработчиком, или техническое имя вида «Enum.Статусы.Новый». Выбор зависит от того, где строка будет использоваться — в интерфейсе, в файле обмена или в логике сравнения.

Ниже разобраны основные методы преобразования, их ограничения, типичные ошибки и способы обратного преобразования строки в значение перечисления.

Что возвращает функция Строка() для перечисления

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

Статус = Перечисления.СтатусыЗаказа.ВРаботе;

СтрокаСтатуса = Строка(Статус);

Сообщить(СтрокаСтатуса); // например: "В работе"

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

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

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

Статус = Перечисления.СтатусыЗаказа.ВРаботе;

Имя = XMLСтрока(Статус); // "ВРаботе"

Обратное преобразование выполняется функцией XMLЗначение() с указанием типа:

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

Статус = XMLЗначение(Тип, "ВРаботе");

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

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

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

Вывод Строка(Значение) в сообщении
Норма

Показывается синоним, понятный пользователю

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

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

Результат XMLСтрока()
Норма

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

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

Строка не находится обратно через XMLЗначение

Обратное преобразование XMLЗначение()
Норма

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

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

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

Имя и синоним значения через метаданные

Когда нужен и синоним, и имя одновременно, либо требуется найти значение по строке без жёсткой привязки к типу, работают через объект метаданных. У каждого значения перечисления есть объект ОбъектМетаданных: ЗначениеПеречисления со свойствами «Имя» и «Синоним».

Статус = Перечисления.СтатусыЗаказа.ВРаботе;

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

Имя = МетаданныеЗначения.Имя; // "ВРаботе"

Синоним = МетаданныеЗначения.Синоним; // "В работе"

Метод Метаданные() вызывается у самого значения перечисления и возвращает описание именно этого значения, а не всего перечисления. Это удобно в универсальных процедурах, где тип заранее неизвестен.

Поиск значения по строке-имени

Обратная задача — получить значение по строке — решается через коллекцию значений менеджера перечисления:

ИмяЗначения = "ВРаботе";

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

Если Метаданные.Перечисления.СтатусыЗаказа.ЗначенияПеречисления.Найти(ИмяЗначения) <> Неопределено Тогда

Статус = Менеджер[ИмяЗначения];

Иначе

Статус = Менеджер.ПустаяСсылка();

КонецЕсли;

Предварительная проверка через метаданные обязательна: обращение Менеджер[НесуществующееИмя] вызовет исключение и прервёт выполнение кода.

Перечисление в запросах и СКД

В языке запросов значение перечисления задаётся функцией ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказа.ВРаботе). При выводе результата запроса в табличный документ или отчёт платформа автоматически преобразует значение в строковое представление — синоним.

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

В схеме компоновки данных представление формируется автоматически при выводе поля в отчёт. Для вычисляемых полей со строковым результатом используйте функцию языка выражений СКД, опираясь на те же правила: представление берётся из синонима.

Если строковое представление перечисления сохраняется в регистре или справочнике для последующего поиска, храните имя значения (результат XMLСтрока), а не синоним. Синонимы меняются при доработках, имена — почти никогда.
ПЗ
Практическое замечание

Особые случаи: пустая ссылка и неопределённое значение

Пустая ссылка перечисления при преобразовании через Строка() возвращает пустую строку, а XMLСтрока() — также пустую строку. Это создаёт неоднозначность: пустое значение и «неустановленное» состояние визуально неотличимы.

Для полей, где пустое значение недопустимо, проверяйте заполненность до преобразования:

Если Статус.Пустая() Тогда

СтрокаСтатуса = "Не указан";

Иначе

СтрокаСтатуса = Строка(Статус);

КонецЕсли;

Дополнительная ловушка — реквизиты составного типа, где может лежать Неопределено вместо значения перечисления. Вызов XMLСтрока(Неопределено) вернёт строку "Undefined", что при обратном преобразовании даст ошибку или пустую ссылку. Проверяйте тип значения перед преобразованием через ТипЗнч().

Сравнение способов преобразования

СпособЧто возвращаетКогда применять
Строка(Значение)Синоним (пользовательское представление)Сообщения, отчёты, интерфейс
XMLСтрока(Значение)Имя значения из конфигуратораОбмен данными, хранение, логирование
Значение.Метаданные().ИмяИмя значенияУниверсальный код без привязки к типу
Значение.Метаданные().СинонимСиноним значенияФормирование представлений в универсальных механизмах

Выбор сводится к простому правилу: всё, что видит пользователь, — через синоним; всё, что читает машина или другой код, — через имя. Смешивать эти сценарии нельзя.

Маршрут решения

Как выбрать способ

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

Проверка корректности преобразования

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

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

Итог

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

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

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

Можно ли сравнить перечисление со строкой напрямую?

Нет. Значение перечисления и строка — разные типы, сравнение всегда даст «Ложь». Сравнивайте перечисление со значением того же перечисления, а если строка пришла извне — сначала преобразуйте её в значение через XMLЗначение() или поиск по метаданным.

Почему XMLЗначение() не выдаёт ошибку на неверном имени?

Таково поведение платформы: при несуществующем имени возвращается пустая ссылка перечисления. Поэтому после преобразования проверяйте результат методом Пустая() или сравнением с пустой ссылкой, иначе некорректные данные попадут в базу незаметно.

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

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

Что вернёт Строка() для пустой ссылки перечисления?

Пустую строку. Из-за этого пустое значение в отчётах и сообщениях выглядит как пропуск. Если требуется явное обозначение, подставляйте собственный текст вроде «Не указан» после проверки Пустая().

Изменится ли результат XMLСтрока() при переименовании синонима?

Нет. XMLСтрока() возвращает имя значения, а не синоним, поэтому переименование синонима на него не влияет. Результат изменится только при переименовании самого значения в конфигураторе — поэтому имена значений переименовывают крайне осторожно, если они участвуют в обменах.

Как вывести перечисление в макет табличного документа?

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