Перечисление в конфигурации 1С:Предприятие 8.3 — от создания до запросов
Содержание
Перечисление в 1С — объект конфигурации с фиксированным списком значений, который задаёт разработчик в конфигураторе. Пользователь в режиме 1С:Предприятие выбирает из этого списка, но не может добавить, удалить или переименовать значение. Типичные примеры в типовых конфигурациях: статусы заказов, виды операций документов, ставки НДС, пол физического лица.
Перечисления используют, когда набор вариантов жёстко связан с логикой программы: код проверяет «если статус = Выполнен, то…». Если бы такой список могли править пользователи, условия в коде перестали бы работать. Всё ниже относится к платформе 1С:Предприятие 8.3 и одинаково для любой конфигурации — БП, ЗУП, УТ или собственной разработки.
Что такое перечисление в 1С и для чего оно нужно
Технически перечисление — это ссылочный тип данных. Каждое значение хранится в базе как запись со своим уникальным идентификатором и порядковым номером. В реквизитах документов и справочников сохраняется не текст «Выполнен», а ссылка на это значение.
Отсюда три практических свойства:
- 🔒 Список закрыт. Значения меняются только в конфигураторе с последующим обновлением конфигурации базы данных.
- 🧩 Код опирается на имена. Разработчик пишет
Перечисления.СтатусыЗаказов.Выполнен, и это работает в любой базе с этой конфигурацией. - 📋 Порядок фиксирован. Значения выводятся в выпадающем списке и сортируются в отчётах в том порядке, в каком стоят в конфигураторе.
У значения перечисления есть только имя, синоним (то, что видит пользователь) и комментарий. Реквизитов, табличных частей и иерархии у перечисления нет. Если к варианту нужно привязать ещё какие-то данные — ставку, счёт, ответственного, — это уже задача для справочника или регистра сведений.
Какие бывают перечисления: прикладные и системные
В описаниях иногда встречается деление на «простые» и «иерархические» перечисления. На платформе 8.3 иерархических перечислений нет: список значений всегда плоский. Группировать значения по папкам нельзя. Реальное деление другое.
| Вид | Где описан | Можно ли изменить | Примеры |
|---|---|---|---|
| Прикладные (объекты конфигурации) | Ветка Перечисления в дереве метаданных | Да, в конфигураторе | СтатусыЗаказовКлиентов, ВидыОперацийПоступлениеТоваровУслуг |
| Системные | Встроены в платформу | Нет | ВидДвиженияНакопления, РежимЗаписиДокумента, РежимДиалогаВопрос |
Прикладные перечисления хранятся в базе как отдельные таблицы, на них можно ссылаться из реквизитов. Системные перечисления — часть встроенного языка: их используют только в коде как параметры методов, например Записать(РежимЗаписиДокумента.Проведение).
💡 Если нужна «иерархия» вариантов, обычно делают два перечисления (вид и подвид) или переходят на справочник с группами.
Как создать перечисление в конфигураторе: пошагово
Создавать и менять перечисления можно в своей конфигурации или в типовой, снятой с поддержки. Для типовой на поддержке правильнее использовать расширение — об этом ниже.
Шаг 1. Добавьте объект
- Откройте базу в режиме
Конфигуратори откройте конфигурацию:Конфигурация → Открыть конфигурацию. - В дереве метаданных найдите ветку
Перечисления. - Щёлкните по ней правой кнопкой и выберите
Добавить.
Шаг 2. Заполните основные свойства
На вкладке «Основные» задайте:
- Имя — для кода, без пробелов, например
СтатусыЗаявок. Имена принято писать во множественном числе. - Синоним — для пользователя: «Статусы заявок».
- Комментарий — по желанию.
Шаг 3. Добавьте значения
На вкладке «Данные» в списке «Значения перечисления» добавьте строки. Для каждой укажите имя и синоним:
| Имя | Синоним |
|---|---|
Новая | Новая |
ВРаботе | В работе |
Выполнена | Выполнена |
Отменена | Отменена |
Порядок строк здесь и есть порядок значений в программе. Переставить их можно стрелками на панели списка.
Шаг 4. Подключите перечисление к реквизиту
- Откройте документ или справочник, где нужен статус.
- Добавьте реквизит, например
Статус. - В свойстве «Тип» выберите
ПеречислениеСсылка.СтатусыЗаявок.
Шаг 5. Обновите конфигурацию базы данных
Нажмите F7 или выберите Конфигурация → Обновить конфигурацию базы данных. Платформа создаст таблицу перечисления и запишет в неё значения.
Обновление структуры базы требует монопольного доступа: попросите пользователей выйти из программы или делайте это вне рабочего времени. Работающие сеансы в любом случае увидят новый объект только после перезапуска программы.
Работа с перечислениями во встроенном языке и запросах
Обращение к значению в коде
К значению обращаются через менеджер перечислений:
Если Объект.Статус = Перечисления.СтатусыЗаявок.Выполнена Тогда
Объект.ДатаЗакрытия = ТекущаяДатаСеанса();
КонецЕсли;
Пустое значение — это Перечисления.СтатусыЗаявок.ПустаяСсылка(). Проверять заполненность удобнее универсальной функцией:
Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
Объект.Статус = Перечисления.СтатусыЗаявок.Новая;
КонецЕсли;
Значение перечисления в запросе
В тексте запроса используется функция ЗНАЧЕНИЕ() и слово Перечисление в единственном числе:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заявки.Ссылка,
| Заявки.Номер
|ИЗ
| Документ.Заявка КАК Заявки
|ГДЕ
| Заявки.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаявок.ВРаботе)";
Выборка = Запрос.Выполнить().Выбрать();
Если значение приходит снаружи, его передают параметром:
Запрос.Текст = "... ГДЕ Заявки.Статус = &Статус";
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаявок.ВРаботе);
💡 При УПОРЯДОЧИТЬ ПО Заявки.Статус записи отсортируются по порядку значений в конфигураторе, а не по алфавиту синонимов. Это удобно для статусов: «Новая» всегда окажется выше «Выполнена».
Имя, индекс и обход всех значений
Иногда нужно получить имя значения — для обмена, логов или сравнения со строкой. Самый короткий способ — XMLСтрока(): для значения перечисления она возвращает его имя.
ИмяЗначения = XMLСтрока(Объект.Статус); // "ВРаботе"
Обойти все значения по порядку можно через метаданные:
Для Каждого ЗначениеМД Из Метаданные.Перечисления.СтатусыЗаявок.ЗначенияПеречисления Цикл
Значение = Перечисления.СтатусыЗаявок[ЗначениеМД.Имя];
Сообщить(ЗначениеМД.Синоним + " — индекс " + Формат(Перечисления.СтатусыЗаявок.Индекс(Значение), "ЧН=0; ЧГ=0"));
КонецЦикла;
Метод менеджера Индекс() возвращает позицию значения, начиная с нуля. Обращение Перечисления.СтатусыЗаявок["ВРаботе"] даёт ссылку по имени — так значение восстанавливают из строки.
Что видит пользователь
Поле с типом перечисления в форме по умолчанию показывает выпадающий список синонимов. Посмотреть все значения перечисления пользователь с правами администратора может через Главное меню → Все функции → Перечисления. Изменить их там нельзя.
Модуль менеджера и формы
Несмотря на простоту, у перечисления есть модуль менеджера и собственные формы списка и выбора. В модуле менеджера удобно держать служебные функции, связанные со списком: например, функцию «статус считается закрытым», которая возвращает Истина для «Выполнена» и «Отменена». Тогда это правило живёт в одном месте, а не копируется по десятку модулей.
Частые ошибки с перечислениями и как их избежать
Большинство проблем возникает не при создании, а при изменении уже работающего перечисления.
- ❌ Удалили значение, которое уже записано в документах. В реквизитах останется ссылка на несуществующее значение, и пользователи увидят
<Объект не найден>. Перед удалением найдите все объекты с этим значением запросом и замените его на другое. - ❌ Переименовали значение в конфигураторе. Синоним менять безопасно. Имя — нет: все строки кода вида
Перечисления.СтатусыЗаявок.ВРаботеи тексты запросов сЗНАЧЕНИЕ(...)перестанут работать. Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) перед переименованием. - ❌ Сравнили со строкой. Условие
Если Объект.Статус = "Выполнена"всегда ложно: слева ссылка, справа строка. Сравнивайте со значением перечисления. - ❌ Склеили значение со строкой в запросе. Подстановка имени значения в текст запроса конкатенацией ломается при переименовании и плохо читается. Используйте параметр или
ЗНАЧЕНИЕ(). - ❌ Положили в перечисление данные, которые меняются. Список банков, складов, видов номенклатуры клиента — не для перечисления. Каждое изменение потребует программиста и обновления конфигурации.
Перед удалением значения перечисления или его переименованием сделайте резервную копию базы (Администрирование → Выгрузить информационную базу в конфигураторе). Ошибка проявится в рабочих данных, а откатить её без копии сложно.
Изменения в типовой конфигурации на поддержке
Если базу обновляют типовыми релизами, не правьте перечисления в основной конфигурации — это снимет объект с поддержки и усложнит обновления. В расширении конфигурации можно заимствовать перечисление и добавить к нему собственные значения. Значения из основной конфигурации при этом удалить или изменить нельзя.
Перечисление или справочник: как выбрать
Главный вопрос — кто и как часто будет менять список вариантов.
| Критерий | Перечисление | Справочник |
|---|---|---|
| Кто добавляет значения | Только разработчик | Пользователь |
| Дополнительные реквизиты | Нет | Сколько угодно |
| Иерархия, группы | Нет | Есть |
| Использование в условиях кода | Надёжно, по имени | Нужны предопределённые элементы |
| Изменение списка | Через конфигуратор и обновление БД | В режиме 1С:Предприятие |
| Типичный размер | Единицы — десятки значений | Без ограничений |
Промежуточный вариант — справочник с предопределёнными элементами. Код обращается к ним по имени, как к значениям перечисления (Справочники.ИмяСправочника.ИмяЭлемента), а пользователь может добавлять свои элементы и заполнять реквизиты.
Примеры использования перечислений на практике
Статус документа с ограничением переходов
Перечисление СтатусыЗаявок хранит статусы, а в модуле объекта проверяется допустимость перехода:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Статус = Перечисления.СтатусыЗаявок.Выполнена
И Не ЗначениеЗаполнено(Исполнитель) Тогда
ОбщегоНазначения.СообщитьПользователю("Укажите исполнителя перед закрытием заявки.", , "Исполнитель", "Объект", Отказ);
КонецЕсли;
КонецПроцедуры
Процедура ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на Библиотеке стандартных подсистем (БП, ЗУП, УТ и др.). В своей конфигурации без БСП используйте объект СообщениеПользователю.
Вид операции, который меняет форму документа
В типовых документах поступления и реализации есть реквизит «Вид операции» с типом перечисления. От его значения зависят видимые поля формы и проводки. В своей конфигурации тот же приём выглядит так: код формы при смене значения вызывает процедуру, которая включает или прячет элементы:
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
Элементы.Договор.Видимость =
(Объект.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОперацийЗаявки.Внутренняя"));
КонецПроцедуры
На клиенте менеджер Перечисления недоступен, поэтому там используют ПредопределенноеЗначение().
Как показать пользователю только часть значений
Бывает, что в конкретной форме часть значений не нужна: например, в заявке менеджер может выбрать только «Новая» и «В работе», а закрывает её руководитель. Удалять значения из перечисления ради этого не надо. Достаточно задать список выбора у поля формы при её открытии:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Статус.СписокВыбора.Очистить();
Элементы.Статус.СписокВыбора.Добавить(Перечисления.СтатусыЗаявок.Новая);
Элементы.Статус.СписокВыбора.Добавить(Перечисления.СтатусыЗаявок.ВРаботе);
КонецПроцедуры
Это ограничение только интерфейса. Значение по-прежнему можно записать из кода или обработки, поэтому важные правила проверяйте ещё и в модуле объекта, как в примере выше со статусом.
Измерение регистра
Перечисление удобно как измерение регистра накопления или сведений: например, «Направление» (Приход/Расход) или «Тип цены». Отчёты группируют данные по значениям в предсказуемом порядке, а отбор в запросе пишется через ЗНАЧЕНИЕ().
Настройка с выпадающим списком
Константа с типом перечисления — простой способ дать администратору выбор режима работы: например, «Способ округления» с тремя вариантами. Код читает Константы.СпособОкругления.Получить() и сравнивает с нужным значением.
Частые вопросы о перечислениях 1С
Можно ли добавить значение перечисления в режиме 1С:Предприятие?
Почему в запросе пишут «Перечисление», а в коде «Перечисления»?
Перечисления, а в запросе указываете тип объекта метаданных Перечисление.Имя внутри функции ЗНАЧЕНИЕ().Как получить синоним значения перечисления в виде строки?
Строка(Значение) вернёт представление, то есть синоним. Имя значения возвращает XMLСтрока(Значение).Сколько значений можно добавить в одно перечисление?
Почему пустое значение перечисления не равно Неопределено?
ПустаяСсылка() или используйте ЗначениеЗаполнено().