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

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

Перечисления в 1С: для чего нужны и как с ними работать

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

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

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

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

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

В дереве конфигурации перечисления находятся в одноимённой ветке рядом со справочниками и документами. У каждого перечисления есть имя, синоним и набор значений, каждое из которых тоже имеет имя (идентификатор для кода) и синоним (то, что видит пользователь). Дополнительно можно настроить картинку значения, быстрый выбор и представление в интерфейсе.

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

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

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

КритерийПеречислениеСправочник
Кто задаёт состав значенийРазработчик в конфигуратореПользователь в режиме предприятия
Дополнительные реквизитыНет, только значениеДа, любые реквизиты и табличные части
Хранение в базеЧисловой индексСсылка (GUID) на запись таблицы
Иерархия и группыНе поддерживаетсяПоддерживается
Обращение в кодеНапрямую: Перечисления.Имя.ЗначениеЧерез поиск по наименованию, коду или ссылке

Практическое правило простое: если список значений определяется логикой программы и алгоритмы ветвятся по конкретным элементам — это перечисление. Если список отражает предметную область и может пополняться пользователем — это справочник. Статус документа «Черновик / Проведён / Отменён» — перечисление. Список складов компании — справочник.

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

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

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

Справочник

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

Строковый реквизит

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

Типовые сценарии, где перечисления — правильный выбор

Статусы объектов и документов

Самый частый сценарий. Заказ покупателя может быть «В работе», «Согласован», «Отгружен», «Закрыт». Алгоритмы проведения, проверки и построения отчётов опираются на конкретные статусы, поэтому список должен быть неизменным для пользователя. Перечисление гарантирует, что отчёт «Заказы в работе» всегда найдёт нужные документы.

Виды операций и типы движений

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

Настройки с ограниченным набором вариантов

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

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

Если хотя бы раз в год требуется добавить значение без программиста — перечисление создаст проблему

Код ветвится по значениямНужно перечисление

Конструкции Если ... = Перечисления.Имя.Значение требуют гарантированного состава

Нужны дополнительные поляНужен справочник

У значения перечисления нельзя хранить комментарий, картинку-файл или ссылку на другой объект

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

Создание занимает пару минут. В конфигураторе откройте ветку «Перечисления», добавьте новый объект, задайте имя (например, СтатусыЗаказа) и на закладке «Данные» добавьте значения: ВРаботе, Согласован, Закрыт. Для каждого значения заполните синоним — именно его увидит пользователь в выпадающем списке.

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

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

// логика проведения

КонецЕсли;

// Проверка на пустое значение

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

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

КонецЕсли;

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

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

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

Главный риск связан с изменением состава значений на заполненной базе. Удаление значения, которое уже записано в документах, приведёт к тому, что в базе останутся «битые» данные: реквизит будет содержать индекс, которому больше не соответствует ни одно значение. Отчёты и отборы по этому реквизиту начнут вести себя непредсказуемо.

Второй риск — переупорядочивание значений. Значение перечисления хранится как порядковый номер, поэтому вставка нового элемента в середину списка может изменить интерпретацию уже записанных данных в некоторых сценариях обмена и внешних выгрузок. Безопасная практика — добавлять новые значения только в конец списка и никогда не удалять используемые.

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

Типичные ошибки разработчиков

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

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

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

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

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

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

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

Состав выпадающего списка
Норма

Показаны все значения с понятными синонимами

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

Значение отсутствует или отображается имя идентификатора вместо синонима

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

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

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

Отбор пуст, хотя документы с этим статусом есть — возможно, сравнение идёт со строкой

Старые данные после изменения конфигурации
Норма

Все ранее записанные документы открываются и показывают осмысленный статус

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

В старых записях реквизит пустой или отчёт его не видит — признак удалённого значения

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

Итог

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

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

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

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

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

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

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

Чем проверка ПустаяСсылка() отличается от проверки на пустую строку?

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

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

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

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

Да, значения перечислений передаются в запрос как обычные параметры через УстановитьПараметр, либо указываются литералом ЗНАЧЕНИЕ(Перечисление.Имя.Значение). Второй способ удобен, когда значение известно на этапе написания запроса и не меняется динамически.

Что выбрать для статуса, если вариантов всего два — «да» и «нет»?

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