Перечисления в 1С:Предприятие — это не просто списки значений, а мощный инструмент для структурирования данных. Они позволяют стандартизировать ввод информации, избежать ошибок при выборе и упростить аналитику. Например, вместо того чтобы вручную вводить статусы заказов ("Новый", "В обработке", "Выполнен"), вы создаёте перечисление — и пользователи выбирают из фиксированного списка. Это экономит время, снижает риск опечаток и облегчает формирование отчётов.

В этой статье разберём все способы работы с перечислениями: от базового создания через конфигуратор до программного управления с помощью встроенного языка . Особое внимание уделим нюансам, которые часто упускают начинающие разработчики — например, как правильно расширять существующие перечисления без потери данных или почему не стоит злоупотреблять синонимами. Материал актуален для платформ 1С:Предприятие 8.3 и 8.2, с учётом особенностей обеих версий.

Если вы администрируете базу или занимаетесь доработками, умение грамотно работать с перечислениями сэкономит вам часы на отладку и поддержку. А для бухгалтеров и менеджеров понимание этого механизма поможет лучше ориентироваться в интерфейсе программы и даже предлагать улучшения для автоматизации рутинных задач.

📊 Для чего вы чаще всего используете перечисления в 1С?
Для статусов документов
Для типов номенклатуры
Для классификаторов (регионы, отделы)
Для настройки прав доступа
Другое

Что такое перечисление в 1С и зачем оно нужно

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

Основные преимущества:

  • 🔹 Контроль ввода: пользователь не сможет ввести значение, отсутствующее в списке (например, опечатку в статусе заказа).
  • 🔹 Упрощение кода: вместо строковых сравнений (Если Статус = "Новый" Тогда...) используются числовые идентификаторы, что ускоряет выполнение.
  • 🔹 Многоязычность: одно перечисление может иметь синонимы на разных языках (например, "Draft" и "Черновик" для одного значения).
  • 🔹 Целостность данных: при изменении названия значения в перечислении автоматически обновляются все ссылки на него в базе.

Типичные примеры использования:

  • 📄 Статусы документов: "Черновик", "Проведён", "Отменён".
  • 📦 Типы номенклатуры: "Товар", "Услуга", "Комплект".
  • 👥 Категории контрагентов: "Поставщик", "Покупатель", "Партнёр".
  • 📊 Виды операций: "Поступление", "Реализация", "Возврат".

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

  • Их нельзя изменить в пользовательском режиме (только через конфигуратор или код).
  • При обновлении конфигурации перечисления могут быть перезаписаны.
  • Они не поддерживают историю изменений (в отличие от справочников).
💡

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

Способы создания перечислений в 1С

Есть три основных способа создать перечисление в :

  1. Через конфигуратор — визуальный редактор (подходит для большинства задач).
  2. Через встроенный язык — программно, в модулях (нужно для динамических перечислений).
  3. Через расширения конфигурации — если нужно добавить значения в существующее перечисление без изменения основной конфигурации.

Рассмотрим каждый способ подробно.

1. Создание через конфигуратор (пошагово)

Это самый распространённый метод. Инструкция актуальна для 1С:Предприятие 8.3:

  1. Откройте конфигуратор (Файл → Конфигуратор или запустите с ключом /Config).
  2. В дереве объектов найдите ветку Общие → Перечисления.
  3. Кликните правой кнопкой и выберите Добавить.
  4. Задайте имя перечисления (например, СтатусыЗаказов). Имя должно быть уникальным и соответствовать правилам идентификаторов (латиница, без пробелов).
  5. В поле Синоним укажите читаемое название (например, "Статусы заказов").
  6. В поле Комментарий можно добавить описание (необязательно).
  7. Перейдите на вкладку Значения и добавьте элементы:

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

Имя Синоним Представление Значение
Новый Новый Новый заказ 0
ВОбработке В обработке Заказ обрабатывается 1
Выполнен Выполнен Заказ выполнен 2
Отменен Отменён Заказ отменён 3

Обратите внимание на поле Значение: по умолчанию присваивает числовые идентификаторы (0, 1, 2...). Их можно изменить вручную, но это может привести к ошибкам, если перечисление уже используется в базе. Лучше оставлять автоматическую нумерацию.

Имя уникально и соответствует стандартам именования

Синонимы читаемые и без опечаток

Значения не пересекаются с другими перечислениями

Поле "Представление" заполнено (отображается в интерфейсе)

-->

2. Создание через встроенный язык (программно)

