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

· 9 мин

Содержание

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

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

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

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

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

  • ✅ Перечисление — вариантов мало, они стабильны, и на них завязана логика кода: статус, признак, тип. К каждому значению можно обратиться по имени прямо в модуле.
  • ✅ Справочник — список растёт и редактируется пользователем: контрагенты, номенклатура, склады, сотрудники.
  • ⚠️ Промежуточный случай — список меняется редко и его правит администратор. Тогда чаще берут справочник с предопределёнными элементами: его проще расширить без снятия конфигурации с поддержки.
Перечисление или справочник под ваш список?

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

Что такое перечисление и из чего оно состоит

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

У самого перечисления есть имя (идентификатор на латинице, по нему обращаются из кода) и синоним (русское название для интерфейса). У каждого значения внутри — тоже пара «имя + синоним».

УровеньИмя (латиница)Синоним (для пользователя)
ОбъектСтатусыЗаказовСтатусы заказов
ЗначениеНовыйНовый
ЗначениеВРаботеВ работе
ЗначениеВыполненВыполнен

💡 Имя значения — это то, что вы пишете в коде (Перечисления.СтатусыЗаказов.ВРаботе). Синоним — то, что видит пользователь в списке выбора. Их можно и нужно формулировать по-разному: имя короткое и без пробелов, синоним — человеческий.

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

Работаем в режиме Конфигуратора, предварительно сняв конфигурацию с замка (Конфигурация → Поддержка → Настройка поддержки, если она на поддержке поставщика).

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

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

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

Как задать нужный порядок значений

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

Синонимы, представления и многоязычность

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

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

💡 Если синоним значения оставить пустым, в интерфейсе покажется его имя как есть (ВРаботе — слитно). Поэтому синонимы лучше заполнять всегда, даже для одного языка.

Получить текстовое представление значения в коде можно функцией:

ТекстСтатуса = Строка(Заказ.Статус); // вернёт синоним: "В работе"

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

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

Само по себе перечисление ничего не хранит — оно задаёт тип для других объектов. Чтобы документ «Заказ» имел статус, нужно добавить ему реквизит такого типа.

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

Теперь на форме документа это поле по умолчанию выглядит как поле ввода с выпадающим списком значений. Их представление — синонимы из перечисления.

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

  • откройте форму документа в редакторе форм;
  • встаньте на поле реквизита Статус;
  • в палитре свойств поля смените Вид с поля ввода на Поле переключателя.

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

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

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

В языке запросов к значению перечисления обращаются через функцию ЗНАЧЕНИЕ. Это позволяет отобрать документы по конкретному статусу:

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

Обратите внимание на синтаксис: в запросе перечисление пишется в единственном числе — Перечисление.СтатусыЗаказов, а не Перечисления. Это частый источник ошибки «Поле не обнаружено».

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

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

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

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

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

Сравнить:

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

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

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

Пустую ссылку конкретного перечисления возвращает метод ПустаяСсылка() его менеджера:

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

Разветвить логику по значению. Для перечисления хорошо ложится конструкция множественного выбора:

Если Заказ.Статус = Перечисления.СтатусыЗаказов.Новый Тогда
    ТекстДляПользователя = "Заказ принят, ожидает обработки";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе Тогда
    ТекстДляПользователя = "Заказ в работе";
ИначеЕсли Заказ.Статус = Перечисления.СтатусыЗаказов.Выполнен Тогда
    ТекстДляПользователя = "Заказ выполнен";
Иначе
    ТекстДляПользователя = "Статус не задан";
КонецЕсли;

💡 Сравнивайте статусы по значению (Перечисления.СтатусыЗаказов.Выполнен), а не по тексту синонима. Синоним можно переименовать или перевести на другой язык — код, завязанный на Строка(Статус) = "Выполнен", после этого молча перестанет работать.

Пример: статус по умолчанию при создании документа

Чтобы новый заказ сразу получал статус «Новый», обработку удобно повесить на создание объекта. В модуле документа есть событие ОбработкаЗаполнения — оно срабатывает при вводе нового документа:

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

Дальше статус меняется по ходу работы — руками через поле на форме или кодом в обработчике нужной команды. А в модуле проведения значение статуса можно использовать как условие: формировать движения по регистрам только для заказов в статусе «Выполнен», оставляя новые и отменённые без проводок. Логика получается читаемой именно потому, что варианты закрыты и проверяются по имени, а не по строке.

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

Эти промахи встречаются у тех, кто переносит на перечисление привычки работы со справочником.

  • ❌ Пытаются добавить значение в режиме 1С:Предприятие. Нельзя. Значения перечисления — часть конфигурации. Чтобы добавить вариант, нужен Конфигуратор и обновление структуры базы. Если список должен пополняться в работе — изначально берите справочник.
  • ❌ Пишут Перечисления в запросе и Перечисление в коде, перепутав число. В языке запросов — Перечисление.Имя (единственное), во встроенном языке — Перечисления.Имя (множественное). Платформа на этом спотыкается с ошибкой разбора.
  • ❌ Сравнивают значение со строкой. Если Строка(Статус) = "Выполнен" зависит от синонима и языка сеанса. Правильно — сравнивать ссылку со ссылкой.
  • ❌ Забывают про пустое значение. Реквизит с типом перечисления по умолчанию пуст. Если логика кода не обрабатывает пустую ссылку, появляются неожиданные ветки. Проверяйте через ЗначениеЗаполнено().
  • ❌ Сортируют список значений по алфавиту синонимов. Порядок задаётся на вкладке Данные Конфигуратора и должен отражать бизнес-логику (новый → в работе → выполнен), а не алфавит.
Перед тем как создать новое перечисление
Выполнено: 0 / 6

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

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