Перечисления в 1С:Предприятие 8.3 — это один из ключевых инструментов для работы с фиксированными наборами значений, которые не меняются со временем. Они позволяют стандартизировать данные, избегать ошибок при вводе и упрощают логику программирования. Например, с помощью перечислений удобно хранить статусы документов (Новый, Подтвержден, Отменен), типы операций или категории товаров.
В отличие от справочников, где значения могут динамически добавляться пользователями, перечисления создаются на этапе конфигурирования и изменяются только разработчиком. Это делает их идеальным решением для статичных классификаторов. Однако многие начинающие программисты 1С сталкиваются с трудностями при создании и использовании перечислений — особенно когда речь идет о связывании их с другими объектами конфигурации или написании кода для работы с их значениями.
В этой статье мы разберем все этапы: от создания простого перечисления в конфигураторе до написания кода для работы с ним в модулях. Вы узнаете, как добавлять значения, настраивать синонимы, использовать перечисления в формах и отчетах, а также избегать типичных ошибок. Материал будет полезен как разработчикам, так и опытным пользователям, которые хотят глубже понять механизмы платформы 1С:Предприятие.
Что такое перечисление в 1С и зачем оно нужно
Перечисление — это примитивный тип данных в 1С, который представляет собой фиксированный список именованных значений. Каждое значение имеет уникальный идентификатор и может иметь синоним (отображаемое имя на разных языках). Основные преимущества использования перечислений:
- 🔹 Контроль целостности данных: невозможно ввести значение, отсутствующее в списке, что исключает опечатки.
- 🔹 Упрощение кода: вместо магических чисел или строк используются понятные идентификаторы (например,
ВидыОплаты.Наличные). - 🔹 Многоязычность: синонимы позволяют отображать значения на разных языках без изменения логики.
- 🔹 Производительность: работа с перечислениями быстрее, чем со справочниками, так как значения хранятся в памяти.
Перечисления часто путают со справочниками, но у них принципиальные различия:
| Характеристика | Перечисление | Справочник |
|---|---|---|
| Изменяемость значений | Только в конфигураторе | Можно добавлять/удалять в пользовательском режиме |
| Хранение данных | В метаданных конфигурации | В базе данных (таблицы) |
| Использование в коде | Доступ по идентификатору (Перечисление.Значение) |
Требует выборку из базы |
| Пример применения | Статусы документов, виды операций | Контрагенты, номенклатура, сотрудники |
Важно понимать, что перечисления не предназначены для хранения больших объемов данных или значений, которые часто меняются. Например, если у вас список городов, который регулярно пополняется, лучше использовать справочник. А вот для хранения типов документов (например, ПриходнаяНакладная, РасходнаяНакладная) перечисление подойдет идеально.
Как создать перечисление в конфигураторе 1С 8.3
Процесс создания перечисления состоит из нескольких шагов. Рассмотрим его на примере создания перечисления ВидыДокументов с значениями Приходный, Расходный и Внутренний.
-
Откройте конфигуратор 1С:Предприятие в режиме редактирования. Для этого запустите файл
1CV8.1CD(или1CV8.exeдля файловой версии) с ключом/Config. -
В дереве метаданных найдите ветку
Общие → Перечисления. Кликните правой кнопкой мыши и выберитеДобавить. -
В открывшемся окне введите имя перечисления —
ВидыДокументов. Имя должно быть уникальным в пределах конфигурации и соответствовать правилам именования 1С (латиница, без пробелов, начинаться с буквы). -
Перейдите на закладку
Значенияи добавьте три значения:Приходный,РасходныйиВнутренний. Для каждого значения можно указать синоним (отображаемое имя) и комментарий. -
Сохраните конфигурацию (
Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).
После создания перечисление станет доступно в глобальном контексте. Например, в коде можно будет использовать конструкции вида:
Если ВидДокумента = Перечисления.ВидыДокументов.Приходный Тогда
// Логика для приходных документов
КонецЕсли;
☑️ Проверка перед сохранением перечисления
Работа с синонимами и многоязычностью
Одной из ключевых особенностей перечислений в 1С является поддержка синонимов — альтернативных имен для значений. Синонимы позволяют:
- 🌍 Отображать значения на разных языках (например,
Приходный→Incomeдля английской версии). - 📝 Использовать более понятные пользователю названия (например,
СтатусОплаты.Оплаченоможет отображаться какОплачен). - 🔄 Менять отображаемые имена без изменения кода (если логика привязана к идентификатору, а не к синониму).
Чтобы настроить синонимы:
-
Откройте перечисление в конфигураторе и перейдите на закладку
Значения. -
Выделите нужное значение (например,
Приходный) и в полеСинонимвведите альтернативное имя. -
Для многоязычности нажмите кнопку
Добавить языки выберите нужную локаль (например,Английский (США)). Введите перевод для каждого значения.
Пример кода, где используется синоним вместо идентификатора:
Сообщить(Перечисления.ВидыДокументов.Приходный.Представление()); // Выведет синоним, например "Приходная накладная"
⚠️ Внимание: Если вы изменяете синонимы в уже используемом перечислении, обновите все формы и отчеты, где эти синонимы отображаются. В некоторых случаях может потребоваться перезапуск клиентского приложения 1С, чтобы изменения вступили в силу.
Как проверить, что синоним отображается корректно?
Чтобы убедиться, что синоним подхватился системой, выполните следующий код в отладчике:
Для Каждого Значение Из Перечисления.ВидыДокументов Цикл
Сообщить(Значение.Представление()); // Должно вывести синоним, а не идентификатор
КонецЦикла;
Если выводятся идентификаторы (например, "Приходный" вместо "Приходная накладная"), проверьте, сохранены ли синонимы в конфигураторе и обновлена ли база данных.
Использование перечислений в формах и отчетах
Перечисления часто применяются в формах документов и отчетах для создания выпадающих списков. Рассмотрим, как добавить перечисление в форму документа на примере поля ВидДокумента:
-
Откройте форму документа в конфигураторе (например, форму документа
ПриходнаяНакладная). -
Добавьте на форму элемент управления
Поле ввода(илиПоле выборадля выпадающего списка). -
В свойствах элемента установите:
Тип значения→ПеречислениеСсылка.ВидыДокументовВыбор типа значения→Перечисление.ВидыДокументовРежим выбора→Выбор(для выпадающего списка)
Свяжите элемент формы с реквизитом документа (например, ВидДокумента), который должен иметь тип ПеречислениеСсылка.ВидыДокументов.
Для использования перечисления в отчетах (например, в качестве параметра):
-
Откройте схему компоновки данных отчета.
-
Добавьте новый параметр с типом
ПеречислениеСсылка.ВидыДокументов. -
В настройках параметра укажите
Видимость→ВидимыйиДоступные значения→Перечисление.ВидыДокументов. - Сохранена ли конфигурация после добавления перечисления.
- Обновлена ли база данных (
Конфигурация → Обновить конфигурацию базы данных). - Корректно ли указан тип значения в свойствах элемента формы (должен быть
ПеречислениеСсылка.ИмяПеречисления). - 🚫 Ошибка 1: Сравнение перечисления со строкой
Как упоминалось ранее, нельзя сравнивать значение перечисления со строковым литералом. Всегда используйте прямые ссылки на значения.
Решение: Замените
Если Вид = "Приходный"наЕсли Вид = Перечисления.ВидыДокументов.Приходный. - 🚫 Ошибка 2: Изменение идентификаторов значений после начала использования
Если вы измените идентификатор значения (например, с
ПриходныйнаПриход), весь код, где использовалось старое имя, перестанет работать.Решение: Перед изменением идентификаторов выполните поиск по всему коду (
Ctrl+Shift+F) и замените все упоминания старого имени. Лучше добавлять новые значения, а не переименовывать старые. - 🚫 Ошибка 3: Использование перечислений для динамических данных
Перечисления не предназначены для данных, которые часто меняются (например, список менеджеров или складов). Для этого лучше подходят справочники.
Решение: Если список значений может пополняться пользователями, используйте справочник с предопределенными элементами.
- 🚫 Ошибка 4: Забывают обновить базу данных после изменения перечисления
Если вы добавили новое значение в перечисление, но не обновили базу данных, оно не будет доступно в пользовательском режиме.
Решение: После изменений в конфигураторе всегда выполняйте
Конфигурация → Обновить конфигурацию базы данных. - Указан ли синоним для значения в конфигураторе.
- Обновлена ли конфигурация базы данных.
- Корректно ли настроено свойство
Представлениев элементе формы (должно бытьАвтоили явно указаноПредставление()). Новый(синоним: "Новый заказ")ВРаботе(синоним: "В обработке")Отгружен(синоним: "Отгружен со склада")Закрыт(синоним: "Завершен")Отменен(синоним: "Отменен клиентом")ПоступлениеДС(синоним: "Поступление денежных средств")СписаниеДС(синоним: "Списание денежных средств")ПеремещениеДС(синоним: "Перемещение между счетами")ФизЛицо(синоним: "Физическое лицо")ЮрЛицо(синоним: "Юридическое лицо")ИП(синоним: "Индивидуальный предприниматель")ВИП(синоним: "VIP-клиент")
Пример кода для фильтрации данных в отчете по значению перечисления:
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриходнаяНакладная КАК Документ
|ГДЕ
| Документ.ВидДокумента = &ВидДокумента";
Запрос.УстановитьПараметр("ВидДокумента", ПараметрыОтчета.ВидДокумента);
Результат = Запрос.Выполнить();
⚠️ Внимание: Если в форме или отчете перечисление отображается как пустой список, проверьте:
Процедура ПриОткрытии(Отказ)
ЭлементыФормы.ВидДокумента.СписокВыбора.Очистить();
ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(Перечисления.ВидыДокументов.Приходный);
ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(Перечисления.ВидыДокументов.Внутренний);
КонецПроцедуры
-->
Работа с перечислениями в коде 1С
В модулях 1С перечисления доступны через глобальный объект Перечисления. Основные методы и свойства для работы с ними:
| Задача | Пример кода | Описание |
|---|---|---|
| Получение значения по идентификатору | Значение = Перечисления.ВидыДокументов.Приходный; |
Возвращает ссылку на значение перечисления |
| Получение синонима (представления) | Синоним = Перечисления.ВидыДокументов.Приходный.Представление(); |
Возвращает отображаемое имя значения |
| Проверка равенства | Если Вид = Перечисления.ВидыДокументов.Приходный Тогда |
Сравнивает значение перечисления с другим значением |
| Перебор всех значений |
|
Итерирует по всем значениям перечисления |
| Получение значения по строковому представлению | Значение = Перечисления.ВидыДокументов.Получить("Приходный"); |
Возвращает значение по его идентификатору (не синониму!) |
Пример использования перечисления в модуле документа для валидации данных:
Процедура ПередЗаписью(Отказ)
Если ВидДокумента = Неопределено Тогда
Сообщить("Не указан вид документа!", СтатусСообщения.Важное);
Отказ = Истина;
ИначеЕсли ВидДокумента = Перечисления.ВидыДокументов.Приходный И Нomenклатура.Количество <= 0 Тогда
Сообщить("Для приходного документа количество должно быть больше 0!", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Например, следующий код вызовет ошибку:
// НЕПРАВИЛЬНО!
Если ВидДокумента = "Приходный" Тогда
// Ошибка: нельзя сравнивать ПеречислениеСсылка со строкой
КонецЕсли;
Instead, always compare with the enumeration value directly:
// ПРАВИЛЬНО
Если ВидДокумента = Перечисления.ВидыДокументов.Приходный Тогда
// Корректное сравнение
КонецЕсли;
При работе с перечислениями в коде всегда используйте прямые ссылки на значения (Перечисления.Имя.Значение). Избегайте сравнения со строками или числовыми кодами — это приводит к ошибкам и усложняет поддержку кода.
Типичные ошибки при работе с перечислениями и как их избежать
Даже опытные разработчики 1С иногда допускают ошибки при работе с перечислениями. Рассмотрим наиболее распространенные проблемы и способы их решения:
Еще одна типичная проблема — некорректное отображение синонимов в формах. Если вместо синонима отображается идентификатор (например, Приходный вместо Приходная накладная), проверьте:
⚠️ Внимание: Если вы удаляете значение из перечисления, которое уже используется в базе данных, это может привести к ошибкам при открытии документов или отчетов. Перед удалением проверьте, не ссылается ли на это значение какой-либо объект, с помощью запроса:ВЫБРАТЬ РАЗЛИЧНЫЕ ВидДокумента ИЗ Документ.ПриходнаяНакладная;
Практические примеры использования перечислений
Рассмотрим несколько реальных сценариев, где перечисления незаменимы:
Пример 1: Статусы заказов в торговой системе
Создадим перечисление СтатусыЗаказов со значениями:
Код для изменения статуса заказа:
Процедура ИзменитьСтатус(Заказ, НовыйСтатус)
Если НовыйСтатус = Перечисления.СтатусыЗаказов.Отменен Тогда
Если Заказ.Статус = Перечисления.СтатусыЗаказов.Отгружен Тогда
Сообщить("Нельзя отменить уже отгруженный заказ!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
КонецЕсли;
Заказ.Статус = НовыйСтатус;
Заказ.Записать();
КонецПроцедуры
Пример 2: Типы операций в бухгалтерии
Перечисление ВидыОпераций может включать:
Использование в отчете для фильтрации:
Запрос.Текст =
"ВЫБРАТЬ
| Операция.Дата,
| Операция.Сумма,
| Операция.ВидОперации КАК ВидОперации
|ИЗ
| Документ.БанковскаяОперация КАК Операция
|ГДЕ
| Операция.ВидОперации = &ВидОперации";
Запрос.УстановитьПараметр("ВидОперации", Перечисления.ВидыОпераций.ПоступлениеДС);
Результат = Запрос.Выполнить();
Пример 3: Категории клиентов в CRM
Перечисление КатегорииКлиентов:
Код для применения скидки в зависимости от категории:
Функция ПолучитьСкидку(Клиент)
Если Клиент.Категория = Перечисления.КатегорииКлиентов.ВИП Тогда
Возврат 0.15; // 15% скидка
ИначеЕсли Клиент.Категория = Перечисления.КатегорииКлиентов.ЮрЛицо Тогда
Возврат 0.05; // 5% скидка
Иначе
Возврат 0; // Без скидки
КонецЕсли;
КонецФункции
Эти примеры демонстрируют, как перечисления помогают структурировать данные и упрощают логику программирования. Главное — правильно определить, где стоит использовать перечисление, а где лучше подойдет справочник.
FAQ: Частые вопросы по работе с перечислениями в 1С
Можно ли добавить значение в перечисление без обновления конфигурации?
Нет, нельзя. Перечисления являются частью метаданных конфигурации, и любые изменения (добавление, удаление или переименование значений) требуют:
- Редактирования в конфигураторе.
- Сохранения конфигурации (
Ctrl+S). - Обновления базы данных (
Конфигурация → Обновить конфигурацию базы данных).
Если вы пытаетесь добавить значение программно в пользовательском режиме, используйте справочник с предопределенными элементами вместо перечисления.
Как получить числовой код значения перечисления?
Каждое значение перечисления имеет внутренний числовой код (поле Код), который можно использовать для сравнений или сортировки. Пример:
КодПриходного = Перечисления.ВидыДокументов.Приходный.Код();
Сообщить(КодПриходного); // Выведет числовой идентификатор (например, 0)
Однако не рекомендуется использовать числовые коды в логике программы, так как они могут измениться при реорганизации перечисления. Лучше всегда ссылаться на значения по идентификаторам.
Можно ли сделать перечисление иерархическим?
Нет, перечисления в 1С не поддерживают иерархию (в отличие от справочников). Если вам нужна вложенная структура (например, "Типы товаров → Одежда → Мужская"), используйте:
- Справочник с иерархией.
- Несколько перечислений (например,
КатегорииТоваровиПодкатегорииТоваров).
Пример альтернативного решения с двумя перечислениями:
// Перечисление КатегорииТоваров: Одежда, Обувь, Аксессуары
// Перечисление ПодкатегорииОдежды: Мужская, Женская, Детская
Если Категория = Перечисления.КатегорииТоваров.Одежда Тогда
Подкатегория = Перечисления.ПодкатегорииОдежды.Мужская;
КонецЕсли;
Как экспортировать/импортировать перечисления между базами?
Перечисления экспортируются вместе с конфигурацией. Чтобы перенести их в другую базу:
- Выгрузите конфигурацию в файл
.cf(Файл → Выгрузить конфигурацию). - Загрузите конфигурацию в целевую базу (
Файл → Загрузить конфигурацию). - Обновите базу данных (
Конфигурация → Обновить конфигурацию базы данных).
Если нужно перенести только одно перечисление, можно:
- Скопировать его вручную через конфигуратор.
- Использовать расширения конфигурации (для 1С 8.3.14+), чтобы добавить перечисление без изменения основной конфигурации.
Что будет, если удалить значение перечисления, которое используется в базе?
Если значение перечисления используется в документах, регистрах или других объектах, его удаление приведет к:
- Ошибкам при открытии объектов, ссылающихся на удаленное значение.
- Невозможности прочитать старые данные (если не сделано резервное копирование).
Решение: Вместо удаления отметьте значение как ПомеченоНаУдаление (если это поддерживается) или добавьте новое значение с пометкой Устарело в синониме. Например:
// Вместо удаления:
Перечисления.СтатусыЗаказов.СтароеЗначение.УстановитьСиноним("Устарело: Старый статус");
Также перед удалением выполните запрос для поиска ссылок:
ВЫБРАТЬ РАЗЛИЧНЫЕ Статус ИЗ Документ.Заказ;