Иногда перечисления нужно создавать или модифицировать динамически — например, при загрузке данных из внешнего источника. Для этого используется встроенный язык .

Пример кода для создания нового перечисления:

// Создание нового перечисления программно

Перечисление = Метаданные.ДобавитьОбъект("Перечисление");

Перечисление.Имя = "ТипыДокументов";

Перечисление.Синоним = "Типы документов";

// Добавление значений

Значение1 = Перечисление.Значения.Добавить();

Значение1.Имя = "ПриходнаяНакладная";

Значение1.Синоним = "Приходная накладная";

Значение1.Представление = "Приходная накладная";

Значение2 = Перечисление.Значения.Добавить();

Значение2.Имя = "РасходнаяНакладная";

Значение2.Синоним = "Расходная накладная";

Значение2.Представление = "Расходная накладная";

// Сохранение изменений

Метаданные.Записать();

Важные нюансы:

  • 🔧 Этот код выполняется в конфигураторе (например, в модуле объекта или внешней обработке).
  • 🔧 После выполнения кода нужно обновить конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных).
  • 🔧 Если перечисление уже существует, используйте метод НайтиПоИмени(), чтобы избежать дублирования.

Программное создание перечислений может привести к конфликтам при групповой разработке. Всегда согласовывайте такие изменения с командой и фиксируйте их в системе контроля версий.

3. Расширение существующих перечислений

Если вам нужно добавить значения в уже существующее перечисление (например, в типовое решение), не изменяя основную конфигурацию, используйте расширения конфигурации:

  1. Откройте конфигуратор и перейдите в Конфигурация → Расширения конфигурации.
  2. Создайте новое расширение или откройте существующее.
  3. В дереве объектов расширения найдите Общие → Перечисления.
  4. Выберите нужное перечисление и добавьте новые значения.

Пример: добавление статуса "На согласовании" в перечисление СтатусыЗаказов:

// В модуле расширения

Процедура ДобавитьСтатусНаСогласовании()

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

НовоеЗначение = Перечисление.Значения.Добавить();

НовоеЗначение.Имя = "НаСогласовании";

НовоеЗначение.Синоним = "На согласовании";

НовоеЗначение.Представление = "Заказ на согласовании";

НовоеЗначение.Значение = 4; // Следующее свободное значение

КонецПроцедуры

Преимущество этого метода — сохранение поддержки типовой конфигурации. Однако учитывайте, что:

  • 🔹 Расширения могут конфликтовать друг с другом.
  • 🔹 При обновлении типовой конфигурации придётся проверять актуальность расширений.
💡

Расширения конфигурации — лучший способ доработать типовые решения без потери поддержки. Но злоупотребление ими усложняет сопровождение системы.

Как использовать перечисления в объектах 1С

Создать перечисление — половина дела. Теперь нужно научиться применять его в справочниках, документах и отчётах. Рассмотрим основные сценарии.

1. Добавление перечисления в справочник или документ

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

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

Пример настройки реквизита "Статус" в документе ЗаказПокупателя:

Свойство Значение
Имя Статус
Синоним Статус заказа
Тип ПеречислениеСсылка.СтатусыЗаказов
Длина 0 (не используется)
Проверка заполнения Выдавать ошибку

После добавления реквизита не забудьте:

  • 🔹 Настроить формы (добавить поле на форму документа или справочника).
  • 🔹 Указать значение по умолчанию (например, статусу "Новый" для новых заказов).
  • 🔹 Прописать права доступа, если перечисление используется в чувствительных данных.

2. Работа с перечислениями в коде

В модулях перечисления используются для сравнений, фильтрации и логики. Основные приёмы:

Получение значения перечисления:

ТекущийСтатус = Документ.Статус;

Если ТекущийСтатус = Перечисления.СтатусыЗаказов.Выполнен Тогда

Сообщить("Заказ выполнен!");

КонецЕсли;

Перебор всех значений:

Для Каждого Значение Из Перечисления.СтатусыЗаказов Цикл

Сообщить(Значение.Представление);

КонецЦикла;

Получение значения по имени:

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

Если Документ.Статус = СтатусОтменен Тогда

// Логика для отменённых заказов

КонецЕсли;

Преобразование в строку и обратно:

// В строку

СтрокаСтатуса = Строка(Документ.Статус);

// Из строки (небезопасно, лучше использовать перечисление!)

Попытка

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

Статус.Установить(СтрокаСтатуса);

Исключение

Сообщить("Ошибка преобразования статуса!");

