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

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

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

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

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

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

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

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

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

Из этого следуют практические различия. К перечислению нельзя добавить произвольные реквизиты с данными, которые заполнял бы пользователь, — только реквизиты, описанные разработчиком. Значения перечисления доступны в коде как глобальные имена (Перечисления.СтавкиНДС.НДС20), что удобно при программировании. Элементы справочника в коде ищут по наименованию или коду, что менее надёжно.

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

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

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

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

Справочник

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

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

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

Создание перечисления
  1. 1
    Откройте конфигуратор и в дереве конфигурации щёлкните правой кнопкой по ветке «Перечисления», выберите «Добавить».
  2. 2
    На закладке «Основные» задайте имя (латиницей, без пробелов) и синоним — именно синоним увидит пользователь.
  3. 3
    На закладке «Данные» добавьте значения перечисления: для каждого укажите имя и синоним.
  4. 4
    При необходимости настройте формы выбора и списка на закладке «Формы».
  5. 5
    Обновите конфигурацию базы данных (F7) и проверьте, что перечисление доступно в режиме «Предприятие».

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

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

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

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

bsl
Ставка = Перечисления.СтавкиНДС.НДС20;
Если Документ.ВидОперации = Перечисления.ВидыОпераций.Поступление Тогда
	// обработка поступления
КонецЕсли;
Пустая = Перечисления.СтавкиНДС.ПустаяСсылка();

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

Если нужно перебрать все значения перечисления, используется коллекция метаданных: Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления. Это удобно для построения списков выбора в динамических формах.

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

В языке запросов значение перечисления указывается через ключевое слово ЗНАЧЕНИЕ с полным путём: ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20). Обратите внимание: в запросе используется единственное число — «Перечисление», а не «Перечисления» как в коде.

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

Частая ошибка новичков — попытка передать значение перечисления в запрос строкой через параметр. Строка не приводится к типу перечисления автоматически, запрос вернёт пустой результат или ошибку. Передавайте через параметр само значение типа ПеречислениеСсылка, полученное в коде.

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

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

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

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

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

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

Как выбрать объект для списка значений

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

Изменение перечисления в работающей базе

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

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

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

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

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

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

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

Отображение в интерфейсе
Норма

Новое значение видно в выпадающем списке поля, синоним читаемый

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

Значения нет в списке или вместо синонима выводится техническое имя

Сохранение документа с новым значением
Норма

Документ записывается и проводится без ошибок

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

Ошибка при записи или проведении, связанная с реквизитом

Запросы и отчёты
Норма

Отчёты с отбором по значению возвращают данные

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

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

Обмены данными
Норма

Обмен проходит без ошибок сопоставления

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

Ошибки формата или незаполненные значения на принимающей стороне

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

Часто задаваемые вопросы

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

Нет. Состав значений перечисления определяется только в конфигураторе. Если нужна возможность пополнения списка пользователями, используйте справочник — он поддерживает создание элементов в режиме «Предприятие» и настройку прав.

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

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

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

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

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

В коде используется множественное число и точка: Перечисления.СтавкиНДС.НДС20. В запросе — конструкция ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20) с единственным числом «Перечисление». Смешение синтаксиса — частая причина ошибок.

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

Нет, это разные типы данных, и сравнение всегда даст «Ложь». Если у вас строка с именем значения, преобразуйте её через Перечисления.ИмяПеречисления[ИмяСтрокой] с проверкой, что такое значение существует в метаданных.

Как перечисления участвуют в обменах данными?

Значения перечислений сопоставляются по имени, а не по GUID, как элементы справочников. Поэтому имена значений в обеих базах-участницах обмена должны совпадать; переименование значения в одной базе без синхронного изменения в другой приводит к ошибкам сопоставления.

Итог

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

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