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