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