Создание перечислений в 1С 8.3: от объекта метаданных до запроса
Содержание
Перечисление в 1С создают в конфигураторе: в дереве конфигурации находите ветку Перечисления, добавляете новый объект, задаёте ему имя и на вкладке Данные перечисляете возможные значения. После обновления конфигурации базы данных (F7) готовый набор доступен в модулях, запросах и на формах. Сама процедура занимает пару минут.
Сложность не в том, как создать перечисления в 1С, а в том, когда их вообще стоит применять и как потом с ними работать в коде. Перечисление — это жёсткий список вариантов, заданный на этапе разработки: статусы заказа, виды операций, пол сотрудника. Пользователь такой список не меняет — это и есть главное отличие от справочника. Ниже разберём объект по порядку: структуру, создание, значения, обращение из встроенного языка и запросов, типизацию и типичные промахи.
Что такое перечисление и зачем оно нужно
Перечисление — это объект метаданных, который хранит фиксированный, заранее известный набор значений. Набор определяется в конфигураторе и не редактируется в режиме «1С:Предприятие». Разработчик один раз описывает варианты, а прикладной код оперирует ими как константами.
Классические примеры:
- 🧾 статусы документа:
Черновик,Проведён,Отменён; - 👥 пол физлица:
Мужской,Женский; - 📦 вид движения:
Приход,Расход; - ⚙️ способ расчёта:
Процентом,ФиксированнойСуммой.
У перечисления нет таблицы с данными, как у справочника или документа. Значения — часть конфигурации, а не пользовательские записи. В базе хранится только ссылка на конкретное значение. Тип этой ссылки — ПеречислениеСсылка.ИмяПеречисления.
Каждое значение имеет два имени. Имя (латиницей, без пробелов) используется в коде — например, Выполнен. Синоним — это то, что видит пользователь в списке выбора: «Выполнен». Синоним можно писать по-русски и менять, не трогая код.
Правило простое: если список вариантов задаёт программист и он не должен пополняться из пользовательского режима — это перечисление. Если список ведут пользователи (контрагенты, номенклатура, договоры) — это справочник.
Как создать перечисление в конфигураторе пошагово
Создание перечисления в 1С 8.3 идёт через дерево конфигурации. Порядок действий:
- Откройте конфигуратор и загруженную конфигурацию (
Конфигурация→Открыть конфигурацию). - В дереве найдите ветку
Перечисления. - Нажмите на ней правой кнопкой →
Добавить(или выделите ветку и нажмитеIns). - Откроется редактор нового объекта. На вкладке
ОсновныезадайтеИмя— например,СтатусыЗаказов. ПолеСинонимподставится автоматически; при необходимости поправьте его на читаемое «Статусы заказов». - Перейдите на вкладку
Данные— здесь находится списокЗначения перечисления. - Кнопкой
Добавитьвнесите каждое значение: задайтеИмя(например,Новый) иСиноним(«Новый»). - Стрелками вверх/вниз расставьте значения в нужном порядке — порядок в списке задаёт порядок сортировки и индекс.
- Сохраните изменения и обновите конфигурацию базы данных клавишей
F7.
После обновления перечисление сразу доступно во встроенном языке и в конструкторе запросов.
Имя объекта и имена значений нельзя задавать с пробелами и начинать с цифры — конфигуратор не даст сохранить. Используйте «ВерблюжийРегистр»: СпособыОплаты, БезналичныйРасчёт.
Какие свойства настраивают и как хранится перечисление
У самого перечисления настроек немного — это одно из его достоинств. На вкладке Основные доступны:
- Имя и Синоним — идентификатор для кода и подпись для пользователя.
- Комментарий — служебная пометка для разработчиков.
- Представление списка и Расширенное представление списка — как подписывается форма списка значений, если вы её откроете.
Отдельного «хранилища» у перечисления нет: его значения — это метаданные, а не записи таблицы базы данных. Поэтому перечисление почти ничего не весит и работает очень быстро — сравнение идёт по внутреннему идентификатору значения, без обращения к таблицам.
Для каждого значения на вкладке Данные настраиваются только Имя, Синоним и Комментарий. Никаких реквизитов, табличных частей и форм у отдельного значения быть не может — если вам нужны дополнительные поля у элементов списка, перечисление не подходит, берите справочник.
Две вкладки влияют на видимость перечисления в интерфейсе. На вкладке Подсистемы отметьте разделы, в которых объект должен появляться, — иначе его форма списка не попадёт в командный интерфейс. На вкладке Функциональные опции перечисление можно привязать к опции, чтобы скрывать его вместе с неиспользуемой функциональностью. Для чисто служебных перечислений, к которым обращается только код, подсистемы можно не заполнять.
Переименовывать значение правильнее не вручную, а через рефакторинг: конфигуратор умеет находить и обновлять ссылки на объект. Но на значения перечисления внутри строк запросов и текстов это не всегда распространяется, поэтому после переименования стоит выполнить глобальный поиск по конфигурации по старому имени.
Порядок значений влияет на их Индекс() и на сортировку в списках выбора. Если потом переставить значения местами, индексы сдвинутся. Не завязывайте бизнес-логику на числовой индекс — сравнивайте значения по имени.
Как обратиться к перечислению в коде и запросах
Во встроенном языке к значению обращаются через менеджер перечисления: Перечисления.ИмяПеречисления.ИмяЗначения.
Присвоить значение реквизиту:
Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен;
Сравнить:
Если Заказ.Статус = Перечисления.СтатусыЗаказов.Отменён Тогда
Сообщить("Заказ отменён, отгрузка невозможна");
КонецЕсли;
Перебрать все значения перечисления (менеджер перечисления — коллекция):
Для Каждого ТекущийСтатус Из Перечисления.СтатусыЗаказов Цикл
Сообщить(Строка(ТекущийСтатус));
КонецЦикла;
Функция Строка() для значения перечисления возвращает его синоним — то самое читаемое представление. Это удобно для вывода пользователю без ручных сопоставлений.
Проверить, что реквизит не заполнен, помогает пустая ссылка:
Если Заказ.Статус = Перечисления.СтатусыЗаказов.ПустаяСсылка() Тогда
Сообщить("Статус не задан");
КонецЕсли;
В запросах нельзя писать Перечисления.СтатусыЗаказов.Выполнен напрямую — для подстановки предопределённого значения есть функция ЗНАЧЕНИЕ():
ВЫБРАТЬ
Заказы.Номер,
Заказы.Статус
ИЗ
Документ.ЗаказПокупателя КАК Заказы
ГДЕ
Заказы.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Выполнен)
Обратите внимание на синтаксис: в коде — Перечисления (множественное число, через менеджер), в запросе внутри ЗНАЧЕНИЕ() — Перечисление (единственное число). Это частый источник ошибок у начинающих.
Если нужно получить список имён и синонимов всех значений (например, для настроек или отчёта), берите их из метаданных:
Для Каждого ЗначениеМД Из Метаданные.Перечисления.СтатусыЗаказов.ЗначенияПеречисления Цикл
Сообщить(ЗначениеМД.Имя + " — " + ЗначениеМД.Синоним);
КонецЦикла;
Часто значение перечисления удобнее передать в запрос параметром, а не прописывать ЗНАЧЕНИЕ() в тексте. Тогда один и тот же запрос работает с разными статусами:
Запрос.Текст =
"ВЫБРАТЬ Заказы.Номер ИЗ Документ.ЗаказПокупателя КАК Заказы
|ГДЕ Заказы.Статус = &Статус";
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаказов.Выполнен);
Результат = Запрос.Выполнить();
Порядковый номер значения в списке возвращает метод Индекс():
НомерСтатуса = Перечисления.СтатусыЗаказов.Выполнен.Индекс();
Отсчёт идёт с нуля, по порядку значений на вкладке Данные. Пользуйтесь индексом аккуратно — при перестановке значений он изменится.
Где использовать перечисление и как его типизировать
Перечисление — это полноценный тип данных. Его назначают там же, где любой ссылочный тип:
- 📄 реквизит документа — например,
Статусу заказа; - 📘 реквизит справочника —
ВидКонтрагента:Поставщик,Покупатель,Прочее; - 🧮 реквизит регистра —
ВидДвижения; - 🖥 реквизит формы или параметр процедуры — чтобы ограничить выбор.
Чтобы назначить тип, откройте нужный реквизит, в поле Тип раскройте дерево и выберите ПеречислениеСсылка → ваше перечисление. После этого на форме реквизит автоматически превращается в поле выбора
из значений.
Перечисление можно включать в составной тип. Например, реквизит Основание может принимать и ссылку на документ, и значение перечисления БезОснования. В поле Тип тогда отмечают несколько типов сразу.
На форме реквизит с типом перечисления становится полем со списком: пользователь выбирает один из синонимов, а в данные записывается ссылка на значение. Отдельную форму значениям рисовать не нужно — платформа строит выпадающий список сама. Если какое-то значение должно быть недоступно в конкретной ситуации, ограничивают не само перечисление, а список выбора на форме — через свойство реквизита формы или программным заполнением списка выбора.
Значения перечисления удобно использовать и в условном оформлении списков и отчётов: например, строки со статусом Отменён подсвечивать серым. В отборе условного оформления значение задаётся так же, как в запросе, — через выбор предопределённого значения перечисления.
Таблица поможет выбрать подходящий объект под задачу:
| Нужно хранить | Подходит | Почему |
|---|---|---|
| Фиксированный список статусов, видов, признаков | Перечисление | задаётся разработчиком, не меняется пользователем |
| Список, который ведут пользователи | Справочник | нужны добавление и редактирование элементов |
| Пару «ключ — настройка», которую нельзя менять | Перечисление | быстрое сравнение, нет лишних таблиц |
| Элементы с доп. полями (телефон, адрес) | Справочник | у значений перечисления нет реквизитов |
Перечисление или справочник: как не ошибиться с выбором
Это главная развилка. Ошибка здесь дорого обходится: если выбрать перечисление там, где нужен справочник, список придётся менять через обновление конфигурации у каждого клиента.
Компромиссный вариант — справочник с предопределёнными элементами. Он даёт и жёсткий «каркас» значений из конфигурации, и возможность добавлять новые записи, и реквизиты. Но обращение к нему медленнее, чем к перечислению, и в запросах оно нагружает таблицу. Для чистых статусов перечисление остаётся оптимальным.
Если сомневаетесь, задайте себе один вопрос: «Захочет ли пользователь когда-нибудь добавить сюда новый пункт сам?». Ответ «да» — справочник. Ответ «нет, это зашито в логику» — перечисление.
Частые ошибки при работе с перечислениями
Набор проблем, на которые регулярно натыкаются при разработке:
- ❌ Путают
ПеречисленияиПеречисление. В коде —Перечисления.Статусы.Новый, в запросе внутриЗНАЧЕНИЕ()—Перечисление.Статусы.Новый. Платформа выдаёт ошибку, если перепутать. - ❌ Завязывают логику на индекс значения. После перестановки значений стрелками индексы сдвигаются, и условия вида «если индекс = 2» начинают срабатывать не на то значение. Сравнивайте по имени.
- ❌ Хотят добавить реквизит к значению. У значения перечисления есть только имя, синоним и комментарий. Под доп. поля нужен справочник.
- ❌ Используют перечисление там, где список растёт. Каждый новый пункт — это изменение конфигурации и обновление базы у всех пользователей. Для живых списков берите справочник.
- ❌ Сравнивают синонимы вместо значений. Код
Если Строка(Заказ.Статус) = "Выполнен"сломается, как только кто-то поправит синоним. Сравнивайте сами значения:Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен. - ❌ Забывают обновить конфигурацию
базы данных. После добавления значений нажмите
F7, иначе новое значение не появится в режиме «Предприятие».
Переименование значения перечисления (поле Имя) ломает весь код и запросы, где оно использовалось по старому имени. Синоним менять безопасно, имя — только с полной правкой ссылок по конфигурации.
Частые вопросы
Можно ли добавить значение перечисления в режиме «1С:Предприятие»?
Как получить синоним (представление) значения перечисления в коде?
Строка(значение) — она вернёт синоним. Для полного списка имён и синонимов перебирайте Метаданные.Перечисления.ИмяПеречисления.ЗначенияПеречисления.Чем перечисление отличается от справочника с предопределёнными элементами?
Как проверить, что реквизит типа перечисления не заполнен?
Значение = Перечисления.ИмяПеречисления.ПустаяСсылка(). Истина означает, что значение не выбрано.Почему в запросе не работает `Перечисления.Статусы.Новый`?
ЗНАЧЕНИЕ() и в единственном числе: ЗНАЧЕНИЕ(Перечисление.Статусы.Новый). Прямое обращение как в коде там недопустимо.