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

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

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

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

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

Обращение к перечислениям встроенного языка строится через менеджер объекта Перечисления. Типичные задачи — получить конкретное значение, сравнить его с реквизитом документа, перебрать все значения, проверить заполненность, получить синоним для вывода пользователю. Каждая из этих операций имеет свои особенности синтаксиса и типичные ошибки.

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

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

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

ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем;

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

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

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

ВидДоговора = Перечисления.ВидыДоговоров[ИмяЗначения];

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

bsl
ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем;
Если ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем Тогда
	// действия для договора с покупателем
КонецЕсли;

Сравнение и проверка значений

Самая частая операция — сравнение реквизита объекта со значением перечисления. Значения перечислений сравниваются напрямую оператором равенства:

Если Документ.СпособДоставки = Перечисления.СпособыДоставки.Самовывоз Тогда

// логика для самовывоза

КонецЕсли;

Для проверки, заполнен ли реквизит типа перечисление, применяют функцию ЗначениеЗаполнено() или сравнение с пустой ссылкой. Пустую ссылку получают через метод менеджера ПустаяСсылка():

Если Не ЗначениеЗаполнено(Объект.СтавкаНДС) Тогда

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

КонецЕсли;

Если Объект.СтавкаНДС = Перечисления.СтавкиНДС.ПустаяСсылка() Тогда

// то же самое другим способом

КонецЕсли;

Обе проверки равнозначны для перечислений. Функция ЗначениеЗаполнено() универсальнее — она корректно работает и с другими типами, поэтому в типовом коде встречается чаще.

Перебор всех значений перечисления

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

Для Каждого ЗначениеМетаданных Из Метаданные.Перечисления.СпособыДоставки.ЗначенияПеречисления Цикл

ЗначениеСсылки = Перечисления.СпособыДоставки[ЗначениеМетаданных.Имя];

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

// обработка значения

КонецЦикла;

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

Альтернатива для управляемых форм — стандартный список выбора, который платформа строит автоматически для реквизита типа перечисление. Вручную перебирать значения требуется только в нестандартных сценариях.

Порядок перебора значений
  1. 1
    Получите коллекцию Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления
  2. 2
    В цикле прочитайте Имя и Синоним каждого элемента
  3. 3
    Преобразуйте имя в ссылку через Перечисления.Имя[ЗначениеМетаданных.Имя]
  4. 4
    Проверьте результат, выведя значения в сообщение или таблицу

Работа с перечислениями в запросах

В языке запросов обращение к значению перечисления выполняется через конструкцию ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения):

ВЫБРАТЬ

Заказы.Ссылка

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ГДЕ

Заказы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.ВРаботе)

Такой литерал вычисляется на этапе выполнения запроса и не требует передачи параметра. Если значение нужно задавать динамически, его передают через параметр запроса, установленный методом УстановитьПараметр().

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

Предопределённые значения и получение по представлению

В отличие от справочников, у перечислений нет предопределённых элементов в пользовательском смысле: все значения заданы в конфигураторе и доступны сразу. Поэтому не существует методов поиска по коду или наименованию, как у справочников.

Если нужно получить значение по строковому представлению (например, при загрузке из файла), надёжный подход — перебор метаданных со сравнением имени или синонима:

Функция НайтиЗначениеПоИмени(ИскомоеИмя)

Для Каждого ЗнМетаданных Из Метаданные.Перечисления.СпособыДоставки.ЗначенияПеречисления Цикл

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

Возврат Перечисления.СпособыДоставки[ЗнМетаданных.Имя];

КонецЕсли;

КонецЦикла;

Возврат Перечисления.СпособыДоставки.ПустаяСсылка();

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

Возврат пустой ссылки вместо Неопределено упрощает дальнейшую обработку: тип результата остаётся перечислением, и проверка через ЗначениеЗаполнено() сработает корректно.

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

Когда перечисление не подходит

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

Признак ошибки проектирования — регулярные просьбы «добавить ещё одно значение» от пользователей. Каждое такое изменение требует доработки конфигурации, обновления и тестирования, тогда как справочник решает задачу в пользовательском режиме.

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

Перечисление или справочник

Перечисление

Список значений фиксирован, логика кода завязана на конкретные значения, дополнительные данные не нужны

Справочник

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

Проверка корректности кода

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

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

В-третьих, при динамическом обращении по строке проверить результат на пустую ссылку до использования в запросах и присваиваниях. Это защитит от данных, пришедших из внешних систем с устаревшими именами значений.

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

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

Существование значения
Норма

Код компилируется, значение доступно в конфигураторе

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

Ошибка «Поле объекта не обнаружено» при выполнении

Сравнение в условии
Норма

Условие срабатывает на тестовых данных с нужным значением

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

Условие всегда ложно — вероятно, сравнение со строкой

Заполненность реквизита
Норма

ЗначениеЗаполнено() возвращает Истина для заполненного поля

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

Пустая ссылка проходит в логику как валидное значение

Итог

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

Значение перечисления получают через Перечисления.Имя.Значение, в запросах — через ЗНАЧЕНИЕ(Перечисление.Имя.Значение). Заполненность проверяют функцией ЗначениеЗаполнено() или сравнением с ПустаяСсылка(). Перебор значений выполняется через метаданные. Если список значений должен редактировать пользователь — нужен справочник, а не перечисление.

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

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

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

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

Нет. Состав значений перечисления определяется только в конфигураторе. Программно можно лишь читать и использовать существующие значения. Если требуется динамическое добавление — используйте справочник.

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

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

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

Используйте индексное обращение: Перечисления[ИмяПеречисления][ИмяЗначения]. Перед этим проверьте через Метаданные.Перечисления.Найти(ИмяПеречисления), что объект существует, иначе получите ошибку выполнения.

Почему после обновления конфигурации код с перечислением перестал работать?

Поставщик конфигурации мог переименовать или удалить значение перечисления. Найдите в конфигураторе актуальное имя значения и исправьте код. Чтобы снизить риск, по возможности используйте предопределённую логику типовых механизмов вместо жёстких ссылок на значения.