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

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

Зачем в 1С нужны перечисления и как их использовать

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

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

Типичные примеры: вид движения по регистру (приход/расход), статус документа (черновик, проведён, отменён), тип цены, способ расчёта, пол сотрудника, система налогообложения. Все эти списки конечны, известны заранее и участвуют в алгоритмах проведения и расчётов. Если бы они хранились в справочнике, любой пользователь с правами мог бы добавить лишний элемент и сломать логику программы.

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

Что такое перечисление и как оно устроено

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

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

Зачем перечисления нужны: основные задачи

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

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

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

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

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

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

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

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

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

Справочник

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

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

Частый паттерн: перечисление задаёт тип (логика), справочник — конкретные экземпляры (данные пользователя).

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

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

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

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

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

bsl
Если Документ.Статус = Перечисления.СтатусыЗаказа.Отгружен Тогда
	// логика для отгруженного заказа
ИначеЕсли Документ.Статус = Перечисления.СтатусыЗаказа.Отменен Тогда
	// логика отмены
КонецЕсли;

Если Не ЗначениеЗаполнено(Документ.Статус) Тогда
	Сообщить("Статус не указан");
КонецЕсли;

Для перебора всех значений используется коллекция менеджера: Для Каждого Значение Из Перечисления.СтатусыЗаказа Цикл. Это удобно при построении списков выбора или проверке полноты обработки всех вариантов. Пустое значение перечисления существует всегда и обозначает «не выбрано» — его нужно учитывать в алгоритмах явно.

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

Типичные ошибки при работе с перечислениями

Типичные ошибки
01
Использование справочника вместо перечисления для статусов — пользователь добавляет элемент, и алгоритм проведения его не обрабатывает.
02
Сравнение значения перечисления со строкой синонима — условие никогда не выполняется или падает с ошибкой.
03
Переименование значения после внедрения без проверки всех мест использования — внешние отчёты и расширения перестают работать.
04
Забытое пустое значение — документ без статуса проходит проверки, потому что условие его не охватывает.
05
Добавление нового значения без доработки всех ветвлений Если/ИначеЕсли — новые документы «молча» не проводятся корректно.

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

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

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

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

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

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

Список выбора содержит ровно заданные значения с понятными синонимами

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

Пустой список, лишние значения или системные наименования вместо синонимов

Проведение документа при каждом значении
Норма

Для каждого значения срабатывает своя ветка алгоритма

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

При некоторых значениях документ проводится «вхолостую» без движений

Синтаксический контроль модулей
Норма

Ошибок обращения к значениям перечисления нет

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

Сообщения о необнаруженном имени значения

Отчёты и отборы по полю
Норма

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

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

Отбор не срабатывает или выдаёт пустой результат

Итог

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

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

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

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

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

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

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

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

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

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

Да, порядок значений задаётся в конфигураторе кнопками перемещения в списке значений. Именно в этом порядке они показываются в списках выбора и при переборе в коде.

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

Передайте значение как параметр: Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаказа.Отгружен), а в тексте запроса сравнивайте поле с параметром. Строковое сравнение с синонимом не работает.

Сколько значений может быть в одном перечислении?

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