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

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

Для чего предназначен объект Перечисление в 1С

Разбираем объект метаданных Перечисление в 1С: назначение, создание, работа в коде, сравнение со справочником, типичные ошибки и ответы на частые вопросы.

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

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

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

Какие задачи решает перечисление

Основная задача — типизация выбора. Когда реквизит документа или справочника должен принимать только одно из заранее известных значений, перечисление исключает ошибки ввода: пользователь видит выпадающий список и не может вписать произвольный текст. Это защищает данные от дублирования вариантов вроде «Оплата», «оплата», «Опл.».

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

Третья задача — хранение системных состояний: статусов документов, этапов бизнес-процессов, режимов работы. Здесь важна именно неизменяемость: пользователь не должен иметь возможности добавить «свой» статус, потому что обработчики проведения и отчёты рассчитаны на конкретный набор.

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

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

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

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

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

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

Если Док.СпособДоставки = Перечисления.СпособыДоставки.Самовывоз Тогда

СтоимостьДоставки = 0;

КонецЕсли;

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

Для Каждого Значение Из Метаданные.Перечисления.СпособыДоставки.ЗначенияПеречисления Цикл

Сообщить(Значение.Синоним);

КонецЦикла;

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

bsl
Если Заказ.Статус = Перечисления.СтатусыЗаказа.Отгружен Тогда
    Возврат;
КонецЕсли;

Перечисление или справочник: как выбрать

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

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

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

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

Справочник

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

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

Компромисс: пользователи расширяют список, а критичные для кода элементы заданы разработчиком.

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

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

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

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

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

Как проверить корректность работы

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

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

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

Проверка конфигурации (Конфигурация → Проверка конфигурации)
Норма

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

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

Сообщения о несуществующих значениях перечисления в модулях

Поле ввода в режиме предприятия
Норма

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

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

Пустой список, нечитаемые имена вместо синонимов

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

Ссылки корректны, отчёты открываются без ошибок

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

Записи с «Объект не найден» в реквизитах

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

Ответы на частые вопросы

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

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

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

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

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

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

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

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

Можно ли хранить у значения перечисления дополнительные данные, например ставку или счёт учёта?

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

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

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

Итог

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

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