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