Разработка и Конфигурация · 11 мин
Для чего предназначен объект конфигурации «Перечисление» в 1С
Для чего предназначен объект конфигурации «Перечисление» в 1С: устройство, отличия от справочников, примеры использования, настройка и типичные ошибки разработчиков.
Объект конфигурации «Перечисление» в 1С предназначен для хранения фиксированного, заранее определённого списка значений, которые задаёт разработчик на этапе проектирования конфигурации и которые пользователь не может изменить в режиме предприятия. Типичные примеры — виды документов, статусы обработки, варианты налогообложения, пол сотрудника, единицы измерения времени.
Ключевая особенность перечисления в том, что его значения «зашиты» в метаданные конфигурации. Это делает перечисления идеальным инструментом для описания бизнес-логики: алгоритмы проводки, проверки и отборы могут жёстко опираться на конкретные значения, не опасаясь, что пользователь их удалит или переименует.
Неправильный выбор между перечислением, справочником и строкой — одна из самых частых архитектурных ошибок начинающих разработчиков 1С. Ошибка приводит либо к невозможности расширить список без обновления конфигурации, либо к «мусорным» данным, которые ломают отчёты и обмены.
Что представляет собой перечисление и как оно устроено
В дереве конфигурации перечисления располагаются в ветке «Перечисления». Каждое перечисление содержит набор значений, у каждого значения есть имя (идентификатор, по которому к нему обращаются в коде) и синоним (представление, которое видит пользователь). Дополнительно значению можно назначить картинку и комментарий.
В модуле значение перечисления доступно через менеджер: Перечисления.СтавкиНДС.НДС20. Такая конструкция проверяется компилятором — если значение переименуют, код не запустится с понятной ошибкой, а не с «тихим» сбоем логики. Это принципиальное отличие от сравнения со строкой.
Физически значения перечисления хранятся в таблицах базы данных как ссылки внутреннего формата платформы, а не как произвольные строки. Поэтому поиск по перечислению работает быстро, а индексы по реквизитам такого типа эффективны в запросах.
Когда перечисление — правильный выбор
Перечисление оправдано, когда выполняются три условия одновременно: список вариантов полностью известен на этапе разработки, он редко меняется, и от конкретных значений зависит программная логика. Классические примеры — «ВидОперации» документа, «СтатусОбработки» (Новый, ВРаботе, Завершён, Отменён), «Периодичность» (День, Неделя, Месяц).
Если от значения зависит ветвление в коде — например, разные алгоритмы расчёта для разных видов операций — перечисление почти всегда правильнее справочника. Код вида Если ВидОперации = Перечисления.ВидыОпераций.Продажа Тогда ... читается, контролируется платформой и безопасно рефакторится.
Как выбрать тип данных
Чем перечисление отличается от справочника
Разработчики часто колеблются между этими двумя объектами. Различие принципиально: справочник — это пользовательские данные, перечисление — часть программного кода. Добавление элемента справочника не требует обновления конфигурации, добавление значения перечисления — требует.
| Критерий | Перечисление | Справочник |
|---|---|---|
| Кто задаёт значения | Разработчик в конфигураторе | Пользователь в режиме предприятия |
| Изменение списка | Только с обновлением конфигурации | В любой момент без обновления |
| Дополнительные реквизиты | Нет | Да, произвольные |
| Иерархия и группы | Нет | Да |
| Жёсткая привязка логики кода | Да, безопасно | Нет, элемент могут удалить |
| Пометка на удаление | Невозможна | Возможна |
Сравнение вариантов
Подходит для статусов и видов операций; ограничение — список меняется только разработчиком
Подходит для номенклатуры, контрагентов, договоров; ограничение — нельзя безопасно опираться на элементы в коде
Подходит для подсказок без строгой логики; ограничение — опечатки и произвольные значения ломают отчёты
Как создать и настроить перечисление в конфигураторе
Создание перечисления занимает несколько минут, но продумать состав значений стоит заранее: удаление или переименование значения после того, как база наполнена данными, требует аккуратной обработки существующих записей.
- 1В дереве конфигурации откройте ветку «Перечисления» и добавьте новый объект
- 2Задайте имя (идентификатор для кода) и синоним (для пользователя)
- 3На закладке «Данные» добавьте значения: имя и синоним для каждого
- 4При необходимости настройте быстрый выбор и представление на закладке «Формы» и «Интерфейс»
- 5Обновите конфигурацию базы данных (F7) и проверьте, что значения доступны в режиме предприятия
Имена значений давайте осмысленные и стабильные: именно по имени к значению обращается код, и переименование — это фактически изменение API конфигурации. Синонимы, наоборот, можно править свободно — пользователь увидит новое название, а логика не пострадает.
После создания перечисления его обычно используют как тип реквизита: добавьте документу или справочнику реквизит, выберите тип «ПеречислениеСсылка.ИмяПеречисления» — и пользователи получат поле с выпадающим списком строго из заданных значений.
Как работать с перечислениями в коде и запросах
Во встроенном языке значение получают через менеджер перечислений. Проверка значения реквизита выглядит так:
Если Документ.Статус = Перечисления.СтатусыДокумента.Завершён Тогда
// логика для завершённых документов
КонецЕсли;
Для получения пустой ссылки используется метод Перечисления.СтатусыДокумента.ПустаяСсылка(). Проверку на незаполненность удобнее делать функцией ЗначениеЗаполнено() — она корректно работает и с перечислениями.
В запросах перечисление передаётся как параметр со значением-ссылкой: ГДЕ Статус = &Статус, а параметр устанавливается через Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыДокумента.ВРаботе). Сравнивать перечисление со строковым представлением в запросе нельзя — это частая ошибка, приводящая к пустой выборке.
Обмен данными и расширения: ограничения перечислений
При обмене между конфигурациями перечисления сопоставляются по именам значений. Если в одной базе значение называется «ВРаботе», а в другой — «В_работе», конвертация потребует явного правила, иначе значение потеряется. Поэтому в типовых конфигурациях имена значений стараются не менять.
В расширениях конфигурации добавить новое значение в существующее перечисление основной конфигурации нельзя — можно только создать собственное перечисление. Это важное ограничение: если доработка требует нового статуса, а конфигурация на поддержке, придётся либо снимать объект с поддержки, либо выносить статус в дополнительный реквизит-справочник.
Типичные ошибки и как их избежать
Большинство проблем с перечислениями возникает не из-за самого объекта, а из-за неверного выбора типа данных на этапе проектирования.
Ещё одна распространённая ситуация — попытка добавить к значению перечисления дополнительные свойства, например цвет или коэффициент. У перечислений нет реквизитов. Если к каждому варианту нужны атрибуты, правильное решение — справочник, а жёсткость логики обеспечивается предопределёнными элементами.
Перед тем как вводить новое перечисление, ответьте на вопрос: «Кто будет добавлять значения через год эксплуатации?» Если ответ — «пользователь» или «не знаю», выбирайте справочник. Переделывать перечисление в справочник в заполненной базе заметно дороже, чем принять верное решение сразу.
Как проверить, что перечисление работает правильно
После внедрения перечисления полезно пройти короткий контроль: значения отображаются пользователю понятными синонимами, отборы в списках работают, отчёты группируют данные по новому реквизиту, а обмены переносят значения без потерь.
Как проверить результат
Выпадающий список содержит ровно заданные значения
Список пуст или доступен произвольный ввод
Отбираются только записи с выбранным значением
Отбор возвращает пустой список при заведомо существующих записях
Каждое значение — отдельная группа с корректным представлением
Значения слипаются в одну группу или отображаются как пустые
Значение переносится и сопоставляется
В приёмнике поле остаётся пустым
Что важно запомнить
Перечисление — закрытый список значений, заданный разработчиком для нужд программной логики. Выбирайте его, когда варианты фиксированы и от них зависит код; для пользовательских списков берите справочник. Изменение значений в рабочей базе делайте только после резервной копии и поиска всех использований.
Частые вопросы
Может ли пользователь добавить значение в перечисление в режиме 1С:Предприятие?
Нет. Состав значений перечисления определяется только в конфигураторе и требует обновления конфигурации базы данных. Если пользователям нужно дополнять список самостоятельно, используйте справочник.
Что будет со старыми документами, если удалить значение перечисления?
Платформа при обновлении конфигурации проверит использование значения и, как правило, не даст удалить значение, на которое есть ссылки, либо потребует очистки. Если значение всё же оказалось удалено, в записях останется некорректная ссылка, что приведёт к ошибкам при открытии и проведении документов. Поэтому вместо удаления часто просто перестают использовать значение в новых документах.
Можно ли сортировать значения перечисления в произвольном порядке?
Да. Порядок значений в списке выбора определяется порядком их следования в конфигураторе на закладке «Данные». Значения можно перемещать вверх и вниз, чтобы часто используемые варианты были первыми.
Чем перечисление отличается от предопределённых элементов справочника?
Предопределённые элементы — это компромисс: элементы создаются разработчиком и доступны в коде по имени, но физически остаются данными справочника, их можно пометить на удаление (при определённых настройках), а в обменах они сопоставляются сложнее. Перечисление надёжнее для чистой логики, предопределённые элементы удобнее, когда к значению нужны реквизиты.
Как получить представление значения перечисления строкой?
Функция Строка(ЗначениеПеречисления) или обращение к представлению вернёт синоним значения. Для вывода в печатные формы и сообщения этого достаточно, но для сравнений строковое представление использовать нельзя — сравнивайте сами значения-ссылки.
Можно ли в расширении добавить значение в типовое перечисление?
Нет, расширения позволяют создавать собственные перечисления, но не изменяют состав значений заимствованных. Если нужен дополнительный статус в типовом механизме, варианты — дополнительный реквизит, собственный справочник статусов или изменение основной конфигурации с учётом последствий для обновлений.