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