Зачем нужен модуль менеджера перечисления и как его использовать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Назначение модуля менеджера перечисления

Модуль менеджера предназначен для управления объектом метаданных как целым. Если модуль объекта (которого у перечисления нет) отвечает за конкретный экземпляр данных, то модуль менеджера позволяет переопределить стандартное поведение платформы при обращении к типу. В случае с перечислением это дает возможность превратить обычный список констант в «умный» объект, который сам знает, как себя показать пользователю и какие значения доступны для выбора в зависимости от контекста.

Рассмотрим подробнее основные сценарии использования модуля менеджера.

Программное управление представлением

Часто возникает ситуация, когда синоним значения перечисления, заданный в конфигураторе, не подходит для всех случаев жизни. Например, значение Оплачено в одном документе должно выглядеть как «Полная оплата», а в другом — как «Взаимозачет завершен». Вместо того чтобы создавать разные перечисления, мы можем использовать событие ОбработкаПолученияПредставления.

Проанализируем пример реализации в модуле менеджера:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Если Данные.Ссылка = Перечисления.СтатусыЗаказов.ВРаботе Тогда
        Представление = "Выполняется специалистом";
    ИначеЕсли Данные.Ссылка = Перечисления.СтатусыЗаказов.Завершен Тогда
        Представление = "Полностью готов";
    КонецЕсли;

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

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

Динамическая фильтрация списка выбора

Одной из самых полезных функций модуля менеджера является обработчик ОбработкаПолученияДанныхВыбора. Представьте ситуацию: у вас есть перечисление СпособыОплаты с 10 значениями. Но в документе «Реализация» пользователю должны быть доступны только 3 из них, а в документе «Возврат» — другие 5. Раньше разработчикам приходилось программно заполнять списки выбора на форме. Теперь эту логику можно инкапсулировать прямо в перечислении.

Разберем, как это работает:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если передан специальный параметр отбора
    Если Параметры.Свойство("ТолькоАктивныеСтатусы") Тогда
        СтандартнаяОбработка = Ложь;
        ДанныеВыбора = Новый СписокЗначений;
        ДанныеВыбора.Добавить(Перечисления.Статусы.Новый);
        ДанныеВыбора.Добавить(Перечисления.Статусы.ВРаботе);
    КонецЕсли;

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

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

Инкапсуляция бизнес-логики (Методы менеджера)

Современный стандарт разработки 1С требует выносить логику, специфичную для конкретного объекта, в его модуль менеджера. Это избавляет конфигурацию от огромных общих модулей «на все случаи жизни». Для перечисления это означает создание экспортных функций, которые возвращают какие-либо свойства значений.

Посмотрим на пример создания программного интерфейса для перечисления:


// Возвращает истину, если статус является завершающим для бизнес-процесса
Функция ЭтоФинальныйСтатус(ЗначениеСтатуса) Экспорт
    
    Возврат ЗначениеСтатуса = Перечисления.СтатусыЗаказов.Завершен 
        Или ЗначениеСтатуса = Перечисления.СтатусыЗаказов.Отменен;
    
КонецФункции

// Возвращает цвет для оформления строки в списке
Функция ПолучитьЦветСтатуса(ЗначениеСтатуса) Экспорт
    
    Если ЗначениеСтатуса = Перечисления.СтатусыЗаказов.Ошибка Тогда
        Возврат ЦветаСтиля.ЦветОшибочногоСостояния;
    КонецЕсли;
    
    Возврат ЦветаСтиля.ЦветНормальногоСостояния;
    
КонецФункции

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

Взаимодействие с формами и печатными формами

Как отмечалось в обсуждении на форуме, для перечисления можно создать полноценную форму выбора или форму списка. Хотя это требуется редко, модуль менеджера позволяет управлять открытием этих форм через событие ОбработкаПолученияФормы. Это может понадобиться, если вы хотите заменить стандартное выпадающее меню выбора на сложную форму с подсказками, картинками или дополнительными описаниями каждого значения.

Также модуль менеджера активно используется при формировании печатных форм. В нем удобно размещать функции, которые преобразуют внутренние значения в официальные наименования для актов, счетов-фактур или договоров, особенно если эти наименования должны склоняться или зависеть от даты документа.

Интеграция с Библиотекой стандартных подсистем (БСП)

В типовых решениях (например, БП 3.0 или УНФ) модуль менеджера перечисления часто содержит специализированные функции для интеграции с подсистемами БСП, такими как:

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

Подводя итог, можно сказать, что модуль менеджера превращает перечисление из простого перечня строк в активный компонент системы. Использование его возможностей — это признак профессиональной разработки, обеспечивающий чистоту кода, легкость обновления и гибкость интерфейса.

← На главную