Перечисления в 1С:Предприятие — это не просто списки значений, а мощный инструмент для структурирования данных. Они позволяют стандартизировать ввод информации, избежать ошибок при выборе и упростить аналитику. Например, вместо того чтобы вручную вводить статусы заказов ("Новый", "В обработке", "Выполнен"), вы создаёте перечисление — и пользователи выбирают из фиксированного списка. Это экономит время, снижает риск опечаток и облегчает формирование отчётов.
В этой статье разберём все способы работы с перечислениями: от базового создания через конфигуратор до программного управления с помощью встроенного языка 1С. Особое внимание уделим нюансам, которые часто упускают начинающие разработчики — например, как правильно расширять существующие перечисления без потери данных или почему не стоит злоупотреблять синонимами. Материал актуален для платформ 1С:Предприятие 8.3 и 8.2, с учётом особенностей обеих версий.
Если вы администрируете базу или занимаетесь доработками, умение грамотно работать с перечислениями сэкономит вам часы на отладку и поддержку. А для бухгалтеров и менеджеров понимание этого механизма поможет лучше ориентироваться в интерфейсе программы и даже предлагать улучшения для автоматизации рутинных задач.
Что такое перечисление в 1С и зачем оно нужно
Перечисление (Перечисление в терминах 1С) — это фиксированный набор значений, который хранится в базе данных и может использоваться в полях справочников, документов, регистров и других объектах. В отличие от справочников, где пользователь может добавлять новые элементы, перечисления жёстко заданы на этапе разработки и изменяются только программистом.
Основные преимущества:
- 🔹 Контроль ввода: пользователь не сможет ввести значение, отсутствующее в списке (например, опечатку в статусе заказа).
- 🔹 Упрощение кода: вместо строковых сравнений (
Если Статус = "Новый" Тогда...) используются числовые идентификаторы, что ускоряет выполнение. - 🔹 Многоязычность: одно перечисление может иметь синонимы на разных языках (например, "Draft" и "Черновик" для одного значения).
- 🔹 Целостность данных: при изменении названия значения в перечислении автоматически обновляются все ссылки на него в базе.
Типичные примеры использования:
- 📄 Статусы документов: "Черновик", "Проведён", "Отменён".
- 📦 Типы номенклатуры: "Товар", "Услуга", "Комплект".
- 👥 Категории контрагентов: "Поставщик", "Покупатель", "Партнёр".
- 📊 Виды операций: "Поступление", "Реализация", "Возврат".
Важно понимать, что перечисления — это объекты конфигурации, а не данные. Они хранятся в метаданных, а не в таблицах базы. Это означает, что:
- Их нельзя изменить в пользовательском режиме (только через конфигуратор или код).
- При обновлении конфигурации перечисления могут быть перезаписаны.
- Они не поддерживают историю изменений (в отличие от справочников).
Если вам нужно, чтобы пользователи могли добавлять свои значения, но при этом сохранялся контроль, используйте справочник с предопределёнными элементами вместо перечисления.
Способы создания перечислений в 1С
Есть три основных способа создать перечисление в 1С:
- Через конфигуратор — визуальный редактор (подходит для большинства задач).
- Через встроенный язык — программно, в модулях (нужно для динамических перечислений).
- Через расширения конфигурации — если нужно добавить значения в существующее перечисление без изменения основной конфигурации.
Рассмотрим каждый способ подробно.
1. Создание через конфигуратор (пошагово)
Это самый распространённый метод. Инструкция актуальна для 1С:Предприятие 8.3:
- Откройте конфигуратор (
Файл → Конфигураторили запустите 1С с ключом/Config). - В дереве объектов найдите ветку
Общие → Перечисления. - Кликните правой кнопкой и выберите
Добавить. - Задайте имя перечисления (например,
СтатусыЗаказов). Имя должно быть уникальным и соответствовать правилам идентификаторов 1С (латиница, без пробелов). - В поле
Синонимукажите читаемое название (например, "Статусы заказов"). - В поле
Комментарийможно добавить описание (необязательно). - Перейдите на вкладку
Значенияи добавьте элементы:
Пример заполнения для перечисления статусов заказов:
| Имя | Синоним | Представление | Значение |
|---|---|---|---|
Новый |
Новый | Новый заказ | 0 |
ВОбработке |
В обработке | Заказ обрабатывается | 1 |
Выполнен |
Выполнен | Заказ выполнен | 2 |
Отменен |
Отменён | Заказ отменён | 3 |
Обратите внимание на поле Значение: по умолчанию 1С присваивает числовые идентификаторы (0, 1, 2...). Их можно изменить вручную, но это может привести к ошибкам, если перечисление уже используется в базе. Лучше оставлять автоматическую нумерацию.
Имя уникально и соответствует стандартам именования
Синонимы читаемые и без опечаток
Значения не пересекаются с другими перечислениями
Поле "Представление" заполнено (отображается в интерфейсе)
-->
2. Создание через встроенный язык (программно)
Иногда перечисления нужно создавать или модифицировать динамически — например, при загрузке данных из внешнего источника. Для этого используется встроенный язык 1С.
Пример кода для создания нового перечисления:
// Создание нового перечисления программно
Перечисление = Метаданные.ДобавитьОбъект("Перечисление");
Перечисление.Имя = "ТипыДокументов";
Перечисление.Синоним = "Типы документов";
// Добавление значений
Значение1 = Перечисление.Значения.Добавить();
Значение1.Имя = "ПриходнаяНакладная";
Значение1.Синоним = "Приходная накладная";
Значение1.Представление = "Приходная накладная";
Значение2 = Перечисление.Значения.Добавить();
Значение2.Имя = "РасходнаяНакладная";
Значение2.Синоним = "Расходная накладная";
Значение2.Представление = "Расходная накладная";
// Сохранение изменений
Метаданные.Записать();
Важные нюансы:
- 🔧 Этот код выполняется в конфигураторе (например, в модуле объекта или внешней обработке).
- 🔧 После выполнения кода нужно обновить конфигурацию базы данных (
Конфигурация → Обновить конфигурацию базы данных). - 🔧 Если перечисление уже существует, используйте метод
НайтиПоИмени(), чтобы избежать дублирования.
Программное создание перечислений может привести к конфликтам при групповой разработке. Всегда согласовывайте такие изменения с командой и фиксируйте их в системе контроля версий.
3. Расширение существующих перечислений
Если вам нужно добавить значения в уже существующее перечисление (например, в типовое решение), не изменяя основную конфигурацию, используйте расширения конфигурации:
- Откройте конфигуратор и перейдите в
Конфигурация → Расширения конфигурации. - Создайте новое расширение или откройте существующее.
- В дереве объектов расширения найдите
Общие → Перечисления. - Выберите нужное перечисление и добавьте новые значения.
Пример: добавление статуса "На согласовании" в перечисление СтатусыЗаказов:
// В модуле расширения
Процедура ДобавитьСтатусНаСогласовании()
Перечисление = Метаданные.Перечисления.СтатусыЗаказов;
НовоеЗначение = Перечисление.Значения.Добавить();
НовоеЗначение.Имя = "НаСогласовании";
НовоеЗначение.Синоним = "На согласовании";
НовоеЗначение.Представление = "Заказ на согласовании";
НовоеЗначение.Значение = 4; // Следующее свободное значение
КонецПроцедуры
Преимущество этого метода — сохранение поддержки типовой конфигурации. Однако учитывайте, что:
- 🔹 Расширения могут конфликтовать друг с другом.
- 🔹 При обновлении типовой конфигурации придётся проверять актуальность расширений.
Расширения конфигурации — лучший способ доработать типовые решения без потери поддержки. Но злоупотребление ими усложняет сопровождение системы.
Как использовать перечисления в объектах 1С
Создать перечисление — половина дела. Теперь нужно научиться применять его в справочниках, документах и отчётах. Рассмотрим основные сценарии.
1. Добавление перечисления в справочник или документ
Чтобы использовать перечисление в качестве реквизита:
- Откройте нужный объект (например, справочник
Номенклатура) в конфигураторе. - Перейдите на вкладку
Реквизитыи добавьте новый реквизит. - В поле
Типвыберите ваше перечисление (например,ПеречислениеСсылка.ТипыНоменклатуры). - Укажите имя (например,
ТипНоменклатуры) и синоним.
Пример настройки реквизита "Статус" в документе ЗаказПокупателя:
| Свойство | Значение |
|---|---|
| Имя | Статус |
| Синоним | Статус заказа |
| Тип | ПеречислениеСсылка.СтатусыЗаказов |
| Длина | 0 (не используется) |
| Проверка заполнения | Выдавать ошибку |
После добавления реквизита не забудьте:
- 🔹 Настроить формы (добавить поле на форму документа или справочника).
- 🔹 Указать значение по умолчанию (например, статусу "Новый" для новых заказов).
- 🔹 Прописать права доступа, если перечисление используется в чувствительных данных.
2. Работа с перечислениями в коде
В модулях 1С перечисления используются для сравнений, фильтрации и логики. Основные приёмы:
Получение значения перечисления:
ТекущийСтатус = Документ.Статус;
Если ТекущийСтатус = Перечисления.СтатусыЗаказов.Выполнен Тогда
Сообщить("Заказ выполнен!");
КонецЕсли;
Перебор всех значений:
Для Каждого Значение Из Перечисления.СтатусыЗаказов Цикл
Сообщить(Значение.Представление);
КонецЦикла;
Получение значения по имени:
СтатусОтменен = Перечисления.СтатусыЗаказов.Отменен;
Если Документ.Статус = СтатусОтменен Тогда
// Логика для отменённых заказов
КонецЕсли;
Преобразование в строку и обратно:
// В строку
СтрокаСтатуса = Строка(Документ.Статус);
// Из строки (небезопасно, лучше использовать перечисление!)
Попытка
Статус = Перечисления.СтатусыЗаказов.Новый();
Статус.Установить(СтрокаСтатуса);
Исключение
Сообщить("Ошибка преобразования статуса!");
КонецПопытки;
Почему не стоит хранить статусы как строки?
Если хранить статусы в виде строк ("Новый", "Выполнен"), то:
1. Легко допустить опечатку ("Выполнен" vs "Выполненный").
2. Сравнение строк медленнее, чем сравнение чисел (а перечисления внутри хранятся как числа).
3. При изменении названия статуса придётся обновлять все записи в базе вручную.
4. Сложнее организовать многоязычность.
3. Использование в отчётах и запросах
В запросах перечисления используются для фильтрации и группировки. Примеры:
Фильтрация по статусу:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказы.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК Заказы
|ГДЕ
| Заказы.Статус = &Статус";
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаказов.Выполнен);
Результат = Запрос.Выполнить();
Группировка по перечислению:
Запрос.Текст =
"ВЫБРАТЬ
| Заказы.Статус КАК Статус,
| COUNT(Заказы.Ссылка) КАК Количество
|ИЗ
| Документ.ЗаказПокупателя КАК Заказы
|СГРУППИРОВАТЬ ПО
| Заказы.Статус";
Вывод представления (а не внутреннего имени):
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Заказы.Статус КАК Строка) КАК СтатусСтрока,
| Заказы.Статус.Представление КАК СтатусПредставление
|ИЗ
| Документ.ЗаказПокупателя КАК Заказы";
В отчётах (например, в СКД) перечисления автоматически подставляют свои представления. Чтобы отобразить синоним вместо внутреннего имени, используйте свойство Представление:
// В модуле отчёта
ПараметрыОтчёта.Статус = Перечисления.СтатусыЗаказов.Выполнен.Представление;
Типичные ошибки при работе с перечислениями
Даже опытные разработчики иногда допускают ошибки при работе с перечислениями. Вот самые распространённые:
⚠️ Внимание: Если вы меняете порядок значений в перечислении или их числовые идентификаторы, это может привести к потере данных в базе. Например, если статус "Выполнен" имел значение 2, а вы поменяли его на 3, то все документы со статусом 2 будут ссылаться на другое значение.
1. Изменение числовых идентификаторов
Как уже упоминалось, каждое значение перечисления имеет внутренний числовой идентификатор. Если вы вручную измените его (например, с 0 на 5), то:
- 🔴 Все существующие записи в базе, ссылающиеся на это значение, "потеряются".
- 🔴 В коде начнут возникать ошибки при сравнении.
- 🔴 В отчётах данные будут группироваться некорректно.
Решение: если нужно вставить новое значение между существующими, используйте дробные идентификаторы (например, 1.5). Но лучше добавлять новые значения в конец списка.
2. Использование строк вместо перечислений
Иногда разработчики ленятся создавать перечисление и хранят статусы в виде строк:
Если Документ.Статус = "Выполнен" Тогда...
Проблемы такого подхода:
- 🔴 Опечатки ("Выполнен" vs "Выполненный") приведут к ошибкам.
- 🔴 Сравнение строк работает медленнее, чем сравнение чисел.
- 🔴 Сложно организовать многоязычность.
Исключение: строки оправданы, если значения загружаются из внешней системы и не известны заранее.
3. Забывают про синонимы и представления
Часто разработчики заполняют только поле Имя, игнорируя Синоним и Представление. Это приводит к:
- 🔴 Неудобочитаемым названиям в интерфейсе (например,
СтатусЗаказаОплаченвместо "Оплачен"). - 🔴 Проблемам с локализацией (нет возможности перевести на другой язык).
Решение: всегда заполняйте все три поля:
- 🔹
Имя— для кода (латиница, без пробелов). - 🔹
Синоним— краткое название для интерфейса. - 🔹
Представление— полное название (может включать пробелы и знаки препинания).
4. Слишком большие перечисления
Если в перечислении больше 20–30 значений, это признак плохого проектирования. Проблемы:
- 🔴 Трудно поддерживать (при добавлении нового значения придётся обновлять конфигурацию).
- 🔴 Пользователям неудобно выбирать из длинного списка.
- 🔴 Увеличивается размер метаданных.
Решение: разбейте большое перечисление на несколько меньших или используйте справочник.
5. Не учитывают расширения
Если вы дорабатываете типовую конфигурацию, никогда не изменяйте существующие перечисления напрямую. Вместо этого:
- 🔹 Используйте расширения конфигурации для добавления новых значений.
- 🔹 Проверяйте, не используются ли эти перечисления в типовых механизмах (например, в бухгалтерских проводках).
Пример проблемной ситуации: вы добавили новый статус в перечисление ВидыДвиженияДенежныхСредств, но не учли, что типовой отчёт "Анализ движения денежных средств" не ожидает этого значения и будет его игнорировать.
Продвинутые приёмы работы с перечислениями
Когда вы освоили базовые операции, можно переходить к более сложным сценариям.
1. Динамические перечисления
Иногда значения перечисления нужно формировать динамически — например, на основе данных из справочника или внешнего источника. Для этого:
- Создайте перечисление с минимальным набором значений (или вообще без значений).
- В модуле формы или объекта заполняйте его программно.
Пример: загрузка типов документов из внешней системы:
Процедура ЗаполнитьДинамическоеПеречисление()
Перечисление = Перечисления.ТипыДокументов;
// Очищаем существующие значения (если нужно)
Перечисление.Очистить();
// Загружаем данные из внешнего источника (например, JSON)
Ответ = ПолучитьДанныеИзAPI("https://api.example.com/doc_types");
Для Каждого ТипДокумента Из Ответ.Типы Цикл
НовоеЗначение = Перечисление.Значения.Добавить();
НовоеЗначение.Имя = ТипДокумента.Код;
НовоеЗначение.Синоним = ТипДокумента.Название;
КонецЦикла;
КонецПроцедуры
Ограничения:
- 🔹 Такие перечисления не сохраняются в метаданных (при перезапуске 1С значения пропадут).
- 🔹 Их нельзя использовать в запросах и отчётах (только в коде).
2. Локализация перечислений
Если ваша база используется в нескольких странах, настройте многоязычность для перечислений:
- Откройте перечисление в конфигураторе.
- На вкладке
Значениявыберите значение и нажмитеДобавить синоним. - Укажите язык (например,
enдля английского) и перевод.
Пример:
| Язык | Синоним | Представление |
|---|---|---|
| Русский (по умолчанию) | Новый | Новый заказ |
| Английский (en) | New | New order |
| Немецкий (de) | Neu | Neuer Auftrag |
В коде язык можно изменить так:
// Установить английский язык для текущего сеанса
УстановитьЯзык("en");
// Теперь все представления будут на английском
Сообщить(Перечисления.СтатусыЗаказов.Новый.Представление); // Выведет "New order"
3. Использование перечислений в правах доступа
Перечисления можно использовать для гибкой настройки прав. Например, ограничить доступ к документам по статусу:
- Создайте роль (например,
МенеджерПоЗаказам). - В настройках прав для документа
ЗаказПокупателядобавьте ограничение по реквизитуСтатус. - Разрешите просматривать только заказы со статусами "Новый" и "В обработке".
Пример настройки в конфигураторе:
// В модуле роли
Процедура ПриНачалеРаботыСистемы()
Ограничение = Новый ОграничениеДоступа("Документ.ЗаказПокупателя");
Ограничение.ДобавитьТип("Статус",
Перечисления.СтатусыЗаказов.Новый,
Перечисления.СтатусыЗаказов.ВОбработке);
Права.ДобавитьОграничение(Ограничение);
КонецПроцедуры
4. Расширение типовых перечислений
Если вы работаете с типовой конфигурацией (например, 1С:ERP или 1С:УТ), избегайте прямого изменения перечислений. Вместо этого:
- 🔹 Используйте расширения конфигурации для добавления новых значений.
- 🔹 Если нужно заменить логику, создайте обработку, которая будет подменять значения при отображении.
- 🔹 Для сложных случаев рассмотрите подписки на события (например,
ПриОтображенииСтатуса).
Пример: добавление статуса "На согласовании" в типовой документ:
// В расширении конфигурации
Процедура ДобавитьСтатусНаСогласовании()
Перечисление = Метаданные.Перечисления.СтатусыДокументов;
НовоеЗначение = Перечисление.Значения.Добавить();
НовоеЗначение.Имя = "НаСогласовании";
НовоеЗначение.Синоним = "На согласовании";
НовоеЗначение.Представление = "Документ на согласовании";
НовоеЗначение.Значение = 100; // Большое число, чтобы не конфликтовать с типовыми значениями
КонецПроцедуры
Как перенести перечисления между базами
При переносе конфигурации или обмене данными между базами перечисления требуют особого внимания. Рассмотрим основные сценарии.
1. Перенос через файлы .cf и .epf
Если вы переносите конфигурацию (не данные!), перечисления экспортируются автоматически:
- В конфигураторе выберите
Файл → Сохранить конфигурацию в файл(формат*.cf). - В целевой базе выберите
Файл → Открыть конфигурацию из файла. - Сравните и объедините конфигурации.
Важно:
- 🔹 Если в целевой базе уже есть перечисление с таким именем, будет конфликт. Решается вручную при объединении.
- 🔹 Значения перечислений перенося