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