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

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

Для чего предназначен объект конфигурации «Перечисление» в 1С

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

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

Ключевая особенность перечисления в том, что его значения «зашиты» в метаданные конфигурации. Это делает перечисления идеальным инструментом для описания бизнес-логики: алгоритмы проводки, проверки и отборы могут жёстко опираться на конкретные значения, не опасаясь, что пользователь их удалит или переименует.

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

Что представляет собой перечисление и как оно устроено

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

В модуле значение перечисления доступно через менеджер: Перечисления.СтавкиНДС.НДС20. Такая конструкция проверяется компилятором — если значение переименуют, код не запустится с понятной ошибкой, а не с «тихим» сбоем логики. Это принципиальное отличие от сравнения со строкой.

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

Когда перечисление — правильный выбор

Перечисление оправдано, когда выполняются три условия одновременно: список вариантов полностью известен на этапе разработки, он редко меняется, и от конкретных значений зависит программная логика. Классические примеры — «ВидОперации» документа, «СтатусОбработки» (Новый, ВРаботе, Завершён, Отменён), «Периодичность» (День, Неделя, Месяц).

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

Маршрут решения

Как выбрать тип данных

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

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

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

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

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

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

Подходит для статусов и видов операций; ограничение — список меняется только разработчиком

Справочник

Подходит для номенклатуры, контрагентов, договоров; ограничение — нельзя безопасно опираться на элементы в коде

Строка со списком выбора

Подходит для подсказок без строгой логики; ограничение — опечатки и произвольные значения ломают отчёты

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

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

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

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

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

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

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

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

// логика для завершённых документов

КонецЕсли;

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

В запросах перечисление передаётся как параметр со значением-ссылкой: ГДЕ Статус = &Статус, а параметр устанавливается через Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыДокумента.ВРаботе). Сравнивать перечисление со строковым представлением в запросе нельзя — это частая ошибка, приводящая к пустой выборке.

Обмен данными и расширения: ограничения перечислений

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

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

Типичные ошибки и как их избежать

Большинство проблем с перечислениями возникает не из-за самого объекта, а из-за неверного выбора типа данных на этапе проектирования.

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

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

Перед тем как вводить новое перечисление, ответьте на вопрос: «Кто будет добавлять значения через год эксплуатации?» Если ответ — «пользователь» или «не знаю», выбирайте справочник. Переделывать перечисление в справочник в заполненной базе заметно дороже, чем принять верное решение сразу.
ПЗ
Практическое замечание

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

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

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

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

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

Выпадающий список содержит ровно заданные значения

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

Список пуст или доступен произвольный ввод

Отбор по значению в списке документов
Норма

Отбираются только записи с выбранным значением

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

Отбор возвращает пустой список при заведомо существующих записях

Отчёт с группировкой по реквизиту
Норма

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

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

Значения слипаются в одну группу или отображаются как пустые

Обмен с другой базой
Норма

Значение переносится и сопоставляется

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

В приёмнике поле остаётся пустым

Итог

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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