Перечисления и константы

Перечисление — жёстко заданный набор вариантов из головы разработчика; константа — одна-единственная настройка на всю базу.

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

Есть данные, у которых заведомо конечное число вариантов, и эти варианты определяет разработчик. Пол — «Мужской» или «Женский». Статус заказа — «Новый», «ВРаботе», «Выполнен», «Отменён». Такие списки не должен и не может пополнять пользователь: если завтра появится статус «Заморожен», это правка конфигурации, а не строчка в справочнике. Для этого и нужны перечисления.

Зачем это нужно на практике

Можно было бы хранить статус строкой: "выполнен". Но тогда один менеджер напишет «Выполнен», другой «выполнено», третий «ВЫП» — и любой отчёт по статусам развалится. Перечисление убирает эту проблему: значения заданы жёстко, опечатка невозможна, а сравнение работает надёжно. Плюс платформа знает все варианты заранее и подставляет их в выпадающий список автоматически.

Перечисления в коде

К значениям перечисления обращаются через глобальное свойство Перечисления, имя перечисления и имя значения — всё через точку:

Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру("ЗК-000077").ПолучитьОбъект();

// Присваиваем значение перечисления
Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе;
Заказ.Записать();

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

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

Если Заказ.Статус = Перечисления.СтатусыЗаказов.Новый Тогда
    ЦветИндикатора = "серый";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе Тогда
    ЦветИндикатора = "жёлтый";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен Тогда
    ЦветИндикатора = "зелёный";
Иначе
    ЦветИндикатора = "красный";
КонецЕсли;

Проверить, что значение вообще выбрано, можно через ЗначениеЗаполнено() — у перечислений есть «пустое» значение (ничего не выбрано):

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

Перебор всех значений перечисления

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

Для Каждого ОписаниеЗначения Из Метаданные.Перечисления.СтатусыЗаказов.ПеречислениеЗначений Цикл
    ЗначениеПеречисления = Перечисления.СтатусыЗаказов[ОписаниеЗначения.Имя];
    Сообщить("Вариант: " + ЗначениеПеречисления);
КонецЦикла;

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

Константы

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

// Прочитать значение константы
ВалютаУчёта = Константы.ОсновнаяВалюта.Получить();
Сообщить("Учёт ведётся в валюте: " + ВалютаУчёта.Наименование);

// Записать значение константы
Константы.НазваниеКомпании.Установить("ООО Ромашка");

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

Перечисление или справочник: как выбрать

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

КритерийПеречислениеСправочник
Кто задаёт значенияРазработчик в конфигуратореПользователь в режиме предприятия
Добавить вариантТолько правкой конфигурацииПрямо в работе, кнопкой «Создать»
Число вариантовМалое и стабильное (2–10)Любое, может расти
Доп. реквизиты у значенияНетЕсть (сколько нужно)
ПримерыПол, СтатусЗаказа, ВидОплатыНоменклатура, Контрагенты, Склады

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

Как это работает

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

Константа физически — это отдельная маленькая таблица (или запись), где хранится единственное значение. Чтение константы — дешёвая операция, но если значение читается в цикле тысячи раз, его лучше прочитать один раз в переменную заранее.

Частые ошибки

  • Сделать перечислением то, что пополняет пользователь. Завели «Города» перечислением — и каждый новый город требует программиста и обновления конфигурации. Изменяемые пользователем списки — всегда справочник.
  • Хранить статус строкой вместо перечисления. Строки «Выполнен»/«выполнено»/«done» невозможно надёжно сравнивать и группировать. Перечисление исключает разнобой.
  • Пытаться завести доп. реквизиты у значения перечисления. У перечисления нет своих полей. Нужны атрибуты у варианта (например, у способа доставки — тариф) — берите справочник.
  • Читать константу в цикле. Константы.Ставка.Получить() внутри цикла на тысячи строк — лишние обращения. Прочитайте один раз до цикла.

Итоги

  • Перечисление — фиксированный список значений от разработчика (пол, статус); пользователь его не пополняет.
  • Обращение через Перечисления.ИмяПеречисления.ИмяЗначения; значения сравнивают на равенство и проверяют через ЗначениеЗаполнено().
  • Константа хранит одно значение на всю базу; читается Константы.Имя.Получить(), пишется .Установить().
  • Выбор перечисление↔справочник решает вопрос «кто ведёт список»: разработчик — перечисление, пользователь — справочник.
  • У значения перечисления нет своих реквизитов; нужны атрибуты варианта — используйте справочник.
Проверьте себя
1. В магазине список городов доставки постоянно пополняется менеджерами. Каким объектом конфигурации его правильнее реализовать?
AПеречислением — это же список фиксированных вариантов
BСправочником — список ведут пользователи и он может расти
CКонстантой — город один на всю базу
DДокументом — доставка это операция
2. Как правильно сравнить статус заказа со значением «Отменён» из перечисления СтатусыЗаказов?
AЕсли Заказ.Статус = "Отменён" Тогда
BЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.Отменён Тогда
CЕсли Заказ.Статус = Справочники.СтатусыЗаказов.Отменён Тогда
DЕсли Заказ.Статус.Отменён = Истина Тогда