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

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

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

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

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

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

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

Синтаксис обращения через менеджер Перечисления

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

ТекущийСтатус = Перечисления.СтатусыЗаказа.ВРаботе;

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

Если имя перечисления заранее неизвестно и вычисляется динамически, используйте обращение через квадратные скобки: Перечисления[ИмяПеречисления][ИмяЗначения], где оба параметра — строки. Это удобно в универсальных механизмах, но лишает вас проверки синтаксиса на этапе компиляции модуля.

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

Для реквизита объекта, у которого тип — ссылка на перечисление, присваивание выполняется напрямую:

ДокументОбъект.Статус = Перечисления.СтатусыЗаказа.Завершен;

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

Для реквизитов формы и параметров запроса логика та же — везде используется значение, полученное через менеджер. В запросе значение перечисления передаётся как параметр:

Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаказа.Новый);

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

Сравнение значений перечислений выполняется обычным оператором равенства — никаких специальных функций не требуется:

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

// действия для завершённого заказа

КонецЕсли;

Для проверки вхождения значения в список допустимых вариантов удобно собрать массив и использовать метод Найти():

АктивныеСтатусы = Новый Массив;

АктивныеСтатусы.Добавить(Перечисления.СтатусыЗаказа.Новый);

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

Если АктивныеСтатусы.Найти(Заказ.Статус) <> Неопределено Тогда

// заказ ещё не закрыт

КонецЕсли;

Сравнение по строковому представлению (Строка(Заказ.Статус) = "В работе") — плохая практика: представление зависит от синонима значения, который может измениться при доработке конфигурации или смене языка интерфейса. Всегда сравнивайте сами значения ссылок.

Проверка на пустое значение

Реквизит типа «перечисление» может быть не заполнен — тогда он содержит пустую ссылку. Есть два равнозначных способа проверки:

Если Заказ.Статус = Перечисления.СтатусыЗаказа.ПустаяСсылка() Тогда

// статус не задан

КонецЕсли;

Если Не ЗначениеЗаполнено(Заказ.Статус) Тогда

// альтернативный вариант проверки

КонецЕсли;

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

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

Обращение к перечислению в запросе

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

ВЫБРАТЬ Заказы.Ссылка

ИЗ Документ.Заказ КАК Заказы

ГДЕ Заказы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказа.Завершен)

Обратите внимание: в запросе используется единственное число «Перечисление», а не «Перечисления», как во встроенном языке. Это частая причина синтаксических ошибок у начинающих разработчиков.

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

Сравнение вариантов

ЗНАЧЕНИЕ() в тексте запроса

Подходит, когда значение известно заранее и имя метаданных стабильно. Ломается при переименовании объекта конфигурации.

Параметр запроса

Универсальный вариант: значение передаётся из кода. Устойчив к переименованию, обязателен при динамическом имени перечисления.

Полезные методы менеджера перечисления

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

  • ПустаяСсылка() — возвращает пустое значение перечисления;
  • Получить(Индекс) — возвращает значение по числовому индексу (начиная с нуля);
  • Количество() — число значений в перечислении;
  • обращение по имени через квадратные скобки — для динамических сценариев.

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

Порядок действий
  1. 1
    Откройте конфигуратор и найдите перечисление в ветке «Перечисления» дерева метаданных
  2. 2
    Запомните имя объекта (не синоним) и имя нужного значения
  3. 3
    В коде напишите обращение: Перечисления.ИмяПеречисления.ИмяЗначения
  4. 4
    Проверьте модуль на синтаксические ошибки — несуществующее имя будет подсвечено
  5. 5
    Выполните код и убедитесь, что реквизит получил нужное значение

Типичные ошибки и их последствия

Самая распространённая проблема — обращение по синониму вместо имени. Имя значения «ВРаботе» и синоним «В работе» — разные вещи; в коде допустимо только имя. Ошибка проявляется сразу при проверке модуля, поэтому её легко поймать.

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

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

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

Как проверить корректность обращения

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

В отладчике значение перечисления отображается своим представлением, а тип — как «ПеречислениеСсылка.ИмяПеречисления». Если вместо этого вы видите строку или «Неопределено», значит обращение построено неверно где-то выше по коду.

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

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

Тип значения в отладчике
Норма

ПеречислениеСсылка с именем нужного перечисления

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

Строка, Неопределено или ссылка другого перечисления

Синтаксическая проверка модуля
Норма

Ошибок нет, имена распознаны

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

Сообщение о необнаруженном идентификаторе

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

Возвращаются строки с нужным статусом

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

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

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

Итог

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

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

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

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

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

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

Да. Используйте коллекцию Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления — из неё доступны имя и синоним каждого значения. Для получения самих значений по индексу применяйте метод менеджера Получить() в цикле от 0 до Количество() - 1.

Почему сравнение значения перечисления со строкой не выдаёт ошибку?

Встроенный язык допускает сравнение значений разных типов — оно просто возвращает «Ложь». Исключение возникает только при явно недопустимых операциях. Поэтому такая ошибка не ловится компилятором и проявляется только как неправильная логика работы программы.

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

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

Что вернёт обращение к реквизиту-перечислению, если он не заполнен?

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