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

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

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

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

Перечисление — это примитивный тип данных в 1С, который представляет собой фиксированный список именованных значений. Каждое значение имеет уникальный идентификатор и может иметь синоним (отображаемое имя на разных языках). Основные преимущества использования перечислений:

  • 🔹 Контроль целостности данных: невозможно ввести значение, отсутствующее в списке, что исключает опечатки.
  • 🔹 Упрощение кода: вместо магических чисел или строк используются понятные идентификаторы (например, ВидыОплаты.Наличные).
  • 🔹 Многоязычность: синонимы позволяют отображать значения на разных языках без изменения логики.
  • 🔹 Производительность: работа с перечислениями быстрее, чем со справочниками, так как значения хранятся в памяти.

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

Характеристика Перечисление Справочник
Изменяемость значений Только в конфигураторе Можно добавлять/удалять в пользовательском режиме
Хранение данных В метаданных конфигурации В базе данных (таблицы)
Использование в коде Доступ по идентификатору (Перечисление.Значение) Требует выборку из базы
Пример применения Статусы документов, виды операций Контрагенты, номенклатура, сотрудники

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

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

Как создать перечисление в конфигураторе 1С 8.3

Процесс создания перечисления состоит из нескольких шагов. Рассмотрим его на примере создания перечисления ВидыДокументов с значениями Приходный, Расходный и Внутренний.

  1. Откройте конфигуратор 1С:Предприятие в режиме редактирования. Для этого запустите файл 1CV8.1CD (или 1CV8.exe для файловой версии) с ключом /Config.

  2. В дереве метаданных найдите ветку Общие → Перечисления. Кликните правой кнопкой мыши и выберите Добавить.

  3. В открывшемся окне введите имя перечисления — ВидыДокументов. Имя должно быть уникальным в пределах конфигурации и соответствовать правилам именования 1С (латиница, без пробелов, начинаться с буквы).

  4. Перейдите на закладку Значения и добавьте три значения: Приходный, Расходный и Внутренний. Для каждого значения можно указать синоним (отображаемое имя) и комментарий.

  5. Сохраните конфигурацию (Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

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

Если ВидДокумента = Перечисления.ВидыДокументов.Приходный Тогда

// Логика для приходных документов

КонецЕсли;

☑️ Проверка перед сохранением перечисления

Выполнено: 0 / 4

Работа с синонимами и многоязычностью

Одной из ключевых особенностей перечислений в 1С является поддержка синонимов — альтернативных имен для значений. Синонимы позволяют:

  • 🌍 Отображать значения на разных языках (например, ПриходныйIncome для английской версии).
  • 📝 Использовать более понятные пользователю названия (например, СтатусОплаты.Оплачено может отображаться как Оплачен).
  • 🔄 Менять отображаемые имена без изменения кода (если логика привязана к идентификатору, а не к синониму).

Чтобы настроить синонимы:

  1. Откройте перечисление в конфигураторе и перейдите на закладку Значения.

  2. Выделите нужное значение (например, Приходный) и в поле Синоним введите альтернативное имя.

  3. Для многоязычности нажмите кнопку Добавить язык и выберите нужную локаль (например, Английский (США)). Введите перевод для каждого значения.

Пример кода, где используется синоним вместо идентификатора:

Сообщить(Перечисления.ВидыДокументов.Приходный.Представление()); // Выведет синоним, например "Приходная накладная"
⚠️ Внимание: Если вы изменяете синонимы в уже используемом перечислении, обновите все формы и отчеты, где эти синонимы отображаются. В некоторых случаях может потребоваться перезапуск клиентского приложения 1С, чтобы изменения вступили в силу.
Как проверить, что синоним отображается корректно?

Чтобы убедиться, что синоним подхватился системой, выполните следующий код в отладчике:

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

Сообщить(Значение.Представление()); // Должно вывести синоним, а не идентификатор

КонецЦикла;

Если выводятся идентификаторы (например, "Приходный" вместо "Приходная накладная"), проверьте, сохранены ли синонимы в конфигураторе и обновлена ли база данных.

Использование перечислений в формах и отчетах

Перечисления часто применяются в формах документов и отчетах для создания выпадающих списков. Рассмотрим, как добавить перечисление в форму документа на примере поля ВидДокумента:

  1. Откройте форму документа в конфигураторе (например, форму документа ПриходнаяНакладная).

  2. Добавьте на форму элемент управления Поле ввода (или Поле выбора для выпадающего списка).

  3. В свойствах элемента установите:

    • Тип значенияПеречислениеСсылка.ВидыДокументов
    • Выбор типа значенияПеречисление.ВидыДокументов
    • Режим выбораВыбор (для выпадающего списка)

  • Свяжите элемент формы с реквизитом документа (например, ВидДокумента), который должен иметь тип ПеречислениеСсылка.ВидыДокументов.

  • Для использования перечисления в отчетах (например, в качестве параметра):

    1. Откройте схему компоновки данных отчета.

    2. Добавьте новый параметр с типом ПеречислениеСсылка.ВидыДокументов.

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

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

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

      "ВЫБРАТЬ

      | Документ.Ссылка КАК Ссылка

      |ИЗ

      | Документ.ПриходнаяНакладная КАК Документ

      |ГДЕ

      | Документ.ВидДокумента = &ВидДокумента";

      Запрос.УстановитьПараметр("ВидДокумента", ПараметрыОтчета.ВидДокумента);

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

      ⚠️ Внимание: Если в форме или отчете перечисление отображается как пустой список, проверьте:
      • Сохранена ли конфигурация после добавления перечисления.
      • Обновлена ли база данных (Конфигурация → Обновить конфигурацию базы данных).
      • Корректно ли указан тип значения в свойствах элемента формы (должен быть ПеречислениеСсылка.ИмяПеречисления).
      Процедура ПриОткрытии(Отказ)
      

      ЭлементыФормы.ВидДокумента.СписокВыбора.Очистить();

      ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(Перечисления.ВидыДокументов.Приходный);

      ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(Перечисления.ВидыДокументов.Внутренний);

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

      -->

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

      В модулях 1С перечисления доступны через глобальный объект Перечисления. Основные методы и свойства для работы с ними:

      Задача Пример кода Описание
      Получение значения по идентификатору Значение = Перечисления.ВидыДокументов.Приходный; Возвращает ссылку на значение перечисления
      Получение синонима (представления) Синоним = Перечисления.ВидыДокументов.Приходный.Представление(); Возвращает отображаемое имя значения
      Проверка равенства Если Вид = Перечисления.ВидыДокументов.Приходный Тогда Сравнивает значение перечисления с другим значением
      Перебор всех значений
      Для Каждого Знач Из Перечисления.ВидыДокументов Цикл
      

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

      КонецЦикла;

      Итерирует по всем значениям перечисления
      Получение значения по строковому представлению Значение = Перечисления.ВидыДокументов.Получить("Приходный"); Возвращает значение по его идентификатору (не синониму!)

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

      Процедура ПередЗаписью(Отказ)
      

      Если ВидДокумента = Неопределено Тогда

      Сообщить("Не указан вид документа!", СтатусСообщения.Важное);

      Отказ = Истина;

      ИначеЕсли ВидДокумента = Перечисления.ВидыДокументов.Приходный И Нomenклатура.Количество <= 0 Тогда

      Сообщить("Для приходного документа количество должно быть больше 0!", СтатусСообщения.Важное);

      Отказ = Истина;

      КонецЕсли;

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

      Например, следующий код вызовет ошибку:

      // НЕПРАВИЛЬНО!
      

      Если ВидДокумента = "Приходный" Тогда

      // Ошибка: нельзя сравнивать ПеречислениеСсылка со строкой

      КонецЕсли;

      Instead, always compare with the enumeration value directly:

      // ПРАВИЛЬНО
      

      Если ВидДокумента = Перечисления.ВидыДокументов.Приходный Тогда

      // Корректное сравнение

      КонецЕсли;

      💡

      При работе с перечислениями в коде всегда используйте прямые ссылки на значения (Перечисления.Имя.Значение). Избегайте сравнения со строками или числовыми кодами — это приводит к ошибкам и усложняет поддержку кода.

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

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

      • 🚫 Ошибка 1: Сравнение перечисления со строкой

        Как упоминалось ранее, нельзя сравнивать значение перечисления со строковым литералом. Всегда используйте прямые ссылки на значения.

        Решение: Замените Если Вид = "Приходный" на Если Вид = Перечисления.ВидыДокументов.Приходный.

      • 🚫 Ошибка 2: Изменение идентификаторов значений после начала использования

        Если вы измените идентификатор значения (например, с Приходный на Приход), весь код, где использовалось старое имя, перестанет работать.

        Решение: Перед изменением идентификаторов выполните поиск по всему коду (Ctrl+Shift+F) и замените все упоминания старого имени. Лучше добавлять новые значения, а не переименовывать старые.

      • 🚫 Ошибка 3: Использование перечислений для динамических данных

        Перечисления не предназначены для данных, которые часто меняются (например, список менеджеров или складов). Для этого лучше подходят справочники.

        Решение: Если список значений может пополняться пользователями, используйте справочник с предопределенными элементами.

      • 🚫 Ошибка 4: Забывают обновить базу данных после изменения перечисления

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

        Решение: После изменений в конфигураторе всегда выполняйте Конфигурация → Обновить конфигурацию базы данных.

      Еще одна типичная проблема — некорректное отображение синонимов в формах. Если вместо синонима отображается идентификатор (например, Приходный вместо Приходная накладная), проверьте:

      • Указан ли синоним для значения в конфигураторе.
      • Обновлена ли конфигурация базы данных.
      • Корректно ли настроено свойство Представление в элементе формы (должно быть Авто или явно указано Представление()).
      ⚠️ Внимание: Если вы удаляете значение из перечисления, которое уже используется в базе данных, это может привести к ошибкам при открытии документов или отчетов. Перед удалением проверьте, не ссылается ли на это значение какой-либо объект, с помощью запроса:
      ВЫБРАТЬ РАЗЛИЧНЫЕ ВидДокумента ИЗ Документ.ПриходнаяНакладная;

      Практические примеры использования перечислений

      Рассмотрим несколько реальных сценариев, где перечисления незаменимы:

      Пример 1: Статусы заказов в торговой системе

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

      • Новый (синоним: "Новый заказ")
      • ВРаботе (синоним: "В обработке")
      • Отгружен (синоним: "Отгружен со склада")
      • Закрыт (синоним: "Завершен")
      • Отменен (синоним: "Отменен клиентом")

      Код для изменения статуса заказа:

      Процедура ИзменитьСтатус(Заказ, НовыйСтатус)
      

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

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

      Сообщить("Нельзя отменить уже отгруженный заказ!", СтатусСообщения.Важное);

      Возврат;

      КонецЕсли;

      КонецЕсли;

      Заказ.Статус = НовыйСтатус;

      Заказ.Записать();

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

      Пример 2: Типы операций в бухгалтерии

      Перечисление ВидыОпераций может включать:

      • ПоступлениеДС (синоним: "Поступление денежных средств")
      • СписаниеДС (синоним: "Списание денежных средств")
      • ПеремещениеДС (синоним: "Перемещение между счетами")

      Использование в отчете для фильтрации:

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

      "ВЫБРАТЬ

      | Операция.Дата,

      | Операция.Сумма,

      | Операция.ВидОперации КАК ВидОперации

      |ИЗ

      | Документ.БанковскаяОперация КАК Операция

      |ГДЕ

      | Операция.ВидОперации = &ВидОперации";

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

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

      Пример 3: Категории клиентов в CRM

      Перечисление КатегорииКлиентов:

      • ФизЛицо (синоним: "Физическое лицо")
      • ЮрЛицо (синоним: "Юридическое лицо")
      • ИП (синоним: "Индивидуальный предприниматель")
      • ВИП (синоним: "VIP-клиент")

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

    Функция ПолучитьСкидку(Клиент)
    

    Если Клиент.Категория = Перечисления.КатегорииКлиентов.ВИП Тогда

    Возврат 0.15; // 15% скидка

    ИначеЕсли Клиент.Категория = Перечисления.КатегорииКлиентов.ЮрЛицо Тогда

    Возврат 0.05; // 5% скидка

    Иначе

    Возврат 0; // Без скидки

    КонецЕсли;

    КонецФункции

    Эти примеры демонстрируют, как перечисления помогают структурировать данные и упрощают логику программирования. Главное — правильно определить, где стоит использовать перечисление, а где лучше подойдет справочник.

    FAQ: Частые вопросы по работе с перечислениями в 1С

    Можно ли добавить значение в перечисление без обновления конфигурации?

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

    1. Редактирования в конфигураторе.
    2. Сохранения конфигурации (Ctrl+S).
    3. Обновления базы данных (Конфигурация → Обновить конфигурацию базы данных).

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

    Как получить числовой код значения перечисления?

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

    КодПриходного = Перечисления.ВидыДокументов.Приходный.Код();
    

    Сообщить(КодПриходного); // Выведет числовой идентификатор (например, 0)

    Однако не рекомендуется использовать числовые коды в логике программы, так как они могут измениться при реорганизации перечисления. Лучше всегда ссылаться на значения по идентификаторам.

    Можно ли сделать перечисление иерархическим?

    Нет, перечисления в 1С не поддерживают иерархию (в отличие от справочников). Если вам нужна вложенная структура (например, "Типы товаров → Одежда → Мужская"), используйте:

    • Справочник с иерархией.
    • Несколько перечислений (например, КатегорииТоваров и ПодкатегорииТоваров).

    Пример альтернативного решения с двумя перечислениями:

    // Перечисление КатегорииТоваров: Одежда, Обувь, Аксессуары
    

    // Перечисление ПодкатегорииОдежды: Мужская, Женская, Детская

    Если Категория = Перечисления.КатегорииТоваров.Одежда Тогда

    Подкатегория = Перечисления.ПодкатегорииОдежды.Мужская;

    КонецЕсли;

    Как экспортировать/импортировать перечисления между базами?

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

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

    Если нужно перенести только одно перечисление, можно:

    • Скопировать его вручную через конфигуратор.
    • Использовать расширения конфигурации (для 1С 8.3.14+), чтобы добавить перечисление без изменения основной конфигурации.
    Что будет, если удалить значение перечисления, которое используется в базе?

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

    • Ошибкам при открытии объектов, ссылающихся на удаленное значение.
    • Невозможности прочитать старые данные (если не сделано резервное копирование).

    Решение: Вместо удаления отметьте значение как ПомеченоНаУдаление (если это поддерживается) или добавьте новое значение с пометкой Устарело в синониме. Например:

    // Вместо удаления:
    

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

    Также перед удалением выполните запрос для поиска ссылок:

    ВЫБРАТЬ РАЗЛИЧНЫЕ Статус ИЗ Документ.Заказ;