Создание перечислений в 1С 8.3: от объекта метаданных до запроса

· 9 мин

Содержание

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

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

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

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

Классические примеры:

  • 🧾 статусы документа: Черновик, Проведён, Отменён;
  • 👥 пол физлица: Мужской, Женский;
  • 📦 вид движения: Приход, Расход;
  • ⚙️ способ расчёта: Процентом, ФиксированнойСуммой.

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

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

Правило простое: если список вариантов задаёт программист и он не должен пополняться из пользовательского режима — это перечисление. Если список ведут пользователи (контрагенты, номенклатура, договоры) — это справочник.

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

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

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

После обновления перечисление сразу доступно во встроенном языке и в конструкторе запросов.

Проверьте перед обновлением конфигурации
Выполнено: 0 / 5

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

Какие свойства настраивают и как хранится перечисление

У самого перечисления настроек немного — это одно из его достоинств. На вкладке Основные доступны:

  • Имя и Синоним — идентификатор для кода и подпись для пользователя.
  • Комментарий — служебная пометка для разработчиков.
  • Представление списка и Расширенное представление списка — как подписывается форма списка значений, если вы её откроете.

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

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

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

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

Порядок значений влияет на их Индекс() и на сортировку в списках выбора. Если потом переставить значения местами, индексы сдвинутся. Не завязывайте бизнес-логику на числовой индекс — сравнивайте значения по имени.

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

Во встроенном языке к значению обращаются через менеджер перечисления: Перечисления.ИмяПеречисления.ИмяЗначения.

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

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

Сравнить:

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

Перебрать все значения перечисления (менеджер перечисления — коллекция):

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

Функция Строка() для значения перечисления возвращает его синоним — то самое читаемое представление. Это удобно для вывода пользователю без ручных сопоставлений.

Проверить, что реквизит не заполнен, помогает пустая ссылка:

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

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

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

Обратите внимание на синтаксис: в коде — Перечисления (множественное число, через менеджер), в запросе внутри ЗНАЧЕНИЕ() — Перечисление (единственное число). Это частый источник ошибок у начинающих.

Если нужно получить список имён и синонимов всех значений (например, для настроек или отчёта), берите их из метаданных:

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

Часто значение перечисления удобнее передать в запрос параметром, а не прописывать ЗНАЧЕНИЕ() в тексте. Тогда один и тот же запрос работает с разными статусами:

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

Порядковый номер значения в списке возвращает метод Индекс():

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

Отсчёт идёт с нуля, по порядку значений на вкладке Данные. Пользуйтесь индексом аккуратно — при перестановке значений он изменится.

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

Перечисление — это полноценный тип данных. Его назначают там же, где любой ссылочный тип:

  • 📄 реквизит документа — например, Статус у заказа;
  • 📘 реквизит справочника — ВидКонтрагента: Поставщик, Покупатель, Прочее;
  • 🧮 реквизит регистра — ВидДвижения;
  • 🖥 реквизит формы или параметр процедуры — чтобы ограничить выбор.

Чтобы назначить тип, откройте нужный реквизит, в поле Тип раскройте дерево и выберите ПеречислениеСсылка → ваше перечисление. После этого на форме реквизит автоматически превращается в поле выбора из значений.

Перечисление можно включать в составной тип. Например, реквизит Основание может принимать и ссылку на документ, и значение перечисления БезОснования. В поле Тип тогда отмечают несколько типов сразу.

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

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

Таблица поможет выбрать подходящий объект под задачу:

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

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

Это главная развилка. Ошибка здесь дорого обходится: если выбрать перечисление там, где нужен справочник, список придётся менять через обновление конфигурации у каждого клиента.

Что выбрать под ваш список значений?

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

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

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

Набор проблем, на которые регулярно натыкаются при разработке:

  • ❌ Путают Перечисления и Перечисление. В коде — Перечисления.Статусы.Новый, в запросе внутри ЗНАЧЕНИЕ() — Перечисление.Статусы.Новый. Платформа выдаёт ошибку, если перепутать.
  • ❌ Завязывают логику на индекс значения. После перестановки значений стрелками индексы сдвигаются, и условия вида «если индекс = 2» начинают срабатывать не на то значение. Сравнивайте по имени.
  • ❌ Хотят добавить реквизит к значению. У значения перечисления есть только имя, синоним и комментарий. Под доп. поля нужен справочник.
  • ❌ Используют перечисление там, где список растёт. Каждый новый пункт — это изменение конфигурации и обновление базы у всех пользователей. Для живых списков берите справочник.
  • ❌ Сравнивают синонимы вместо значений. Код Если Строка(Заказ.Статус) = "Выполнен" сломается, как только кто-то поправит синоним. Сравнивайте сами значения: Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен.
  • ❌ Забывают обновить конфигурацию базы данных. После добавления значений нажмите F7, иначе новое значение не появится в режиме «Предприятие».

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

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

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