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

· 9 мин

Содержание

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

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

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

Перечисление — это фиксированный список значений, который задаёт разработчик. В базе хранятся только ссылки на эти значения, без реквизитов и без иерархии.

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

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

Берите перечисление, когда:

  • ✅ от значения зависит логика программы — проведение, расчёт, видимость полей;
  • ✅ список стабилен годами: «Наличные / Безналичные», «Мужской / Женский», «Приход / Расход»;
  • ✅ значению не нужны свои свойства — ставка, счёт, срок.

Берите справочник, когда:

  • ❌ пользователи захотят дополнять список сами;
  • ❌ каждому значению нужен реквизит (например, у вида оплаты — счёт учёта);
  • ❌ список различается от базы к базе.

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

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

Шаг 1. Откройте конфигурацию

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

Перед изменением рабочей базы сделайте выгрузку .dt или проверьте, что есть свежая резервная копия.

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

  1. Найдите в дереве ветку Перечисления — она на верхнем уровне, рядом со справочниками и документами.
  2. Выделите её и нажмите «Добавить» на панели дерева или клавишу Insert. Можно через контекстное меню.
  3. Откроется окно редактирования нового объекта.

Шаг 3. Заполните имя и синоним

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

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

Шаг 4. Внесите значения

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

Шаг 5. Привяжите к подсистеме и сохраните

  1. На вкладке «Подсистемы» отметьте раздел, в котором перечисление должно быть видно. Отдельная команда для перечисления в интерфейсе обычно не нужна — оно появляется в полях документов и справочников.
  2. Закройте окно и выполните Конфигурация → Обновить конфигурацию базы данных (F7).
  3. Платформа покажет список изменений. Подтвердите — новое перечисление появится в базе.

Шаг 6. Используйте перечисление как тип реквизита

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

Значения перечисления: имя, синоним, порядок

У каждого значения три свойства:

СвойствоДля чегоПример
ИмяОбращение из кода и запросовБанковскаяКарта
СинонимОтображение пользователю«Банковская карта»
КомментарийПояснение для разработчиков«Эквайринг, терминал в зале»

Порядок значений

Порядок в списке на вкладке «Данные» — это порядок, в котором пользователь видит значения в выпадающем списке. По нему же сортирует запрос с УПОРЯДОЧИТЬ ПО по полю-перечислению. Меняйте его кнопками перемещения вверх и вниз над списком.

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

Переименование и удаление

  • Переименовать имя значения можно: ссылки в данных сохранятся, потому что база хранит внутренний идентификатор, а не имя. Но весь код и запросы со старым именем перестанут работать. Перед переименованием найдите все вхождения глобальным поиском (Ctrl+Shift+F) и исправьте их вместе.
  • Изменить синоним безопасно: меняется только отображение.
  • Удалить значение опасно. Если оно уже записано в документах, эти реквизиты превратятся в битые ссылки и покажут <Объект не найден>.

Прежде чем удалить значение, найдите, где оно используется: глобальный поиск по имени в модулях (Ctrl+Shift+F) и запрос к таблицам, где реквизит имеет этот тип. Значения, которые уже в данных, лучше перевести в «устаревшие» синонимом («(не использовать) Чек») и скрыть из выбора на формах.

Свойства перечисления, которые стоит настроить

Большинство свойств можно оставить по умолчанию. Обратите внимание на эти:

  • 🔹 Быстрый выбор — по умолчанию включён. Значения показываются выпадающим списком прямо в поле, без открытия формы выбора. Для списка из 3–15 значений это то, что нужно.
  • 🔹 Формы — у перечисления есть стандартные формы списка и выбора, создавать свои почти никогда не требуется. Своя форма выбора нужна, если значений много и пользователю нужна подсказка или фильтр.
  • 🔹 Функциональные опции — позволяют скрывать перечисление вместе с выключенной функциональностью.

Как обращаться к перечислению в коде 1С

Получить значение