КонецПопытки;

Почему не стоит хранить статусы как строки?

Если хранить статусы в виде строк ("Новый", "Выполнен"), то:

1. Легко допустить опечатку ("Выполнен" vs "Выполненный").

2. Сравнение строк медленнее, чем сравнение чисел (а перечисления внутри хранятся как числа).

3. При изменении названия статуса придётся обновлять все записи в базе вручную.

4. Сложнее организовать многоязычность.

3. Использование в отчётах и запросах

В запросах перечисления используются для фильтрации и группировки. Примеры:

Фильтрация по статусу:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Заказы.Ссылка КАК Ссылка

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

|ГДЕ

| Заказы.Статус = &Статус";

Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыЗаказов.Выполнен);

Результат = Запрос.Выполнить();

Группировка по перечислению:

Запрос.Текст =

"ВЫБРАТЬ

| Заказы.Статус КАК Статус,

| COUNT(Заказы.Ссылка) КАК Количество

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы

|СГРУППИРОВАТЬ ПО

| Заказы.Статус";

Вывод представления (а не внутреннего имени):

Запрос.Текст =

"ВЫБРАТЬ

| ВЫРАЗИТЬ(Заказы.Статус КАК Строка) КАК СтатусСтрока,

| Заказы.Статус.Представление КАК СтатусПредставление

|ИЗ

| Документ.ЗаказПокупателя КАК Заказы";

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

// В модуле отчёта

ПараметрыОтчёта.Статус = Перечисления.СтатусыЗаказов.Выполнен.Представление;

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

Даже опытные разработчики иногда допускают ошибки при работе с перечислениями. Вот самые распространённые:

⚠️ Внимание: Если вы меняете порядок значений в перечислении или их числовые идентификаторы, это может привести к потере данных в базе. Например, если статус "Выполнен" имел значение 2, а вы поменяли его на 3, то все документы со статусом 2 будут ссылаться на другое значение.

1. Изменение числовых идентификаторов

Как уже упоминалось, каждое значение перечисления имеет внутренний числовой идентификатор. Если вы вручную измените его (например, с 0 на 5), то:

  • 🔴 Все существующие записи в базе, ссылающиеся на это значение, "потеряются".
  • 🔴 В коде начнут возникать ошибки при сравнении.
  • 🔴 В отчётах данные будут группироваться некорректно.

Решение: если нужно вставить новое значение между существующими, используйте дробные идентификаторы (например, 1.5). Но лучше добавлять новые значения в конец списка.

2. Использование строк вместо перечислений

Иногда разработчики ленятся создавать перечисление и хранят статусы в виде строк:

Если Документ.Статус = "Выполнен" Тогда...

Проблемы такого подхода:

  • 🔴 Опечатки ("Выполнен" vs "Выполненный") приведут к ошибкам.
  • 🔴 Сравнение строк работает медленнее, чем сравнение чисел.
  • 🔴 Сложно организовать многоязычность.

Исключение: строки оправданы, если значения загружаются из внешней системы и не известны заранее.

3. Забывают про синонимы и представления

Часто разработчики заполняют только поле Имя, игнорируя Синоним и Представление. Это приводит к:

  • 🔴 Неудобочитаемым названиям в интерфейсе (например, СтатусЗаказаОплачен вместо "Оплачен").
  • 🔴 Проблемам с локализацией (нет возможности перевести на другой язык).

Решение: всегда заполняйте все три поля:

  • 🔹 Имя — для кода (латиница, без пробелов).
  • 🔹 Синоним — краткое название для интерфейса.
  • 🔹 Представление — полное название (может включать пробелы и знаки препинания).

4. Слишком большие перечисления

Если в перечислении больше 20–30 значений, это признак плохого проектирования. Проблемы:

  • 🔴 Трудно поддерживать (при добавлении нового значения придётся обновлять конфигурацию).
  • 🔴 Пользователям неудобно выбирать из длинного списка.
  • 🔴 Увеличивается размер метаданных.

Решение: разбейте большое перечисление на несколько меньших или используйте справочник.

5. Не учитывают расширения

Если вы дорабатываете типовую конфигурацию, никогда не изменяйте существующие перечисления напрямую. Вместо этого:

  • 🔹 Используйте расширения конфигурации для добавления новых значений.
  • 🔹 Проверяйте, не используются ли эти перечисления в типовых механизмах (например, в бухгалтерских проводках).

