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

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

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

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

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

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

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

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

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

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

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

Что такое константа и как она работает

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

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

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

Ключевые различия: сравнение по параметрам

Чтобы выбор был осознанным, полезно сопоставить оба объекта по практически значимым параметрам:

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

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

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

Например: статусы, виды операций, способы оплаты

Значение настраивается в рабочей базеНужна константа

Например: основная организация, префикс, дата запрета

Значений несколько и они разные у разных записейПеречисление как тип реквизита

Константа здесь не подходит — она одна на всю базу

Нужен переключатель функциональностиБулева константа с функциональной опцией

Перечисление для этой задачи избыточно

Когда выбирать перечисление

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

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

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

Когда выбирать константу

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

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

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

Работа в коде: обращение, проверки, запросы

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

При программной проверке значения перечисления полезно помнить про пустую ссылку: реквизит типа «перечисление» может быть не заполнен, и сравнение с конкретным значением вернёт «Ложь». Для проверки заполненности используйте ЗначениеЗаполнено() или сравнение с Перечисления.Имя.ПустаяСсылка().

bsl
// Чтение константы
ОснОрганизация = Константы.ОсновнаяОрганизация.Получить();

// Сравнение перечисления
Если Документ.ВидДоговора = Перечисления.ВидыДоговоров.СПоставщиком Тогда
    // логика для поставщиков
КонецЕсли;

// Запрос со значением перечисления
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.Реализация ГДЕ ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоров.СПокупателем)";

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

Типичные ошибки и как их избежать

Самая частая ошибка — хранить в константе то, что должно быть перечислением или справочником. Например, константа-строка «Текущий статус обработки заказов» не даёт контроля допустимых значений и не позволяет привязать статус к конкретному документу. Итог — опечатки, рассинхронизация логики и невозможность построить корректные отчёты.

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

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

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

Проверка результата после внедрения

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

Для константы проверьте три вещи: значение корректно читается во всех механизмах, которые его используют; пользователь с типовыми правами может его изменить (или, наоборот, не может — если это настройка администратора); при пустом значении алгоритмы ведут себя предсказуемо, а не падают с ошибкой.

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

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

Выпадающий список реквизита
Норма

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

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

Позволяет ввести произвольный текст — тип реквизита не тот

Изменение константы пользователем
Норма

Значение сохраняется и применяется в расчётах

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

Ошибка прав доступа или значение не влияет на логику

Поведение при пустом значении
Норма

Есть явная обработка незаполненного реквизита или константы

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

Ошибки выполнения или неверные результаты расчётов

Обновление конфигурации
Норма

Данные конвертированы, отчёты корректны

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

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

Что выбрать в пограничных случаях

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

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

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

Фиксированный список вариантов, заданный логикой программыСоздайте перечисление и используйте его как тип реквизита
Одно глобальное значение, настраиваемое в рабочей базеСоздайте константу и форму настроек для неё
Список вариантов пополняют пользователиИспользуйте справочник вместо перечисления
Значение зависит от организации, периода или пользователяИспользуйте регистр сведений вместо константы
Нужно включать и выключать блок функциональностиБулева константа, связанная с функциональной опцией

Практическое правило на этапе проектирования: задайте себе два вопроса — «кто задаёт значение» и «сколько значений существует одновременно». Разработчик и много значений-вариантов — перечисление. Пользователь и одно значение на базу — константа. Любой другой ответ ведёт к справочнику или регистру сведений.

Итог

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

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

Частые вопросы

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

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

Может ли константа хранить несколько значений?

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

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

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

Как ограничить, кто может менять константу?

Через механизм ролей: у каждой константы есть права чтения и изменения, которые назначаются ролям в конфигураторе. Настройки, предназначенные только для администратора, включают в роль администратора и исключают из ролей рядовых пользователей. Дополнительно доступ можно ограничить на уровне интерфейса, скрыв форму настроек.

Что быстрее работает в запросах — перечисление или константа?

Разница в производительности несущественна и не должна влиять на выбор объекта. Значение перечисления подставляется в запрос напрямую через ЗНАЧЕНИЕ(), константу лучше передавать параметром, чтобы не обращаться к таблице констант при каждом выполнении. Выбирайте объект по смыслу задачи, а не по скорости.

Чем перечисление отличается от справочника, если оба задают список значений?

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