На сервере значение берут через менеджер перечисления:

ВидОплаты = Перечисления.ВидыОплаты.Наличные;

Если Объект.ВидОплаты = Перечисления.ВидыОплаты.БанковскаяКарта Тогда
    Объект.ПроцентЭквайринга = 1.8;
КонецЕсли;

В клиентском коде формы надёжнее функция ПредопределенноеЗначение — она работает в любом контексте:

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

Проверить, что поле заполнено

Пустое значение — это Перечисления.ВидыОплаты.ПустаяСсылка(). Короче и понятнее проверять так:

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

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

Получить имя значения

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

// 1. Через XML-представление: вернёт имя значения или пустую строку для пустой ссылки
ИмяЗначения = XMLСтрока(Объект.ВидОплаты);

// 2. Через метаданные и индекс
Индекс = Перечисления.ВидыОплаты.Индекс(Объект.ВидОплаты);
ИмяЗначения = Метаданные.Перечисления.ВидыОплаты.ЗначенияПеречисления[Индекс].Имя;

Обратная задача — значение по имени, пришедшему из файла: Перечисления.ВидыОплаты[ИмяЗначения]. Если имени нет, будет ошибка, поэтому сначала проверьте его по метаданным.

Перебрать все значения

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

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

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

В тексте запроса конкретное значение задают функцией ЗНАЧЕНИЕ:

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

Пустое значение в запросе — ЗНАЧЕНИЕ(Перечисление.СтатусыЗаявок.ПустаяСсылка).

Если значение выбирает пользователь, передавайте его параметром:

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

Три приёма, которые пригодятся:

  1. Таблица самого перечисления. К перечислению можно обратиться как к таблице Перечисление.СтатусыЗаявок с полями Ссылка и Порядок. Это нужно, когда в отчёте должны быть все статусы, даже без документов: соедините таблицу перечисления с данными левым соединением.
  2. Сортировка. УПОРЯДОЧИТЬ ПО по полю-перечислению идёт в порядке значений из конфигуратора, а не по алфавиту синонимов.
  3. Опечатка ловится сразу. Если имя в ЗНАЧЕНИЕ() написано с ошибкой, запрос не выполнится при первом же вызове. В отличие от строки-параметра, такая ошибка не останется незамеченной.

Не сравнивайте перечисление со строкой вида Заявка.Статус = "В работе". Это синоним, его могут поправить, а запрос молча перестанет находить записи.

Перечисление на форме: выпадающий список и переключатель

Когда вы перетаскиваете реквизит с типом перечисления на управляемую форму, платформа создаёт поле ввода с выпадающим списком. Его можно переделать под задачу.

Варианты отображения

Вид поляКогда подходитКак настроить
Поле ввода с выпадающим спискомЗначений больше 4, поле не главноеПо умолчанию, ничего делать не нужно
Поле переключателя (радиокнопки)2–4 значения, выбор важен и должен быть виденВ свойствах элемента формы «Вид» → поле переключателя
Переключатель в виде тумблера2–3 значения, компактная панельУ поля переключателя вид «Тумблер»

Ограничить список значений

Бывает, что в конкретном документе часть значений недопустима. Ограничьте список выбора в обработчике ПриСозданииНаСервере:

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

Так же скрывают «устаревшие» значения, которые удалять нельзя из-за старых документов.

Обязательность заполнения

Чтобы документ не записывался с пустым видом оплаты, у реквизита в конфигураторе установите «Проверка заполнения» → «Выдавать ошибку». Поле на форме подсветится, а при записи платформа сама выдаст сообщение. Писать проверку кодом не нужно.

Перечисление готово к работе
Выполнено: 0 / 7

Ошибки при работе с перечислениями и как их исправить

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

Ещё одна ловушка — значение, которое «в коде есть, а на клиенте не работает». Обычно в клиентской процедуре обратились к серверным данным. Используйте ПредопределенноеЗначение, как в примере выше, или перенесите проверку на сервер.

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

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