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

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

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

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

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

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

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

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

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

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

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

Для чего нужны перечисления: основные сценарии

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

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

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

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

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

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

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

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

Справочник

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

Справочник с предопределёнными элементами

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

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

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

Как выбрать тип объекта

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

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

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

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

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

Как обращаться к перечислению из кода

Во встроенном языке значения перечисления доступны через менеджер перечисления по имени. Типовые приёмы — сравнение, присвоение и проверка на пустое значение.

bsl
Если Документ.Статус = Перечисления.СтатусыЗаказа.Закрыт Тогда
    Сообщить("Заказ закрыт, изменения запрещены");
КонецЕсли;

// Присвоение значения
Объект.ВидОперации = Перечисления.ВидыОпераций.Продажа;

// Проверка на незаполненность
Если НЕ ЗначениеЗаполнено(Объект.Статус) Тогда
    Объект.Статус = Перечисления.СтатусыЗаказа.ВРаботе;
КонецЕсли;

Пустое значение перечисления — это отдельное состояние, получаемое через Перечисления.ИмяПеречисления.ПустаяСсылка(). В запросах перечисление передаётся как параметр со значением конкретного элемента, а для проверки пустого значения используется конструкция ЗНАЧЕНИЕ(Перечисление.Имя.ПустаяСсылка).

Перебрать все значения перечисления можно через метаданные: Метаданные.Перечисления.Имя.ЗначенияПеречисления. Это полезно при построении динамических списков выбора или проверке соответствия данных эталонному списку.

Перечисления в запросах и отчётах

В языке запросов значения перечисления задаются литералом ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения). Это предпочтительный способ: запрос остаётся читаемым и не зависит от внутренних номеров значений.

bsl
ВЫБРАТЬ
    Заказы.Ссылка,
    Заказы.Сумма
ИЗ
    Документ.ЗаказКлиента КАК Заказы
ГДЕ
    Заказы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказа.Закрыт)

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

Типичные ошибки и ограничения

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

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

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

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

Выбор значения в форме документа
Норма

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

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

Список пуст или значение сбрасывается после записи

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

Ранее выбранные значения отображаются корректно

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

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

Проверка условия в коде
Норма

Ветка алгоритма срабатывает при нужном значении

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

Условие никогда не выполняется — возможно сравнение со строкой

Отчёт с отбором по перечислению
Норма

Отбор работает, в отчёт попадают ожидаемые документы

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

Отбор пуст — проверьте литерал ЗНАЧЕНИЕ и имя значения

FAQ

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

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

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

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

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

Используйте литерал ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения) в условии ГДЕ. Для проверки на незаполненность применяется ЗНАЧЕНИЕ(Перечисление.Имя.ПустаяСсылка). Передавать значение параметром тоже можно — тогда в коде его берут через Перечисления.Имя.Значение.

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

Для реквизита типа «перечисление» незаполненное состояние — это и есть пустая ссылка данного перечисления. Функция ЗначениеЗаполнено() вернёт Ложь именно для неё. Отдельного значения NULL у реквизитов составного типа нет, если перечисление — единственный тип реквизита.

Можно ли хранить у значений перечисления дополнительные данные, например коэффициент?

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

Итог

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

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