Разработка и Конфигурация · 10 мин
Что такое перечисление в 1С и как с ним работать
Перечисление в 1С — что это, для чего нужно, как создать в конфигураторе, обратиться из кода и когда лучше использовать справочник. Примеры и типичные ошибки.
Перечисление в 1С — это объект конфигурации, который хранит фиксированный список значений, заданный разработчиком на этапе проектирования. Классические примеры: виды договоров («С поставщиком», «С покупателем»), способы доставки, пол сотрудника, типы цен. Пользователь не может добавить новое значение перечисления в режиме предприятия — список меняется только через конфигуратор.
Главное отличие перечисления от справочника именно в этом: значения справочника пользователь создаёт и редактирует сам, а значения перечисления «зашиты» в конфигурацию. Поэтому перечисления применяют там, где набор вариантов определён логикой программы и не должен меняться прикладным пользователем.
Значения перечислений хранятся в базе данных компактно и жёстко типизированы. Это даёт два практических преимущества: исключаются ошибки ввода (нельзя написать «Поставщик» с опечаткой) и упрощается код, потому что сравнение идёт с конкретным значением, а не со строкой.
Для чего нужны перечисления и где они применяются
Перечисления решают задачу ограничения выбора: реквизит документа или регистра может принимать только одно из заранее определённых значений. Например, реквизит «Вид операции» в типовых конфигурациях часто реализован перечислением, потому что каждый вид операции обрабатывается своим кодом, и произвольные значения там недопустимы.
Типичные сценарии использования: статусы документов (черновик, проведён, отменён), способы расчёта (наличный, безналичный), периодичность (день, неделя, месяц), варианты алгоритмов в обработках. Везде, где логика программы ветвится по конкретному значению, перечисление надёжнее строки и удобнее справочника.
Обратная сторона — негибкость. Если завтра бизнесу понадобится новый вид договора, потребуется доработка конфигурации и обновление. Поэтому перед выбором типа стоит честно ответить на вопрос: действительно ли список значений контролируется разработчиком, или пользователи будут расширять его сами.
Как создать перечисление в конфигураторе
Создание перечисления выполняется в дереве конфигурации и занимает несколько минут. Понадобятся права на изменение конфигурации и, для рабочей базы, монопольный доступ при обновлении.
- 1Откройте конфигуратор и в дереве конфигурации найдите ветку «Перечисления»
- 2Нажмите правой кнопкой → «Добавить», задайте имя, например «ВидыДоговоров»
- 3Перейдите на вкладку «Данные» и добавьте значения: «СПоставщиком», «СПокупателем»
- 4Задайте синонимы значений — именно их увидит пользователь
- 5Добавьте реквизит нужного объекта с типом «ПеречислениеСсылка.ВидыДоговоров»
- 6Обновите конфигурацию базы данных (F7) и проверьте результат в режиме предприятия
Имя значения перечисления должно быть корректным идентификатором: без пробелов, не начинаться с цифры. Синоним может быть любым — он отображается в интерфейсе. Хорошая практика — давать значениям осмысленные имена, потому что они будут использоваться в коде.
После создания перечисление можно использовать как тип реквизита документов, справочников, регистров сведений и накопления, а также как параметр и переменную в коде. На форме такой реквизит отображается как поле выбора с выпадающим списком.
Как обратиться к значениям перечисления в коде
Во встроенном языке значения перечислений доступны через менеджер перечисления: Перечисления.ВидыДоговоров.СПоставщиком. Это значение имеет тип «ПеречислениеСсылка», и его можно сравнивать, присваивать реквизитам и передавать в запросы как параметр.
Если Договор.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем Тогда
// логика для договора с покупателем
ИначеЕсли Не ЗначениеЗаполнено(Договор.ВидДоговора) Тогда
Сообщить("Вид договора не заполнен");
КонецЕсли;Для перебора всех значений используется коллекция метаданных или метод Перечисления.ВидыДоговоров.Получить(Индекс) вместе с Количество(). Чаще, однако, перебор нужен не значений ссылок, а метаданных — например, при построении динамических отчётов.
Пустое значение перечисления — это не NULL и не пустая строка. Проверять его корректно функцией ЗначениеЗаполнено() или сравнением с Перечисления.ВидыДоговоров.ПустаяСсылка(). Прямое сравнение с Неопределено сработает не всегда и является частой причиной логических ошибок.
Перечисления в запросах
В языке запросов 1С значения перечислений указываются через конструкцию ЗНАЧЕНИЕ(Перечисление.ВидыДоговоров.СПокупателем). Обратите внимание: в запросе имя перечисления пишется в единственном числе после ключевого слова «Перечисление», тогда как в коде — через менеджер во множественном числе.
ВЫБРАТЬ
Договоры.Ссылка
ИЗ
Справочник.Договоры КАК Договоры
ГДЕ
Договоры.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоров.СПокупателем)Альтернатива — передать значение параметром: Запрос.УстановитьПараметр(\"Вид\", Перечисления.ВидыДоговоров.СПокупателем). Это предпочтительнее, когда значение выбирается пользователем в настройках отчёта, — запрос не придётся переписывать под каждый вариант.
Перечисление или справочник: как выбрать
Выбор между перечислением и справочником — проектное решение, которое потом дорого менять: придётся конвертировать данные и переписывать код. Основной критерий — кто управляет списком значений и нужна ли по значениям дополнительная информация.
Перечисление и справочник
Список фиксирован логикой программы, значения меняет только разработчик, дополнительных реквизитов нет. Подходит для статусов, видов операций, вариантов алгоритмов
Пользователь добавляет значения сам, можно хранить реквизиты, иерархию, коды. Подходит для единиц измерения, валют, категорий номенклатуры
Нужен произвольный набор свойств с типизированными значениями, задаваемый пользователем. Подходит для расширяемых характеристик объектов
Практическое правило: если в коде есть ветвление вида «если значение равно такому-то, делай то-то» — это кандидат на перечисление. Если значение — просто данные, с которыми программа работает одинаково, — лучше справочник.
Ограничения и типичные ошибки
У перечислений есть принципиальные ограничения, о которых нужно помнить при проектировании. У значения нет дополнительных реквизитов — нельзя хранить, например, код или комментарий. Нет иерархии и предопределённых пользователем элементов. Пользователь в режиме предприятия не может расширить список.
Отдельная ошибка — проектировать перечисление «с запасом», добавляя значения, для которых нет обработки. Такие значения доступны пользователю для выбора, но программа их игнорирует, что приводит к неочевидному поведению документов. Добавлять значение стоит вместе с кодом, который его обрабатывает.
Как проверить результат работы
После создания перечисления и добавления реквизита проверьте поведение в режиме предприятия: реквизит должен предлагать ровно те значения, что заданы в конфигураторе, а код — корректно их различать.
Как проверить результат
Показывает все значения с понятными синонимами
Значения отсутствуют или отображаются как пустые строки
Выбранное значение сохраняется после записи и закрытия
Значение сбрасывается — проверьте тип реквизита
Каждая ветка Если/ИначеЕсли срабатывает на своём значении
Условия не выполняются — вероятно сравнение со строкой или с Неопределено
Возвращаются только записи с нужным значением
Пустой результат — проверьте синтаксис ЗНАЧЕНИЕ()
Если перечисление используется в типовой конфигурации, которую вы дорабатываете, убедитесь, что изменения не сломают обмены и обновление: добавление своих значений в типовое перечисление усложнит последующие обновления конфигурации.
Что важно запомнить
Перечисление — фиксированный список значений, задаваемый в конфигураторе. Используйте его, когда варианты определены логикой программы и не должны меняться пользователем. В коде обращайтесь через Перечисления.Имя.Значение, в запросах — через ЗНАЧЕНИЕ(Перечисление.Имя.Значение), а для расширяемых пользователем списков выбирайте справочник.
Частые вопросы о перечислениях в 1С
Может ли пользователь добавить значение перечисления в режиме предприятия?
Нет, это принципиальное ограничение. Состав значений перечисления меняется только в конфигураторе с последующим обновлением конфигурации базы данных. Если пользователям нужно добавлять значения самостоятельно, используйте справочник.
Как получить список всех значений перечисления в коде?
Через метаданные: Метаданные.Перечисления.ВидыДоговоров.ЗначенияПеречисления — коллекция, по которой можно пройти циклом. Также доступны методы менеджера Количество() и Получить(Индекс) для обращения по номеру значения.
Что будет, если удалить значение перечисления, которое уже используется в документах?
При обновлении конфигурации платформа может потребовать реструктуризацию, а в записях останутся ссылки на несуществующее значение — они будут отображаться как битые. Перед удалением найдите все использования значения и обработкой замените его в данных на другое.
Как правильно проверить, заполнено ли значение перечисления?
Используйте функцию ЗначениеЗаполнено(Реквизит) или сравнение с пустой ссылкой: Реквизит = Перечисления.ВидыДоговоров.ПустаяСсылка(). Сравнение с Неопределено для реквизитов составного типа может дать неожиданный результат.
Сколько значений можно добавить в перечисление?
Жёсткого практического ограничения, с которым сталкиваются в реальных проектах, нет, однако перечисление с десятками значений — признак неудачного проектирования. Если вариантов много и список растёт, переходите на справочник: он лучше подходит для больших и изменчивых наборов данных.
Чем перечисление отличается от предопределённых элементов справочника?
Предопределённые элементы создаются в конфигураторе, но живут внутри справочника: у них могут быть реквизиты, иерархия, они участвуют в обменах как обычные данные. Перечисление компактнее и строже типизировано, но лишено всей этой гибкости. Выбор зависит от того, нужны ли по значениям дополнительные данные.