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

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

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

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

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

Классические примеры перечислений — виды ставок НДС, пол сотрудника, способы доставки, статусы с фиксированным набором вариантов. Общий признак таких данных: список определяется логикой программы или законодательством, а не текущей хозяйственной деятельностью компании.

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

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

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

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

КритерийПеречислениеСправочник
Кто управляет спискомРазработчик в конфигуратореПользователь в режиме предприятия
Дополнительные реквизитыНет, только значение и синонимДа, любые реквизиты и табличные части
ИерархияНе поддерживаетсяПоддерживается
Изменение составаТолько через обновление конфигурацииВ любой момент без остановки работы
Типичное применениеСтатусы, виды операций, признакиНоменклатура, контрагенты, склады

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

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

Подходит, когда набор значений фиксирован логикой программы и код ветвится по этим значениям через Если или Перечисление.Менеджер. Ограничение: добавление значения требует обновления конфигурации.

Справочник

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

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

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

Где перечисления применяются на практике

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

В собственных доработках перечисления удобны для статусной модели документов: «Черновик», «На согласовании», «Утверждён», «Отклонён». Код проверяет статус через сравнение со значением перечисления, и логика обработки строится вокруг этого фиксированного набора состояний.

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

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

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

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

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

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

Во встроенном языке доступ к значениям перечисления выполняется через менеджер перечисления. Типовые конструкции выглядят так:

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

// логика для утверждённого заказа

КонецЕсли;

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

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

Сообщить("Статус не заполнен");

КонецЕсли;

В запросах значения перечисления передаются через параметр с использованием функции ЗНАЧЕНИЕ:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

Обратите внимание на различие синтаксиса: в коде — «Перечисления» (множественное число) через точку с именем и значением, в запросе — «Перечисление» внутри функции ЗНАЧЕНИЕ. Путаница между этими формами — одна из самых частых ошибок новичков, и компилятор её не всегда диагностирует понятным сообщением.

Типичные ошибки при работе с перечислениями
01
Сравнение значения перечисления со строкой: Документ.Статус = "Утвержден". Такое сравнение всегда ложно или вызывает ошибку преобразования типов — сравнивать нужно со значением через Перечисления.Имя.Значение.
02
Использование перечисления для данных, которые пополняет пользователь, например списка причин отказа. Каждая новая причина требует доработки конфигурации — правильнее был справочник.
03
Удаление или переименование значения, на которое уже ссылаются данные в базе. Старые записи остаются с битой ссылкой на несуществующее значение.
04
Проверка заполненности через пустую строку вместо Перечисления.Имя.ПустаяСсылка().

Изменение и удаление значений: риски и правила

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

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

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

Перечисления и права, обмены, расширения

Несколько практических моментов, которые важно учитывать при работе в реальных проектах, а не в учебной конфигурации.

Перечисления в расширениях конфигурации

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

Перечисления в обменах данными

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

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

Как проверить корректность настройки

Поле со ссылкой на перечисление в форме документа
Норма

Выпадающий список показывает только заданные значения, кнопки создания нового элемента нет

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

Поле позволяет ввести произвольный текст или значения не отображаются

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

Документы открываются, значения отображаются читаемо

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

Вместо значения ошибка или пустое представление

Запрос с отбором по значению перечисления
Норма

Запрос возвращает ожидаемые строки

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

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

Частые вопросы о перечислениях в 1С

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

Нет, это принципиальное ограничение объекта. Состав значений перечисления определяется в конфигураторе и меняется только с обновлением конфигурации. Если пользователям нужно пополнять список самостоятельно, используйте справочник или план видов характеристик.

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

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

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

Сравните значение с пустой ссылкой: Реквизит = Перечисления.ИмяПеречисления.ПустаяСсылка(). Проверка на пустую строку или Неопределено для реквизита этого типа некорректна.

Можно ли хранить у значения перечисления дополнительные данные?

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

Чем перечисление отличается от константы или предопределённого элемента справочника?

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

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

Через метаданные: для каждого значения из Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления. Это полезно для формирования списков выбора, проверок и обработок конвертации данных.

Итог

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

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