Перечисления и константы
Перечисление — жёстко заданный набор вариантов из головы разработчика; константа — одна-единственная настройка на всю базу.
Перечисление — прикладной объект с заранее зафиксированным списком значений, которые задаёт программист в конфигураторе, а не пользователь. Константа — объект для хранения ровно одного значения на всю информационную базу.
Есть данные, у которых заведомо конечное число вариантов, и эти варианты определяет разработчик. Пол — «Мужской» или «Женский». Статус заказа — «Новый», «ВРаботе», «Выполнен», «Отменён». Такие списки не должен и не может пополнять пользователь: если завтра появится статус «Заморожен», это правка конфигурации, а не строчка в справочнике. Для этого и нужны перечисления.
Зачем это нужно на практике
Можно было бы хранить статус строкой: "выполнен". Но тогда один менеджер напишет «Выполнен», другой «выполнено», третий «ВЫП» — и любой отчёт по статусам развалится. Перечисление убирает эту проблему: значения заданы жёстко, опечатка невозможна, а сравнение работает надёжно. Плюс платформа знает все варианты заранее и подставляет их в выпадающий список автоматически.
Перечисления в коде
К значениям перечисления обращаются через глобальное свойство Перечисления, имя перечисления и имя значения — всё через точку:
Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру("ЗК-000077").ПолучитьОбъект();
// Присваиваем значение перечисления
Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе;
Заказ.Записать();
// Сравниваем со значением перечисления
Если Заказ.Статус = Перечисления.СтатусыЗаказов.Отменён Тогда
Сообщить("Заказ отменён, отгрузка не требуется");
Иначе
Сообщить("Заказ в работе");
КонецЕсли;
Значение перечисления — это самостоятельный тип. Его можно сравнивать на равенство, использовать в Если и, что удобно, в конструкции выбора вариантов через ИначеЕсли:
Если Заказ.Статус = Перечисления.СтатусыЗаказов.Новый Тогда
ЦветИндикатора = "серый";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе Тогда
ЦветИндикатора = "жёлтый";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен Тогда
ЦветИндикатора = "зелёный";
Иначе
ЦветИндикатора = "красный";
КонецЕсли;
Проверить, что значение вообще выбрано, можно через ЗначениеЗаполнено() — у перечислений есть «пустое» значение (ничего не выбрано):
Если НЕ ЗначениеЗаполнено(Заказ.Статус) Тогда
Сообщить("У заказа не указан статус!");
КонецЕсли;
Перебор всех значений перечисления
Иногда нужен весь список вариантов — например, чтобы заполнить фильтр отчёта или проверить логику по каждому статусу. Пройтись по значениям перечисления можно через объект Метаданные, который описывает конфигурацию, и менеджер перечисления:
Для Каждого ОписаниеЗначения Из Метаданные.Перечисления.СтатусыЗаказов.ПеречислениеЗначений Цикл
ЗначениеПеречисления = Перечисления.СтатусыЗаказов[ОписаниеЗначения.Имя];
Сообщить("Вариант: " + ЗначениеПеречисления);
КонецЦикла;
Такой перебор редко нужен на старте, но он показывает важную мысль: перечисление — часть метаданных конфигурации. Платформа знает все его значения ещё до запуска и потому автоматически подставляет их в выпадающие списки на формах — вам не нужно вручную заполнять варианты выбора.
Константы
Константа хранит одно значение на всю базу — то, что нужно задать однажды и использовать везде. Название компании для печатных форм, основная валюта учёта, ставка НДС по умолчанию, ответственное лицо. Работают через глобальное свойство Константы с методами Получить() и Установить():
// Прочитать значение константы
ВалютаУчёта = Константы.ОсновнаяВалюта.Получить();
Сообщить("Учёт ведётся в валюте: " + ВалютаУчёта.Наименование);
// Записать значение константы
Константы.НазваниеКомпании.Установить("ООО Ромашка");
Для группы связанных констант в 1С есть наборы констант, но на старте достаточно помнить главное: константа — это одна ячейка на всю информационную базу, не список.
Перечисление или справочник: как выбрать
Это самый частый вопрос новичка. Оба хранят «варианты выбора», но граница чёткая — кто управляет списком значений:
| Критерий | Перечисление | Справочник |
| Кто задаёт значения | Разработчик в конфигураторе | Пользователь в режиме предприятия |
| Добавить вариант | Только правкой конфигурации | Прямо в работе, кнопкой «Создать» |
| Число вариантов | Малое и стабильное (2–10) | Любое, может расти |
| Доп. реквизиты у значения | Нет | Есть (сколько нужно) |
| Примеры | Пол, СтатусЗаказа, ВидОплаты | Номенклатура, Контрагенты, Склады |
Правило: если варианты знает программист и их немного (пол, статус, тип операции) — перечисление. Если список ведёт пользователь и он может расти (города, банки, товары) — справочник. Сомневаетесь, будет ли пользователь добавлять значения? Скорее всего справочник.
Как это работает
Значения перечисления платформа хранит не текстом, а порядковыми идентификаторами внутри метаданных. В базе у документа лежит компактная ссылка на значение перечисления, а не строка «ВРаботе». Поэтому сравнение перечислений быстрое и не зависит от языка интерфейса: если завтра подключить английскую локализацию, значения останутся теми же, изменится только их отображаемое представление (синоним).
Константа физически — это отдельная маленькая таблица (или запись), где хранится единственное значение. Чтение константы — дешёвая операция, но если значение читается в цикле тысячи раз, его лучше прочитать один раз в переменную заранее.
Частые ошибки
- Сделать перечислением то, что пополняет пользователь. Завели «Города» перечислением — и каждый новый город требует программиста и обновления конфигурации. Изменяемые пользователем списки — всегда справочник.
- Хранить статус строкой вместо перечисления. Строки «Выполнен»/«выполнено»/«done» невозможно надёжно сравнивать и группировать. Перечисление исключает разнобой.
- Пытаться завести доп. реквизиты у значения перечисления. У перечисления нет своих полей. Нужны атрибуты у варианта (например, у способа доставки — тариф) — берите справочник.
- Читать константу в цикле.
Константы.Ставка.Получить()внутри цикла на тысячи строк — лишние обращения. Прочитайте один раз до цикла.
Итоги
- Перечисление — фиксированный список значений от разработчика (пол, статус); пользователь его не пополняет.
- Обращение через
Перечисления.ИмяПеречисления.ИмяЗначения; значения сравнивают на равенство и проверяют черезЗначениеЗаполнено(). - Константа хранит одно значение на всю базу; читается
Константы.Имя.Получить(), пишется.Установить(). - Выбор перечисление↔справочник решает вопрос «кто ведёт список»: разработчик — перечисление, пользователь — справочник.
- У значения перечисления нет своих реквизитов; нужны атрибуты варианта — используйте справочник.