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

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

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

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

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

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

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

Что такое перечисление и как оно устроено

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

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

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

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

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

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

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

Как выбрать тип данных

Набор вариантов определяет ветвление логики в кодеИспользуйте перечисление
Пользователи должны добавлять варианты самостоятельноИспользуйте справочник
У каждого варианта нужны свои реквизиты (ставка, счёт учёта, коэффициент)Используйте справочник — у значений перечисления реквизитов нет
Вариантов два-три и они никогда не меняютсяРассмотрите перечисление или булево — не создавайте справочник ради двух строк

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Перечисления в типовых конфигурациях

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

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

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

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

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

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

Состав выпадающего списка в форме
Норма

Все значения из конфигуратора, порядок соответствует заданному

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

Список пуст или отсутствуют часть значений — реквизит не того типа или форма не обновлена

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

Записывается без ошибок, значение сохраняется после переоткрытия

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

Ошибка при записи или значение сбрасывается

Срабатывание логики по значению
Норма

Ветвление в коде выполняется для каждого значения

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

Нужная ветка не выполняется — проверьте сравнение и обработку пустой ссылки

Отчёты и запросы по реквизиту
Норма

Значение передаётся параметром типа перечисления, данные отбираются

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

Отбор не работает — вероятно, параметр передан строкой

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

Итог

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

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

Частые вопросы

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

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

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

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

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

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

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

Передайте значение параметром запроса: установите параметр в конкретное значение вида Перечисления.ИмяПеречисления.ИмяЗначения и сравните поле запроса с этим параметром. Сравнение со строкой-представлением не сработает, потому что типы данных не совпадают.

Сколько значений может быть в перечислении?

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

Можно ли добавить перечисление через расширение конфигурации?

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