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

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

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

Как создавать и использовать перечисления в 1С: добавление значений, обращение из кода, проверка значений, типичные ошибки и ограничения для разработчиков.

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

Типичные примеры перечислений в типовых конфигурациях: «ВидыСтавокНДС», «ЮридическоеФизическоеЛицо», «Периодичность». Везде, где бизнес-логика опирается на жёстко заданный перечень вариантов, перечисление предпочтительнее справочника: оно хранится компактно, сравнивается быстро и защищено от случайных изменений пользователем.

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

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

Главный критерий выбора — кто и как часто меняет состав значений. Если список вариантов определяется логикой программы и не должен расширяться пользователем (например, статусы «Проведён / Отменён / Черновик»), подходит перечисление. Если пользователи добавляют элементы самостоятельно (номенклатура, контрагенты, склады), нужен справочник.

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

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

Сравнение вариантов

Перечисление

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

Справочник

Пользователь свободно добавляет и редактирует элементы. Подходит для бизнес-данных с открытым составом.

Справочник с предопределёнными элементами

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

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

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

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

После добавления значений обновите конфигурацию базы данных (F7 или меню «Конфигурация — Обновить конфигурацию базы данных»). Без этого шага новое перечисление и его значения не будут доступны в режиме предприятия и в запросах.

Порядок создания перечисления
  1. 1
    В конфигураторе откройте ветку «Перечисления» и добавьте новый объект
  2. 2
    Задайте имя и синоним перечисления
  3. 3
    На закладке «Данные» добавьте значения с именами-идентификаторами и синонимами
  4. 4
    Проверьте имена на соответствие правилам идентификаторов
  5. 5
    Обновите конфигурацию базы данных (F7)
  6. 6
    Проверьте доступность значений в режиме предприятия или через код

Обращение к значениям перечисления из кода

Доступ к значениям выполняется через менеджер перечисления по цепочке Перечисления.ИмяПеречисления.ИмяЗначения. Например: Статус = Перечисления.СтатусЗаказа.ВРаботе;. Результат — значение типа «ПеречислениеСсылка», которое можно присваивать реквизитам, сравнивать и передавать в процедуры.

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

Для перебора всех значений перечисления применяйте коллекцию через менеджер: цикл по Перечисления.СтатусЗаказа позволяет получить каждое значение, например для заполнения списка выбора динамически. Чтобы получить синоним (представление) значения, используйте Строка(Значение) или обращение к метаданным через Метаданные.Перечисления.СтатусЗаказа.ЗначенияПеречисления.

bsl
Если Объект.Статус = Перечисления.СтатусЗаказа.ВРаботе Тогда
    Сообщить("Заказ в работе");
ИначеЕсли Объект.Статус = Перечисления.СтатусЗаказа.Завершён Тогда
    Сообщить("Заказ завершён");
КонецЕсли;

Перечисления в запросах

В языке запросов обращение к значению перечисления выполняется функцией ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения). Пример условия: ГДЕ Заказы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусЗаказа.ВРаботе). Это стандартный и самый надёжный способ отбора по значению перечисления.

Альтернатива — передать значение параметром: ГДЕ Заказы.Статус = &Статус, а параметр установить из кода через Запрос.УстановитьПараметр("Статус", Перечисления.СтатусЗаказа.ВРаботе). Такой подход удобен, когда значение выбирается динамически, например из настроек отчёта.

Частая ошибка — попытка сравнить поле перечисления со строкой: ГДЕ Заказы.Статус = "В работе". Запрос либо вернёт пустой результат, либо выдаст ошибку несовместимости типов, потому что перечисление и строка — разные типы. Всегда используйте ЗНАЧЕНИЕ() или параметр с типизированным значением.

Изменение состава значений: что учесть

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

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

Переименование идентификатора значения ломает весь код, который к нему обращается: модуль не скомпилируется, и вы получите ошибку при обновлении или в runtime. Перед переименованием выполните поиск по всей конфигурации (Правка — Найти) по старому имени и исправьте все обращения.

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

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

У реквизита типа «перечисление» может быть пустое значение — пустая ссылка. Проверить её можно двумя способами: сравнение Если Объект.Статус = Перечисления.СтатусЗаказа.ПустаяСсылка() Тогда или функция ЗначениеЗаполнено(Объект.Статус), которая возвращает Ложь для пустой ссылки.

Не используйте для проверки ПустаяСтрока() — она предназначена для строк и для ссылочных типов даст неверный результат. Аналогично в запросах пустое значение отбирается через ЗНАЧЕНИЕ(Перечисление.СтатусЗаказа.ПустаяСсылка).

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

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

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

Значение доступно в коде
Норма

Конструкция Перечисления.Имя.Значение компилируется без ошибок

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

Ошибка «Переменная не определена» или «Поле не найдено» — проверьте имя и обновление конфигурации БД

Отбор в запросе работает
Норма

Запрос с ЗНАЧЕНИЕ() возвращает ожидаемые записи

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

Пустой результат при заведомо существующих данных — проверьте тип сравниваемого поля

Данные после изменения состава
Норма

Старые документы показывают прежние значения

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

Значения «съехали» или стали пустыми — признак удаления значения из середины списка

Перечисления в формах и отчётах

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

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

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

FAQ: частые вопросы о перечислениях

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

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

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

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

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

Через метаданные: коллекция Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления содержит описания всех значений с именами и синонимами. Для получения самих значений-с сылок используйте обращение Перечисления.ИмяПеречисления[ИмяЗначения] с именем, полученным из метаданных.

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

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

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

Используйте функцию ЗначениеЗаполнено(Объект.Статус) — она вернёт Ложь для пустой ссылки. Альтернатива — прямое сравнение с Перечисления.ИмяПеречисления.ПустаяСсылка(). Не применяйте ПустаяСтрока(): она работает только со строковым типом и даст неверный результат.

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

Да. Передайте значение через Запрос.УстановитьПараметр("Статус", Перечисления.СтатусЗаказа.ВРаботе) и используйте в тексте запроса условие ГДЕ Поле = &Статус. Это удобно, когда значение выбирается динамически, и избавляет от необходимости формировать текст запроса конкатенацией.

Итог

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

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