Перечисление в конфигурации 1С:Предприятие 8.3 — от создания до запросов

· 9 мин

Содержание

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

Перечисления используют, когда набор вариантов жёстко связан с логикой программы: код проверяет «если статус = Выполнен, то…». Если бы такой список могли править пользователи, условия в коде перестали бы работать. Всё ниже относится к платформе 1С:Предприятие 8.3 и одинаково для любой конфигурации — БП, ЗУП, УТ или собственной разработки.

Что такое перечисление в 1С и для чего оно нужно

Технически перечисление — это ссылочный тип данных. Каждое значение хранится в базе как запись со своим уникальным идентификатором и порядковым номером. В реквизитах документов и справочников сохраняется не текст «Выполнен», а ссылка на это значение.

Отсюда три практических свойства:

  • 🔒 Список закрыт. Значения меняются только в конфигураторе с последующим обновлением конфигурации базы данных.
  • 🧩 Код опирается на имена. Разработчик пишет Перечисления.СтатусыЗаказов.Выполнен, и это работает в любой базе с этой конфигурацией.
  • 📋 Порядок фиксирован. Значения выводятся в выпадающем списке и сортируются в отчётах в том порядке, в каком стоят в конфигураторе.

У значения перечисления есть только имя, синоним (то, что видит пользователь) и комментарий. Реквизитов, табличных частей и иерархии у перечисления нет. Если к варианту нужно привязать ещё какие-то данные — ставку, счёт, ответственного, — это уже задача для справочника или регистра сведений.

Какие бывают перечисления: прикладные и системные

В описаниях иногда встречается деление на «простые» и «иерархические» перечисления. На платформе 8.3 иерархических перечислений нет: список значений всегда плоский. Группировать значения по папкам нельзя. Реальное деление другое.

ВидГде описанМожно ли изменитьПримеры
Прикладные (объекты конфигурации)Ветка Перечисления в дереве метаданныхДа, в конфигуратореСтатусыЗаказовКлиентов, ВидыОперацийПоступлениеТоваровУслуг
СистемныеВстроены в платформуНетВидДвиженияНакопления, РежимЗаписиДокумента, РежимДиалогаВопрос

Прикладные перечисления хранятся в базе как отдельные таблицы, на них можно ссылаться из реквизитов. Системные перечисления — часть встроенного языка: их используют только в коде как параметры методов, например Записать(РежимЗаписиДокумента.Проведение).

💡 Если нужна «иерархия» вариантов, обычно делают два перечисления (вид и подвид) или переходят на справочник с группами.

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

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

Шаг 1. Добавьте объект

  1. Откройте базу в режиме Конфигуратор и откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных найдите ветку Перечисления.
  3. Щёлкните по ней правой кнопкой и выберите Добавить.

Шаг 2. Заполните основные свойства

На вкладке «Основные» задайте:

  • Имя — для кода, без пробелов, например СтатусыЗаявок. Имена принято писать во множественном числе.
  • Синоним — для пользователя: «Статусы заявок».
  • Комментарий — по желанию.

Шаг 3. Добавьте значения

На вкладке «Данные» в списке «Значения перечисления» добавьте строки. Для каждой укажите имя и синоним:

ИмяСиноним
НоваяНовая
ВРаботеВ работе
ВыполненаВыполнена
ОтмененаОтменена

Порядок строк здесь и есть порядок значений в программе. Переставить их можно стрелками на панели списка.

Шаг 4. Подключите перечисление к реквизиту

  1. Откройте документ или справочник, где нужен статус.
  2. Добавьте реквизит, например Статус.
  3. В свойстве «Тип» выберите ПеречислениеСсылка.СтатусыЗаявок.

Шаг 5. Обновите конфигурацию базы данных

Нажмите F7 или выберите Конфигурация → Обновить конфигурацию базы данных. Платформа создаст таблицу перечисления и запишет в неё значения.

Обновление структуры базы требует монопольного доступа: попросите пользователей выйти из программы или делайте это вне рабочего времени. Работающие сеансы в любом случае увидят новый объект только после перезапуска программы.

Работа с перечислениями во встроенном языке и запросах

Обращение к значению в коде

К значению обращаются через менеджер перечислений:

Если Объект.Статус = Перечисления.СтатусыЗаявок.Выполнена Тогда
    Объект.ДатаЗакрытия = ТекущаяДатаСеанса();
КонецЕсли;

Пустое значение — это Перечисления.СтатусыЗаявок.ПустаяСсылка(). Проверять заполненность удобнее универсальной функцией:

Если Не ЗначениеЗаполнено(Объект.Статус) Тогда
    Объект.Статус = Перечисления.СтатусыЗаявок.Новая;
КонецЕсли;

Значение перечисления в запросе

В тексте запроса используется функция ЗНАЧЕНИЕ() и слово Перечисление в единственном числе:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Заявки.Ссылка,
|    Заявки.Номер
|ИЗ
|    Документ.Заявка КАК Заявки
|ГДЕ
|    Заявки.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаявок.ВРаботе)";
Выборка = Запрос.Выполнить().Выбрать();

Если значение приходит снаружи, его передают параметром:

Запрос.Текст = "... ГДЕ Заявки.Статус = &Статус";
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаявок.ВРаботе);

💡 При УПОРЯДОЧИТЬ ПО Заявки.Статус записи отсортируются по порядку значений в конфигураторе, а не по алфавиту синонимов. Это удобно для статусов: «Новая» всегда окажется выше «Выполнена».

Имя, индекс и обход всех значений

Иногда нужно получить имя значения — для обмена, логов или сравнения со строкой. Самый короткий способ — XMLСтрока(): для значения перечисления она возвращает его имя.

