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