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

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

Как в 1С преобразовать перечисление в строку

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

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

Самый простой вариант — функция Строка() или операция конкатенации со строкой: они возвращают представление значения, то есть синоним. Но если нужно получить имя значения перечисления, как оно задано в конфигураторе (например, «ПеремещениеТоваров»), потребуется обращение к метаданным. А для обмена через XML и веб-сервисы используются функции XMLСтрока() и XMLЗначение().

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

Что возвращает Строка() и когда её достаточно

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

Значение = Перечисления.ВидыОперацийПоступлениеТоваров.Покупка;

СтроковоеЗначение = Строка(Значение); // вернёт синоним, например "Покупка у поставщика"

Тот же эффект даёт неявное преобразование при конкатенации: "Операция: " + Значение. Это удобно для сообщений пользователю, заголовков отчётов и журнала регистрации, где важна читаемость, а не техническая точность.

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

Как получить имя значения перечисления через метаданные

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

Через индекс значения

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

Значение = Перечисления.ВидыОперацийПоступлениеТоваров.Покупка;

МетаданныеПеречисления = Значение.Метаданные();

ИндексЗначения = Перечисления[МетаданныеПеречисления.Имя].Индекс(Значение);

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

// ИмяЗначения = "Покупка"

Этот способ работает везде, где доступен серверный контекст, и не зависит от версии платформы. Минус — четыре строки кода, которые обычно оформляют в общую функцию в общем модуле.

Через XMLСтрока

Более короткий вариант — функция XMLСтрока(), которая для перечисления возвращает именно имя значения:

ИмяЗначения = XMLСтрока(Перечисления.ВидыОперацийПоступлениеТоваров.Покупка);

// вернёт "Покупка"

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

ТипПеречисления = Тип("ПеречислениеСсылка.ВидыОперацийПоступлениеТоваров");

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

Как найти значение перечисления по строке

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

Если строка содержит имя значения, используйте обращение через квадратные скобки или метаданные:

// Вариант 1: через менеджер перечисления

Значение = Перечисления.ВидыОперацийПоступлениеТоваров["Покупка"];

// Вариант 2: безопасная проверка существования

МетаданныеПеречисления = Метаданные.Перечисления.ВидыОперацийПоступлениеТоваров;

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

Значение = Перечисления.ВидыОперацийПоступлениеТоваров["Покупка"];

Иначе

// значение с таким именем не существует

КонецЕсли;

Если строка содержит синоним (например, из Excel-файла, который заполнял пользователь), придётся перебрать все значения и сравнить представления:

ИскомаяСтрока = "Покупка у поставщика";

НайденноеЗначение = Неопределено;

Для Каждого ЗначениеМетаданных Из Метаданные.Перечисления.ВидыОперацийПоступлениеТоваров.ЗначенияПеречисления Цикл

Если ЗначениеМетаданных.Синоним = ИскомаяСтрока Тогда

НайденноеЗначение = Перечисления.ВидыОперацийПоступлениеТоваров[ЗначениеМетаданных.Имя];

Прервать;

КонецЕсли;

КонецЦикла;

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

Порядок действий при загрузке из строки
  1. 1
    Определите, что приходит в строке: имя значения или синоним
  2. 2
    Для имени — проверьте существование через Метаданные...ЗначенияПеречисления.Найти() и получите значение через квадратные скобки
  3. 3
    Для синонима — переберите значения метаданных и сравните свойство Синоним, желательно с приведением регистра и обрезкой пробелов
  4. 4
    Если значение не найдено — зафиксируйте ошибку в журнале и не записывайте пустую ссылку молча
  5. 5
    Проверьте результат на тестовых данных, включая значения с пробелами и разным регистром

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

Выбор метода зависит от того, куда пойдёт строка: в интерфейс, в логику программы или во внешнюю систему. Таблица помогает быстро сориентироваться.

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

Сравнение вариантов

Строка()

Подходит для интерфейса и сообщений. Не подходит для сравнения и обмена — синоним может измениться.

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

Подходит для логики, хранения и обмена между базами с одинаковой конфигурацией. Требует обёртки в функцию.

XMLСтрока()

Универсальный короткий вариант для сериализации и обмена. Обратное преобразование — XMLЗначение().

Типичные ошибки и как их избежать

Первая группа ошибок связана со сравнением. Разработчики сравнивают Строка(Значение) = "Покупка", и код работает до первого переименования синонима. Правильно — сравнивать само значение с обращением через менеджер перечисления: Значение = Перечисления.ВидыОпераций.Покупка.

Вторая группа — обращение к несуществующему значению по строке без проверки. Конструкция Перечисления.ВидыОпераций["НетТакогоИмени"] вызывает исключение, которое в фоновом задании или обмене может прервать всю операцию. Всегда проверяйте существование через метаданные, когда строка приходит извне.

Третья типичная ситуация — пустая ссылка. У перечисления есть «пустое» значение, и Строка() для него вернёт пустую строку или строку по умолчанию, что легко спутать с ошибкой преобразования. Проверяйте ЗначениеЗаполнено(Значение) до преобразования, если пустое значение требует отдельной обработки.

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

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

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

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

Исходное = Перечисления.ВидыОперацийПоступлениеТоваров.Покупка;

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

Восстановленное = XMLЗначение(Тип("ПеречислениеСсылка.ВидыОперацийПоступлениеТоваров"), Стр);

Если Восстановленное = Исходное Тогда

// преобразование корректно

КонецЕсли;

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

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

Что вернула Строка()
Норма

Синоним значения, как в конфигураторе

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

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

Что вернула XMLСтрока()
Норма

Имя значения латиницей или кириллицей, как в метаданных

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

Синоним с пробелами — значит, вы случайно использовали Строка()

Круговой тест: строка → значение → сравнение
Норма

Восстановленное значение равно исходному

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

Не равно или исключение — имя не существует или тип указан неверно

Особенности в запросах, СКД и на клиенте

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

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

На тонком клиенте обращение к Перечисления и метаданным ограничено: менеджеры перечислений доступны, но обход метаданных и функции типа XMLСтрока() для сложных сценариев выполняйте в серверной процедуре. Это снимает большинство ошибок вида «метод не обнаружен» в управляемых формах.

Итог

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

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

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

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

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

Почему Перечисления.Вид["Имя"] выдаёт ошибку?

Обращение через квадратные скобки вызывает исключение, если значения с таким именем нет в конфигурации. Перед обращением проверьте существование: Метаданные.Перечисления.Вид.ЗначенияПеречисления.Найти(Имя) — если результат Неопределено, значения нет.

Как вывести перечисление в строку в запросе?

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

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

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

Можно ли использовать ЗначениеВСтрокуВнутр() для обмена между базами?

Не рекомендуется: формат внутреннего представления не документирован и может отличаться между версиями платформы. Для обмена используйте XMLСтрока()/XMLЗначение() или передачу имени значения.

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

Для пустой ссылки перечисления представление обычно пустое или заданное в конфигурации. Чтобы не перепутать с ошибкой, проверяйте значение функцией ЗначениеЗаполнено() до преобразования.