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