ИмяЗначения = XMLСтрока(Объект.Статус); // "ВРаботе"

Обойти все значения по порядку можно через метаданные:

Для Каждого ЗначениеМД Из Метаданные.Перечисления.СтатусыЗаявок.ЗначенияПеречисления Цикл
    Значение = Перечисления.СтатусыЗаявок[ЗначениеМД.Имя];
    Сообщить(ЗначениеМД.Синоним + " — индекс " + Формат(Перечисления.СтатусыЗаявок.Индекс(Значение), "ЧН=0; ЧГ=0"));
КонецЦикла;

Метод менеджера Индекс() возвращает позицию значения, начиная с нуля. Обращение Перечисления.СтатусыЗаявок["ВРаботе"] даёт ссылку по имени — так значение восстанавливают из строки.

Что видит пользователь

Поле с типом перечисления в форме по умолчанию показывает выпадающий список синонимов. Посмотреть все значения перечисления пользователь с правами администратора может через Главное меню → Все функции → Перечисления. Изменить их там нельзя.

Модуль менеджера и формы

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

Частые ошибки с перечислениями и как их избежать

Большинство проблем возникает не при создании, а при изменении уже работающего перечисления.

  • ❌ Удалили значение, которое уже записано в документах. В реквизитах останется ссылка на несуществующее значение, и пользователи увидят <Объект не найден>. Перед удалением найдите все объекты с этим значением запросом и замените его на другое.
  • ❌ Переименовали значение в конфигураторе. Синоним менять безопасно. Имя — нет: все строки кода вида Перечисления.СтатусыЗаявок.ВРаботе и тексты запросов с ЗНАЧЕНИЕ(...) перестанут работать. Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) перед переименованием.
  • ❌ Сравнили со строкой. Условие Если Объект.Статус = "Выполнена" всегда ложно: слева ссылка, справа строка. Сравнивайте со значением перечисления.
  • ❌ Склеили значение со строкой в запросе. Подстановка имени значения в текст запроса конкатенацией ломается при переименовании и плохо читается. Используйте параметр или ЗНАЧЕНИЕ().
  • ❌ Положили в перечисление данные, которые меняются. Список банков, складов, видов номенклатуры клиента — не для перечисления. Каждое изменение потребует программиста и обновления конфигурации.

Перед удалением значения перечисления или его переименованием сделайте резервную копию базы (Администрирование → Выгрузить информационную базу в конфигураторе). Ошибка проявится в рабочих данных, а откатить её без копии сложно.

Изменения в типовой конфигурации на поддержке

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

Перечисление или справочник: как выбрать

Главный вопрос — кто и как часто будет менять список вариантов.

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

Промежуточный вариант — справочник с предопределёнными элементами. Код обращается к ним по имени, как к значениям перечисления (Справочники.ИмяСправочника.ИмяЭлемента), а пользователь может добавлять свои элементы и заполнять реквизиты.

Что выбрать для нового списка вариантов?

Примеры использования перечислений на практике

Статус документа с ограничением переходов

Перечисление СтатусыЗаявок хранит статусы, а в модуле объекта проверяется допустимость перехода:

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

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

Вид операции, который меняет форму документа

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

&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
    Элементы.Договор.Видимость =
        (Объект.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОперацийЗаявки.Внутренняя"));
КонецПроцедуры

На клиенте менеджер Перечисления недоступен, поэтому там используют ПредопределенноеЗначение().

Как показать пользователю только часть значений

Бывает, что в конкретной форме часть значений не нужна: например, в заявке менеджер может выбрать только «Новая» и «В работе», а закрывает её руководитель. Удалять значения из перечисления ради этого не надо. Достаточно задать список выбора у поля формы при её открытии:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.Статус.СписокВыбора.Очистить();
    Элементы.Статус.СписокВыбора.Добавить(Перечисления.СтатусыЗаявок.Новая);
    Элементы.Статус.СписокВыбора.Добавить(Перечисления.СтатусыЗаявок.ВРаботе);
КонецПроцедуры

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

Измерение регистра

Перечисление удобно как измерение регистра накопления или сведений: например, «Направление» (Приход/Расход) или «Тип цены». Отчёты группируют данные по значениям в предсказуемом порядке, а отбор в запросе пишется через ЗНАЧЕНИЕ().

Настройка с выпадающим списком

Константа с типом перечисления — простой способ дать администратору выбор режима работы: например, «Способ округления» с тремя вариантами. Код читает Константы.СпособОкругления.Получить() и сравнивает с нужным значением.

Частые вопросы о перечислениях 1С

Можно ли добавить значение перечисления в режиме 1С:Предприятие?
Нет. Значения задаются только в конфигураторе или в расширении. Если пользователи должны пополнять список, нужен справочник.
Почему в запросе пишут «Перечисление», а в коде «Перечисления»?
Это разные механизмы. В коде вы обращаетесь к коллекции менеджеров Перечисления, а в запросе указываете тип объекта метаданных Перечисление.Имя внутри функции ЗНАЧЕНИЕ().
Как получить синоним значения перечисления в виде строки?
Функция Строка(Значение) вернёт представление, то есть синоним. Имя значения возвращает XMLСтрока(Значение).
Сколько значений можно добавить в одно перечисление?
Жёсткого практического предела, с которым сталкиваются в работе, нет. Если значений сотни, это признак того, что данные лучше хранить в справочнике.
Почему пустое значение перечисления не равно Неопределено?
Незаполненный реквизит типа перечисления хранит пустую ссылку этого типа. Сравнивайте с ПустаяСсылка() или используйте ЗначениеЗаполнено().