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