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

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

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

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

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

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

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

Что такое синоним перечисления и где он хранится

Перечисление в 1С — прикладной объект со фиксированным списком значений. У каждого значения есть два ключевых свойства: имя (идентификатор, по которому значение адресуется в коде) и синоним (строка для показа пользователю). Имя подчиняется правилам идентификаторов — без пробелов и спецсимволов, синоним может содержать любой текст.

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

Способ 1: получение синонима через метаданные

Самый универсальный и контролируемый способ — обратиться к коллекции значений перечисления через объект метаданных. Для этого нужно знать имя перечисления и имя конкретного значения:

ЗначениеМета = Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления.НДС20;

Синоним = ЗначениеМета.Синоним; // например, "20%"

Если имя значения хранится в переменной (например, пришло из внешнего источника), используйте индексный доступ к коллекции:

ИмяЗначения = "ОплатаОтПокупателя";

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

Если ЗначениеМета = Неопределено Тогда

// значение с таким именем не найдено

Иначе

Синоним = ЗначениеМета.Синоним;

КонецЕсли;

Обязательно проверяйте результат индексного обращения на Неопределено: если имя указано с ошибкой или конфигурация изменилась, обращение к свойству «Синоним» у пустого результата вызовет исключение и прервёт выполнение кода.

Способ 2: синоним от значения, а не от имени

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

Значение = Перечисления.СтавкиНДС.НДС20;

Менеджер = Перечисления.СтавкиНДС;

Индекс = Менеджер.Индекс(Значение);

ЗначениеМета = Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления.Получить(Индекс);

Синоним = ЗначениеМета.Синоним;

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

Функция СинонимЗначенияПеречисления(Значение) Экспорт

МетаЗнач = Значение.Метаданные();

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

Возврат МетаЗнач.ЗначенияПеречисления.Получить(Индекс).Синоним;

КонецФункции

bsl
Функция СинонимЗначенияПеречисления(Значение) Экспорт
    МетаЗнач = Значение.Метаданные();
    Индекс = Перечисления[МетаЗнач.Имя].Индекс(Значение);
    Возврат МетаЗнач.ЗначенияПеречисления.Получить(Индекс).Синоним;
КонецФункции

Способ 3: представление без обращения к метаданным

Если цель — просто показать значение пользователю в сообщении, заголовке или текстовом поле, метаданные вообще не нужны. Платформа сама формирует представление перечисления по синониму при приведении к строке:

Сообщить("Выбрана ставка: " + Перечисления.СтавкиНДС.НДС20);

// Выведет: Выбрана ставка: 20%

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

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

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

Метаданные + Синоним

Полный контроль, работает с именами и значениями. Требует серверного контекста, код длиннее.

Строка(Значение)

Одна строка кода, работает везде. Не подходит, если нужен именно синоним из конфигуратора для логики.

ПРЕДСТАВЛЕНИЕ в запросе

Идеален для отчётов и списков. Результат — строка, теряется ссылочный тип.

Способ 4: синоним в запросе и СКД

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Реализация.СтавкаНДС) КАК СтавкаНДС

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

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

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

Синоним пустого значения и нюансы локализации

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

Если ЗначениеЗаполнено(Значение) Тогда

Синоним = СинонимЗначенияПеречисления(Значение);

Иначе

Синоним = ""; // или собственный текст, например "<не указано>"

КонецЕсли;

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

Проверка результата и типичные ошибки

После внедрения кода проверьте три вещи: корректность имени перечисления и значения (опечатка даст Неопределено при индексном обращении), поведение на пустом значении и работу в том клиенте, где реально исполняется код. Быстрее всего отладить через консоль кода или окно «Вычислить выражение» в конфигураторе: выполните функцию с тестовым значением и сравните результат с синонимом, видимым в дереве конфигурации.

Типичные ошибки
01
Обращение к метаданным в клиентском контексте — код падает с ошибкой о недоступности объекта; выносите логику на сервер.
02
Отсутствие проверки на Неопределено после индексного поиска по имени — исключение при любом расхождении имён.
03
Использование синонима как ключа обмена с внешней системой — интеграция ломается после переименования синонима.
04
Забытая проверка на пустое значение — метод Индекс() ведёт себя неочевидно для пустой ссылки.
Контрольные точки

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

Совпадение строки с конфигуратором
Норма

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

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

Строка отличается или пустая — проверьте имя значения и язык сеанса

Поведение на пустом значении
Норма

Функция возвращает заготовленный текст без исключения

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

Ошибка выполнения или непонятный результат

Работа в тонком клиенте
Норма

Код выполняется без ошибок обращения к серверу

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

Исключение о недоступности метаданных — перенесите код на сервер

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

Итог

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

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

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

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

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

Чем отличается синоним от представления значения?

Синоним — это свойство, заданное разработчиком в конфигураторе. Представление — строка, которую платформа формирует для отображения; для перечислений она обычно совпадает с синонимом, но зависит от языка сеанса и настроек.

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

Используйте функцию XMLСтрока(Значение) — она возвращает имя значения как строку, например «НДС20». Обратное преобразование выполняется через XMLЗначение(Тип, Строка).

Почему индексное обращение ЗначенияПеречисления[Имя] вернуло Неопределено?

Имя не совпадает ни с одним значением перечисления: опечатка, лишний пробел или значение было переименовано при обновлении конфигурации. Сверьте имя с деревом конфигурации и всегда проверяйте результат перед обращением к свойству «Синоним».

Как вывести синоним перечисления в запросе для отчёта?

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

Что делать, если синоним нужен для всех значений перечисления сразу?

Пройдите циклом по коллекции: Для Каждого ЗначениеМета Из Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления Цикл ... КонецЦикла; — внутри цикла доступны имя и синоним каждого значения, что удобно для заполнения списков выбора и таблиц соответствий.