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