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

· 9 мин

Содержание

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

Чтобы добавить перечисление в 1С 8.3, откройте конфигуратор, найдите в дереве ветку Перечисления и создайте новый объект. На это уходит пара минут. Дальше его значения подставляют в реквизиты справочников и документов и сравнивают в коде.

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

Что такое перечисление и чем оно отличается от справочника

Перечисление — это заранее заданный, неизменяемый при работе список вариантов. Классические примеры из типовых конфигураций: пол физического лица (Мужской, Женский), статусы заказа, виды ставок НДС, способы доставки.

Ключевое отличие от справочника:

  • 🔒 Значения перечисления задаёт разработчик в конфигураторе. Пользователь выбирает из готового списка, но не может добавить своё.
  • 📇 Справочник наоборот — его элементы заводят в режиме Предприятия, список растёт при работе.
  • 🧱 У перечисления есть только два свойства значения: Имя (для кода) и Синоним (для пользователя). Ни кода, ни наименования, ни дополнительных реквизитов, ни иерархии, ни табличных частей у него нет.

Нагляднее — таблицей:

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

Отсюда простое правило выбора: фиксированный набор на 2–10 позиций — перечисление; изменяемый или большой список — справочник. К этому выбору вернёмся ниже отдельно.

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

Порядок действий в конфигураторе 1С 8.3 (интерфейс «Такси», платформа 8.3.2x и новее):

  1. Откройте конфигуратор и загрузите конфигурацию: меню Конфигурация → Открыть конфигурацию. В левой части появится дерево объектов.
  2. Найдите в дереве ветку Перечисления.
  3. Нажмите на ней правой кнопкой → Добавить (или выделите ветку и нажмите Insert). Откроется окно редактирования объекта.
  4. На вкладке Основные задайте Имя — например, СтатусыЗаказов. Имя пишется без пробелов, по нему объект виден в коде. Поле Синоним платформа заполнит автоматически («Статусы заказов») — его показывают пользователю, и его можно переписать как удобно.

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

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

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

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

Значения — это и есть те варианты, между которыми будет выбирать пользователь. Добавить их можно из того же окна редактирования объекта:

  1. Перейдите на вкладку Данные. Там находится список Значения перечисления.
  2. Нажмите Добавить. В строке задайте Имя значения (например, Новый) и при необходимости поправьте Синоним.
  3. Повторите для каждого варианта: Новый, ВРаботе, Выполнен, Отменён.

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

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

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

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

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

Само по себе перечисление ничего не хранит — оно становится полезным, когда его тип назначают реквизиту. Так в карточке документа или справочника появляется поле-выпадающий список с вашими значениями.

Добавим документу ЗаказКлиента реквизит «Статус» с типом нашего перечисления:

  1. Откройте окно редактирования нужного документа (или справочника) в дереве.
  2. Перейдите на вкладку Данные, встаньте на список Реквизиты, нажмите Добавить.
  3. Задайте Имя реквизита, например Статус.
  4. В поле Тип раскройте ветку ПеречислениеСсылка и отметьте галочкой ваше перечисление СтатусыЗаказов.
  5. Обновите конфигурацию базы данных (F7).

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

Чтобы новый документ сразу открывался с нужным статусом (например, Новый), не заставляя выбирать его вручную, задайте начальное значение в свойствах реквизита — в группе свойств, отвечающей за заполнение, укажите это значение перечисления. Тогда при создании документа реквизит заполнится автоматически.

Если реквизит не предлагает значения в выпадающем списке, проверьте две вещи: назначен ли тип именно ПеречислениеСсылка.<Имя> и прошло ли обновление базы данных после правок.

Обращение к значениям перечисления в коде

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

Обращение к конкретному значению идёт через менеджер перечислений:

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

Присвоить значение реквизиту:

НовыйЗаказ.Статус = Перечисления.СтатусыЗаказов.Новый;

Если имя значения вычисляется в виде строки, значение берут через глобальную функцию:

Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Выполнен");

В языке запросов перечисление подставляют литералом ЗНАЧЕНИЕ:

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

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

Реквизит типа перечисление может быть и не заполнен — пользователь просто ничего не выбрал. Проверяют это стандартно:

Если Не ЗначениеЗаполнено(Заказ.Статус) Тогда
    Сообщить("Укажите статус заказа");
КонецЕсли;

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

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

Для Каждого ЗначениеМД Из Метаданные.Перечисления.СтатусыЗаказов.ЗначенияПеречисления Цикл
    Ссылка = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов." + ЗначениеМД.Имя);
    Сообщить(Строка(Ссылка));
КонецЦикла;

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

Перечисление или справочник: что завести

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

Перечисление или справочник — что завести?

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

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

Как изменить и удалить перечисление

Редактирование значений идёт там же, на вкладке Данные. Но есть тонкости, которые ломают работающую конфигурацию.

  • ✏️ Синоним можно переписывать свободно — он только для показа.
  • ⚠️ Имя значения трогать опасно: весь код вида Перечисления.СтатусыЗаказов.Выполнен ссылается именно на имя. Переименовали — ссылки по старому имени оборвутся, конфигурация перестанет собираться. Если имя всё же нужно сменить, после правки найдите и поправьте все обращения в коде.
  • 🔢 Порядок значений меняйте осознанно: он влияет на сортировку в отчётах и списках.
  • ➕ Новое значение в перечисление добавить безопасно — имена уже существующих значений не меняются, код продолжает работать. Поставить его можно в любое место списка, помня про сортировку.

Удаление перечисления или отдельного значения:

  1. Встаньте на объект (или значение) в дереве, нажмите правой кнопкой → Поиск ссылок на объект.
  2. Просмотрите, где он используется: реквизиты, модули, формы, макеты.
  3. Уберите или переназначьте все ссылки, и только потом удаляйте.
  4. Обновите конфигурацию базы данных.

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

Типичные ошибки при работе с перечислениями

Ниже — не повтор инструкции, а ситуации, в которых чаще всего спотыкаются. Подберите свой симптом.

Диагностика: выберите симптом

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

Можно ли добавить значение перечисления в режиме Предприятия?
Нет. Значения задаются только в конфигураторе и являются частью метаданных. В режиме Предприятия пользователь может лишь выбрать готовое значение, но не создать новое. Если список должен пополняться при работе — это задача для справочника.
Чем Имя значения отличается от Синонима?
Имя — это идентификатор для кода (Перечисления.СтатусыЗаказов.Выполнен), менять его опасно. Синоним — подпись для пользователя в формах и списках, его можно переписывать без последствий.
Хранит ли перечисление код или порядковый номер, как справочник?
Нет. У значений перечисления нет ни кода, ни наименования — только Имя и Синоним. Сортировка идёт в том порядке, в котором значения расположены в метаданных, а не по алфавиту и не по номеру.
Сколько значений можно добавить в перечисление?
Платформа жёсткого ограничения не ставит, но перечисление задумано под небольшой фиксированный набор. Если значений десятки и больше или они регулярно меняются — удобнее и правильнее справочник.
Как добавить перечисление, не снимая типовую конфигурацию с поддержки?
Через расширение конфигурации: создайте собственное перечисление в расширении и подключите его. Так изменения не потеряются при обновлении типовой. Расширения работают на платформе 8.3.6 и новее.