Пример проблемной ситуации: вы добавили новый статус в перечисление ВидыДвиженияДенежныхСредств, но не учли, что типовой отчёт "Анализ движения денежных средств" не ожидает этого значения и будет его игнорировать.

Продвинутые приёмы работы с перечислениями

Когда вы освоили базовые операции, можно переходить к более сложным сценариям.

1. Динамические перечисления

Иногда значения перечисления нужно формировать динамически — например, на основе данных из справочника или внешнего источника. Для этого:

  1. Создайте перечисление с минимальным набором значений (или вообще без значений).
  2. В модуле формы или объекта заполняйте его программно.

Пример: загрузка типов документов из внешней системы:

Процедура ЗаполнитьДинамическоеПеречисление()

Перечисление = Перечисления.ТипыДокументов;

// Очищаем существующие значения (если нужно)

Перечисление.Очистить();

// Загружаем данные из внешнего источника (например, JSON)

Ответ = ПолучитьДанныеИзAPI("https://api.example.com/doc_types");

Для Каждого ТипДокумента Из Ответ.Типы Цикл

НовоеЗначение = Перечисление.Значения.Добавить();

НовоеЗначение.Имя = ТипДокумента.Код;

НовоеЗначение.Синоним = ТипДокумента.Название;

КонецЦикла;

КонецПроцедуры

Ограничения:

  • 🔹 Такие перечисления не сохраняются в метаданных (при перезапуске 1С значения пропадут).
  • 🔹 Их нельзя использовать в запросах и отчётах (только в коде).

2. Локализация перечислений

Если ваша база используется в нескольких странах, настройте многоязычность для перечислений:

  1. Откройте перечисление в конфигураторе.
  2. На вкладке Значения выберите значение и нажмите Добавить синоним.
  3. Укажите язык (например, en для английского) и перевод.

Пример:

Язык Синоним Представление
Русский (по умолчанию) Новый Новый заказ
Английский (en) New New order
Немецкий (de) Neu Neuer Auftrag

В коде язык можно изменить так:

// Установить английский язык для текущего сеанса

УстановитьЯзык("en");

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

Сообщить(Перечисления.СтатусыЗаказов.Новый.Представление); // Выведет "New order"

3. Использование перечислений в правах доступа

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

  1. Создайте роль (например, МенеджерПоЗаказам).
  2. В настройках прав для документа ЗаказПокупателя добавьте ограничение по реквизиту Статус.
  3. Разрешите просматривать только заказы со статусами "Новый" и "В обработке".

Пример настройки в конфигураторе:

// В модуле роли

Процедура ПриНачалеРаботыСистемы()

Ограничение = Новый ОграничениеДоступа("Документ.ЗаказПокупателя");

Ограничение.ДобавитьТип("Статус",

Перечисления.СтатусыЗаказов.Новый,

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

Права.ДобавитьОграничение(Ограничение);

КонецПроцедуры

4. Расширение типовых перечислений

Если вы работаете с типовой конфигурацией (например, 1С:ERP или 1С:УТ), избегайте прямого изменения перечислений. Вместо этого:

  • 🔹 Используйте расширения конфигурации для добавления новых значений.
  • 🔹 Если нужно заменить логику, создайте обработку, которая будет подменять значения при отображении.
  • 🔹 Для сложных случаев рассмотрите подписки на события (например, ПриОтображенииСтатуса).

Пример: добавление статуса "На согласовании" в типовой документ:

// В расширении конфигурации

Процедура ДобавитьСтатусНаСогласовании()

Перечисление = Метаданные.Перечисления.СтатусыДокументов;

НовоеЗначение = Перечисление.Значения.Добавить();

НовоеЗначение.Имя = "НаСогласовании";

НовоеЗначение.Синоним = "На согласовании";

НовоеЗначение.Представление = "Документ на согласовании";

НовоеЗначение.Значение = 100; // Большое число, чтобы не конфликтовать с типовыми значениями

КонецПроцедуры

Как перенести перечисления между базами

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

1. Перенос через файлы .cf и .epf

Если вы переносите конфигурацию (не данные!), перечисления экспортируются автоматически:

  1. В конфигураторе выберите Файл → Сохранить конфигурацию в файл (формат *.cf).
  2. В целевой базе выберите Файл → Открыть конфигурацию из файла.
  3. Сравните и объедините конфигурации.

Важно:

  • 🔹 Если в целевой базе уже есть перечисление с таким именем, будет конфликт. Решается вручную при объединении.
  • 🔹 Значения перечислений перенося