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

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

Перечисление в 1С: что это и как с ним работать

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

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

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

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

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

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

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

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

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

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

КритерийПеречислениеСправочник
Кто задаёт значенияРазработчик в конфигуратореПользователь в режиме предприятия
Изменение спискаТолько через обновление конфигурацииСвободное добавление и редактирование
Дополнительные реквизитыНет, только имя и синонимДа, любые реквизиты и табличные части
ИерархияНе поддерживаетсяПоддерживается
Обращение в кодеПеречисления.Имя.ЗначениеПоиск по ссылке, наименованию, коду
Маршрут решения

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

Набор вариантов фиксирован и меняется только вместе с логикой программыИспользуйте перечисление
Пользователь должен добавлять, редактировать или удалять элементыИспользуйте справочник
У элемента нужны дополнительные свойства: ставка, коэффициент, описаниеИспользуйте справочник с реквизитами
Значения участвуют в ветвлении алгоритма (Если ... = Перечисление.Х Тогда)Используйте перечисление

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

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

Создание перечисления занимает пару минут и не требует написания кода — вся работа идёт в дереве конфигурации.

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

После создания перечисление можно назначить типом реквизита: откройте нужный документ или справочник, добавьте реквизит и в поле «Тип» выберите «ПеречислениеСсылка.ИмяПеречисления». Пользователь увидит в форме выпадающий список с вашими значениями.

Как работать с перечислениями в коде

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

Типичные операции в коде: проверка значения реквизита, перебор всех значений перечисления, получение пустой ссылки, проверка на заполненность.

1c
Если Документ.СпособОплаты = Перечисления.СпособыОплаты.Наличный Тогда
    СуммаКомиссии = 0;
КонецЕсли;

// Перебор всех значений перечисления
Для Каждого Значение Из Перечисления.СпособыОплаты Цикл
    Сообщить(Значение);
КонецЦикла;

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

Пустое значение перечисления получают через Перечисления.СпособыОплаты.ПустаяСсылка(). Именно с ним сравнивают реквизит, когда нужно проверить, выбрано ли значение. Для универсальной проверки удобнее функция ЗначениеЗаполнено() — она работает с любыми типами.

В запросах значения перечислений передаются как параметры: Запрос.УстановитьПараметр(\"СпособОплаты\", Перечисления.СпособыОплаты.Наличный). Прямое обращение к менеджеру перечислений внутри текста запроса тоже допустимо через конструкцию ЗНАЧЕНИЕ(Перечисление.СпособыОплаты.Наличный).

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

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

Порядок значений в выпадающем списке соответствует порядку, заданному в конфигураторе на вкладке «Данные». Если нужна логичная последовательность (например, от простого к сложному), расставьте значения кнопками перемещения вверх-вниз — алфавитная сортировка по умолчанию не гарантирована.

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

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

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

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

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

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

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

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

Отображаются все значения с понятными синонимами

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

Список пуст или показывает технические имена

Код сравнения
Норма

Условие срабатывает при выбранном значении

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

Условие всегда ложно — вероятно, сравнение со строкой

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

Реквизиты сохранили значения

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

Значения пропали — удалено использовавшееся значение

FAQ

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

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

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

Переберите коллекцию: Для Каждого Значение Из Перечисления.ИмяПеречисления Цикл ... КонецЦикла. Также можно получить метаданные через Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления, если нужны имена и синонимы.

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

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

Чем перечисление отличается от предопределённых элементов справочника?

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

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

Либо передайте значение параметром через УстановитьПараметр(), либо используйте в тексте запроса конструкцию ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения). Второй способ удобен, когда значение известно заранее и не меняется.

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

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

Итог

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

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