Перечисления 1С 8.3 для разработчика: от конфигуратора до запросов и обновления данных
Содержание
Перечисление в 1С создают в конфигураторе: ветка Перечисления дерева конфигурации → Добавить, затем на вкладке «Данные» вносят значения. В коде к значению обращаются как Перечисления.ВидыОплат.Наличные, в запросе — ЗНАЧЕНИЕ(Перечисление.ВидыОплат.Наличные), на клиенте — через ПредопределенноеЗначение("Перечисление.ВидыОплат.Наличные").
Частое заблуждение: «перечисление — это маленький справочник». Нет. Состав значений задаёт разработчик в конфигурации, пользователь ничего добавить или удалить не может, а программно создать новое значение нельзя. Поэтому работать с перечислениями в 1С нужно по своим правилам — от создания объекта до миграции данных при его изменении. Всё ниже относится к платформе 8.3 в целом и не зависит от конкретной типовой конфигурации.
Когда нужно перечисление, а когда справочник
Перечисление подходит для списка, от которого зависит логика программы. Если в коде есть ветка «если вид операции — возврат, то…», значит, набор значений фиксирован и меняется только вместе с кодом.
| Признак | Перечисление | Справочник |
|---|---|---|
| Кто меняет состав | Только разработчик | Пользователь |
| Дополнительные поля у значения | Нет, только имя, синоним, комментарий | Любые реквизиты и табличные части |
| Зависит ли от значения код | Да, это основное назначение | Обычно нет |
| Пример | Статусы заказа, виды оплаты, ставки НДС в типовых | Номенклатура, контрагенты, склады |
Если сомневаетесь, задайте вопрос: «Появится ли новое значение без изменения кода?» Если да — это справочник.
Создание перечисления и настройка его свойств
Порядок в конфигураторе:
- Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - В дереве найдите ветку
Перечисления, щёлкните правой кнопкой →Добавить. - Откроется окно редактирования объекта. На вкладке «Основные» задайте имя, синоним и комментарий.
- Перейдите на вкладку «Данные» и добавьте значения.
- При необходимости включите перечисление в подсистемы, чтобы его форма списка была видна в интерфейсе.
- Сохраните изменения и обновите конфигурацию базы данных (
F7).
Имя, синоним, комментарий
- 🏷️ Имя — идентификатор для кода. По сложившимся правилам имена перечислений пишут во множественном числе:
СтатусыЗаказов,ВидыОплат,СпособыДоставки. - 👁️ Синоним — то, что видит пользователь. Например, «Статусы заказов».
- 📝 Комментарий — для коллег-разработчиков, в интерфейсе не показывается.
Свойства, которые влияют на поведение
- ⚡ Быстрый выбор — значения предлагаются выпадающим списком прямо в поле ввода, без открытия формы выбора. Для коротких перечислений это удобнее.
- 📋 Формы — у перечисления могут быть свои формы списка и выбора. Обычно хватает автоматически сформированных, свою форму делают, когда нужно показать подсказку к каждому значению.
- 🧩 Подсистемы и функциональные опции — определяют, где перечисление видно в командном интерфейсе.
Значения перечисления и их порядок
Каждое значение имеет те же три атрибута: имя, синоним, комментарий. Имя значения — в единственном числе и без пробелов: Новый, ВРаботе, Выполнен, Отменен.
Порядок значений в списке на вкладке «Данные» — не косметика. Платформа хранит у каждого значения его порядковый номер, и на нём держатся:
- 🔢 сортировка в запросах при
УПОРЯДОЧИТЬ ПОпо полю этого типа; - 📑 порядок в выпадающем списке и в форме выбора;
- 📊 порядок группировок в отчётах на СКД.
Значения переставляют кнопками перемещения вверх и вниз на панели списка. Ставьте их в логическом порядке процесса, а не по алфавиту: статусы заказа идут так, как заказ проходит по этапам.
Если нужно сравнение «статус дальше, чем “В работе”», порядок значений позволяет это сделать. Но надёжнее явно перечислить нужные значения в условии: логика не сломается, когда кто-то вставит новый статус в середину.
Пустое значение
У каждого перечисления есть пустая ссылка. Она не входит в список значений, но реквизит такого типа по умолчанию пустой. Получить её можно так: Перечисления.СтатусыЗаказов.ПустаяСсылка(), в запросе — ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.ПустаяСсылка). Проверка в коде — метод Пустая().
Перечисления в реквизитах, регистрах и формах
Значение перечисления используют как тип данных. Тип ПеречислениеСсылка.СтатусыЗаказов можно задать:
- реквизиту справочника или документа;
- реквизиту табличной части;
- измерению, ресурсу или реквизиту регистра;
- параметру сеанса, реквизиту формы, параметру команды.
Значение по умолчанию
У реквизита есть свойство «Значение заполнения». Укажите там, например, Новый — и при создании документа поле заполнится само. Это проще и прозрачнее, чем писать то же самое в обработчике ОбработкаЗаполнения.
Ограничение выбора на форме
Иногда в конкретном поле допустимы не все значения. Например, в документе возврата нельзя выбрать вид операции «Продажа». Варианты:
- Заполнить у элемента формы список выбора нужными значениями и включить режим выбора только из списка.
- Проверять значение в
ОбработкеПроверкиЗаполненияобъекта и не давать записать документ.
Первый вариант удобен пользователю, второй защищает данные при записи из кода и обменов. Хорошо делать оба.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ВидОперации.СписокВыбора.Очистить();
Элементы.ВидОперации.СписокВыбора.Добавить(Перечисления.ВидыОперацийВозврата.ВозвратОтПокупателя);
Элементы.ВидОперации.СписокВыбора.Добавить(Перечисления.ВидыОперацийВозврата.ВозвратПоставщику);
Элементы.ВидОперации.РежимВыбораИзСписка = Истина;
КонецПроцедуры
Управление видимостью по значению
Типичный сценарий: при способе доставки «Самовывоз» прячем поле адреса. На клиенте модуль менеджера перечисления недоступен, поэтому сравниваем через ПредопределенноеЗначение:
&НаКлиенте
Процедура СпособДоставкиПриИзменении(Элемент)
УстановитьВидимостьАдреса();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВидимостьАдреса()
Элементы.АдресДоставки.Видимость =
Объект.СпособДоставки <> ПредопределенноеЗначение("Перечисление.СпособыДоставки.Самовывоз");
КонецПроцедуры
Ту же процедуру вызовите из ПриОткрытии, иначе при открытии сохранённого документа видимость будет неверной.
Программная работа с перечислениями в коде и запросах
Обращение к значению
На сервере — через менеджер: Перечисления.ВидыОплат.Наличные. Если имя значения приходит строкой, используйте квадратные скобки:
ИмяЗначения = "Безналичные";
Значение = Перечисления.ВидыОплат[ИмяЗначения];
Строка с несуществующим именем вызовет ошибку, поэтому данные из внешних источников проверяйте заранее.
Обход всех значений
Менеджер перечисления можно перебрать циклом:
Для Каждого Значение Из Перечисления.СтатусыЗаказов Цикл
Сообщить(Строка(Значение));
КонецЦикла;
Строка(Значение) вернёт синоним — то, что видит пользователь.
Имя значения по ссылке
Синоним годится для показа, но не для логики: его переводят и переименовывают. Если нужно программное имя (для выгрузки, логов, сопоставления с внешней системой), берите его из метаданных по индексу:
Функция ИмяЗначенияПеречисления(Значение) Экспорт
Если Значение.Пустая() Тогда
Возврат "";
КонецЕсли;
МетаПеречисление = Значение.Метаданные();
Индекс = Перечисления[МетаПеречисление.Имя].Индекс(Значение);
Возврат МетаПеречисление.ЗначенияПеречисления[Индекс].Имя;
КонецФункции
Функция работает для любого перечисления, поэтому её место — в общем серверном модуле.
Перечисления в запросах
Значение в тексте запроса пишется через ЗНАЧЕНИЕ():
ВЫБРАТЬ
Заказ.Ссылка,
Заказ.Статус,
ПРЕДСТАВЛЕНИЕ(Заказ.Статус) КАК СтатусТекстом
ИЗ
Документ.ЗаказПокупателя КАК Заказ
ГДЕ
Заказ.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Новый),
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.ВРаботе))
УПОРЯДОЧИТЬ ПО
Заказ.Статус
Если список значений меняется от вызова к вызову, передайте его параметром: Запрос.УстановитьПараметр("Статусы", МассивСтатусов) и в тексте Заказ.Статус В (&Статусы).
Не сравнивайте значения перечислений со строками: условие Строка(Статус) = "Новый" сломается после правки синонима или перевода интерфейса.
Перечисления в расширениях
Перечисление типовой конфигурации можно заимствовать в расширение и добавить в него свои значения. Это удобный способ доработать список статусов без снятия типовой с поддержки. Типовой код о новых значениях ничего не знает, поэтому обработку для них пишите в том же расширении.
Изменение перечисления и миграция данных
Перечисление живёт в базе так же, как другие ссылочные объекты: каждое значение имеет внутренний идентификатор, а реквизиты документов хранят ссылку на него. Отсюда последствия любых правок.
| Изменение | Что будет с данными | Что сломается |
|---|---|---|
| Добавить значение | Ничего | Ветки Если … ИначеЕсли без ветки «иначе» пропустят новое значение |
| Переименовать значение (имя) | Ссылки сохранятся | Код, запросы и расширения со старым именем |
| Изменить синоним | Ничего | Только логика, завязанная на строки (её быть не должно) |
| Переставить значения | Ссылки сохранятся | Сортировка в запросах, отчётах и списках |
| Удалить значение | В документах останутся «битые» ссылки | Формы покажут <Объект не найден> |
Как безопасно убрать значение
- Найдите все места в коде: глобальный поиск по имени значения (
Ctrl+Shift+F). - Переименуйте значение, добавив префикс
Удалить— так поступают в типовых конфигурациях с устаревшими объектами. Код со старым именем сразу проявит себя при синтаксической проверке. - Напишите обработчик обновления, который заменит устаревшее значение на актуальное во всех документах, справочниках и регистрах.
- Выпустите релиз и дайте обработчику отработать во всех базах.
- Только в следующем релизе удалите значение из конфигурации.
Удаление значения и обновление конфигурации базы данных в один шаг оставляет в данных ссылки на несуществующий объект. Восстановить, какое значение там было, потом сложно. Перед реструктуризацией рабочей базы сделайте выгрузку .dt или резервную копию СУБД.
Замена перечисления на справочник
Бывает, что список, задуманный фиксированным, пользователи хотят пополнять сами. Порядок перехода:
- создайте справочник с предопределёнными элементами — по одному на каждое значение старого перечисления;
- добавьте новые реквизиты нужного типа рядом со старыми;
- обработчиком обновления заполните новые реквизиты по соответствию «значение → предопределённый элемент»;
- переведите код и запросы на новые реквизиты;
- старые реквизиты и перечисление пометьте префиксом
Удалитьи уберите в следующем релизе.
Менять тип существующего реквизита «на месте» с перечисления на справочник не стоит: при реструктуризации платформа не знает, как сопоставить значения, и данные в поле будут потеряны.
Типичные ошибки и практические советы
- ❌ Ветвление без ветки «иначе». Добавили статус «Частично отгружен» — и половина алгоритмов молча его пропускает. В конструкциях
Если … ИначеЕслипо значениям перечисления последней ставьте веткуИначес вызовом исключения или записью в журнал регистрации. - ❌ Обращение к
Перечисленияв клиентском коде. На тонком клиенте и в веб-клиенте модуль менеджера недоступен. ИспользуйтеПредопределенноеЗначениеили получите значение с сервера. - ❌ Хранение синонима вместо ссылки. Строковый реквизит «Статус» с текстом «Новый» не связан с перечислением, отбор по нему ненадёжен.
- ❌ Перечисление из 50 значений. Признак того, что это справочник. Пользователю неудобно выбирать, а разработчику — поддерживать.
- ✅ Настройки к значениям — в регистре сведений. Измерение — значение перечисления, ресурсы — нужные параметры. Так данные остаются редактируемыми, а код — стабильным.
- ✅ Повторяющиеся проверки — в общий модуль. Функция вида
ЭтоФинальныйСтатус(Статус)убирает дублирование условий по всей конфигурации.
Частые вопросы
Можно ли добавить значение перечисления программно, из кода?
Можно ли у значения перечисления хранить дополнительный реквизит, например код или цвет?
Как вывести перечисление в отчёте в нужном порядке, а не по алфавиту?
Сохранятся ли данные, если переименовать значение перечисления?
Чем системное перечисление отличается от перечисления конфигурации?
ВидДвиженияНакопления, РежимЗаписиДокумента) и в дереве конфигурации не видны. Перечисления конфигурации создаёт разработчик, и только они хранятся в базе данных.