Разработка и Конфигурация · 10 мин
Как сделать перечисление в 1С
Как создать перечисление в конфигураторе 1С, добавить значения, использовать в коде и реквизитах. Пошаговая инструкция, примеры и типичные ошибки.
Перечисление в 1С — это объект метаданных, который хранит фиксированный список значений, заданный разработчиком на этапе конфигурирования. Пользователь не может добавлять новые значения в перечисление самостоятельно: состав списка меняется только через конфигуратор. Это принципиальное отличие от справочника, где элементы создаются в режиме предприятия.
Типичные примеры перечислений — виды документов, статусы с фиксированным набором состояний, варианты расчёта, пол сотрудника, ставки НДС. Перечисление выбирают тогда, когда набор значений известен заранее, не должен меняться пользователем и участвует в логике программы: по значению перечисления удобно строить ветвления в коде.
Ниже разобрано, как создать перечисление в конфигураторе, заполнить значения, использовать его в реквизитах объектов и в программном коде, а также какие ошибки встречаются чаще всего и когда вместо перечисления лучше выбрать справочник.
Когда перечисление — правильный выбор
Перед созданием объекта важно убедиться, что задача действительно решается перечислением. Основной критерий — закрытость списка: если значения определяются логикой программы и их набор меняется только разработчиком, перечисление подходит. Если пользователю нужно добавлять, переименовывать или удалять элементы, требуется справочник.
Ещё один признак — участие значений в алгоритмах. Когда в коде нужно написать конструкцию вида «если вид операции равен такому-то, выполнить такой-то расчёт», перечисление даёт жёсткую, контролируемую платформой связь между значением и логикой. Значение перечисления нельзя случайно удалить из базы, оно гарантированно существует.
Обратная сторона — жёсткость. Добавление нового значения требует изменения конфигурации и обновления базы, что в работающей системе означает выпуск обновления. Если список потенциально расширяем бизнесом (например, виды номенклатуры или контрагентов), перечисление быстро станет узким местом.
Перечисление или справочник
Фиксированный набор значений, задаётся в конфигураторе, участвует в логике кода. Не подходит, если пользователь должен расширять список.
Гибкий список, который ведёт пользователь в режиме предприятия. Подходит для расширяемых списков, но значения можно удалить или переименовать, что ломает жёсткую логику.
Когда нужны и предопределённые элементы, и возможность пользователю добавлять свои. Используется для аналитик и дополнительных свойств.
Создание перечисления в конфигураторе
Откройте конфигурацию в конфигураторе (меню «Конфигурация — Открыть конфигурацию»). В дереве объектов найдите ветку «Перечисления», нажмите правой кнопкой мыши и выберите «Добавить». Платформа откроет палитру свойств нового объекта.
Задайте имя перечисления — оно будет использоваться в коде, поэтому выбирайте короткое осмысленное имя без пробелов, например «ВидыОпераций» или «СтатусыЗаказа». Синоним платформа подставит автоматически, его можно отредактировать: именно синоним увидит пользователь в интерфейсе.
Обратите внимание на свойство «Быстрый выбор»: если оно включено, значение в поле ввода выбирается из выпадающего списка без открытия отдельной формы. Для перечислений это обычно удобно и включено по умолчанию.
Добавление и настройка значений
Состав значений задаётся на закладке «Данные» в палитре свойств перечисления. Нажмите кнопку добавления и введите имя значения — оно, как и имя объекта, используется в программном коде. Например, для перечисления «СтатусыЗаказа» значения могут называться «Новый», «ВРаботе», «Выполнен», «Отменён».
Для каждого значения платформа формирует представление по имени, но его можно переопределить через синоним. Пользователь в выпадающем списке увидит именно синоним, поэтому имеет смысл привести его к читаемому виду с пробелами: «В работе» вместо «ВРаботе».
Порядок значений в списке имеет значение: именно в нём значения показываются пользователю при выборе и участвуют в операциях сравнения «больше/меньше» в запросах. Располагайте значения в логичной последовательности — например, статусы по ходу жизненного цикла документа.
Использование перечисления в реквизитах объектов
Чтобы документ или справочник мог хранить значение перечисления, добавьте в объект реквизит и укажите его тип — «ПеречислениеСсылка.ИмяПеречисления». Например, в документе «ЗаказКлиента» создайте реквизит «Статус» с типом «ПеречислениеСсылка.СтатусыЗаказа».
После добавления реквизита разместите его на форме объекта, чтобы пользователь мог выбирать значение. Если форма управляемая, перетащите реквизит из дерева реквизитов в дерево элементов формы. Платформа автоматически создаст поле ввода с выпадающим списком значений перечисления.
Перечисление можно использовать и в измерениях регистров сведений, ресурсах регистров накопления, критериях отбора и параметрах отчётов. Везде действует одно правило: тип указывается как ссылка на конкретное перечисление, и список допустимых значений платформа ограничит автоматически.
Работа с перечислением в коде
Обращение к значению перечисления в модуле выполняется через менеджер: Перечисления.СтатусыЗаказа.Выполнен. Такая конструкция возвращает ссылку на значение, которую можно присваивать реквизитам, сравнивать и передавать в запросы.
Типичная проверка в коде выглядит так: Если Объект.Статус = Перечисления.СтатусыЗаказа.Выполнен Тогда ... КонецЕсли;. Для перебора всех значений используется коллекция менеджера: Для Каждого Значение Из Перечисления.СтатусыЗаказа Цикл ... КонецЦикла;.
У перечисления есть служебное значение «ПустаяСсылка» — оно возвращается, если реквизит не заполнен. Проверка на незаполненность: Если Объект.Статус = Перечисления.СтатусыЗаказа.ПустаяСсылка() Тогда ... или функция ЗначениеЗаполнено(Объект.Статус).
Если Документ.Статус = Перечисления.СтатусыЗаказа.Отменён Тогда
Сообщить("Заказ отменён, проведение запрещено");
Отказ = Истина;
КонецЕсли;В запросах значение перечисления передаётся через параметр: Запрос.УстановитьПараметр(\"Статус\", Перечисления.СтатусыЗаказа.Выполнен);. Также в тексте запроса доступна конструкция ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказа.Выполнен), позволяющая указать значение без параметра.
Проверка результата и типичные ошибки
После создания перечисления обновите конфигурацию базы данных клавишей F7 и запустите режим предприятия. Откройте объект, где используется реквизит с типом перечисления, и убедитесь, что выпадающий список показывает все значения с правильными представлениями и в нужном порядке.
Проверьте программную часть: код, обращающийся к значениям перечисления, должен компилироваться без ошибок. Если при обновлении или запуске появляется сообщение о ненайденном значении, чаще всего причина в опечатке имени или в том, что значение добавлено после написания кода, а модуль не был перекомпилирован.
Как проверить результат
Показывает все значения с читаемыми синонимами
Список пуст или показывает технические имена без пробелов
Модули проверяются без ошибок при обновлении
Ошибка «Значение не найдено» — опечатка в имени значения
Новые документы сохраняют выбранный статус
Статус не сохраняется — реквизит не добавлен в объект или не размещён на форме
Ограничения и безопасные изменения
Главное ограничение — нельзя безопасно удалить значение перечисления, если оно уже записано в данных. В документах и регистрах останутся ссылки на удалённое значение, и при обращении к ним возникнут ошибки. Перед удалением выполните поиск ссылок на объект через сервис «Поиск ссылок на объекты» и замените значения в данных.
Добавление новых значений и изменение синонимов — безопасные операции, не затрагивающие существующие данные. Изменение порядка значений тоже безопасно для данных, но может повлиять на логику, если где-то в запросах используется сравнение значений на «больше/меньше».
Любое изменение перечисления требует обновления конфигурации базы данных. В файловой базе это делается при монопольном доступе, в клиент-серверной — с выгоном пользователей или через механизм отложенного обновления. Планируйте изменения на нерабочее время и делайте резервную копию перед обновлением рабочей базы.
Как выбрать действие
Часто задаваемые вопросы
Можно ли пользователю добавить значение в перечисление?
Нет. Состав значений перечисления определяется только в конфигураторе. Если пользователям нужно расширять список, используйте справочник или план видов характеристик — эти объекты редактируются в режиме предприятия.
Чем перечисление отличается от списка выбора в поле ввода?
Список выбора задаётся для конкретного элемента формы и влияет только на интерфейс: в реквизит можно записать и другое значение программно. Перечисление ограничивает допустимые значения на уровне типа данных, поэтому контроль работает и в формах, и в коде, и при обмене данными.
Как перебрать все значения перечисления в коде?
Через коллекцию менеджера: Для Каждого Значение Из Перечисления.ИмяПеречисления Цикл. Внутри цикла доступна ссылка на каждое значение, её можно сравнивать, выводить пользователю или добавлять в список значений.
Что произойдёт с данными при переименовании значения?
Данные сохранятся: платформа хранит внутреннюю ссылку на значение, а не его имя. Но весь код, обработки и расширения, где значение указано по старому имени, перестанут компилироваться — перед переименованием выполните глобальный поиск по конфигурации.
Можно ли использовать перечисление в отчётах на СКД?
Да. Реквизит с типом перечисления доступен в наборе данных схемы компоновки, его можно выводить в поля отчёта, использовать в отборах и группировках. В параметрах отбора пользователь выберет значение из привычного выпадающего списка.
Что важно запомнить
Перечисление создаётся в конфигураторе через ветку «Перечисления», значения задаются на закладке «Данные», а в коде доступны через Перечисления.Имя.Значение. Используйте перечисление только для закрытых списков, не удаляйте значения, уже записанные в данных, и обновляйте конфигурацию базы после любых изменений.