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