Разработка и Конфигурация · 12 мин
Модуль менеджера в 1С: назначение и практика использования
Модуль менеджера в 1С — что это, для чего нужен, чем отличается от модуля объекта. Примеры кода, типичные ошибки и практические рекомендации.
Модуль менеджера — это программный модуль, который существует у прикладных объектов конфигурации 1С (справочников, документов, регистров, планов счетов и других) и содержит процедуры и функции, работающие с объектом как с коллекцией, а не с конкретным экземпляром. Проще говоря, если модуль объекта отвечает за поведение одного конкретного элемента справочника или одного документа, то модуль менеджера описывает операции над типом в целом: поиск, создание, получение представлений, формирование печатных форм.
Найти модуль менеджера можно в конфигураторе: откройте дерево конфигурации, выделите нужный объект (например, справочник «Номенклатура»), нажмите правую кнопку мыши и выберите «Открыть модуль менеджера». Если пункт неактивен или модуль пуст — значит, разработчики конфигурации его не заполняли, но сам контейнер существует всегда.
Ключевая особенность модуля менеджера — он выполняется один раз на уровне типа, а не создается для каждого объекта. Это делает его правильным местом для общей логики: функций получения ссылок, обработчиков стандартных событий поиска и представления, команд печати. Размещение такого кода в модуле объекта — распространенная ошибка, которая приводит к дублированию логики и лишним серверным вызовам.
Чем модуль менеджера отличается от модуля объекта
Модуль объекта исполняется в контексте конкретного экземпляра: когда вы записываете документ, проводите его, заполняете табличную часть. Внутри модуля объекта доступны реквизиты объекта напрямую, есть события ПередЗаписью, ПриЗаписи, ОбработкаПроведения. Чтобы модуль объекта отработал, объект должен быть создан и инициализирован.
Модуль менеджера, напротив, не имеет доступа к данным конкретного экземпляра — у него нет «текущего объекта». Он вызывается через менеджер типа: Справочники.Контрагенты, Документы.РеализацияТоваровУслуг. Все процедуры и функции в нем работают на уровне всей коллекции. Поэтому там нет событий записи, но есть события, связанные с представлением, выбором и получением данных.
Сравнение модулей
Логика одного экземпляра: проверка заполнения, проведение, события записи. Требует создания объекта в памяти.
Логика типа в целом: поиск, создание ссылок, представления, печать. Работает без создания экземпляра.
Универсальные алгоритмы, не привязанные к конкретному типу. Подходит для сквозной логики, но не имеет доступа к событиям менеджера.
Какие задачи решает модуль менеджера
Основные сценарии, для которых предназначен модуль менеджера:
- Формирование представления объекта. Обработчики ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления позволяют изменить, как объект отображается в списках и полях ввода, не меняя данные.
- Настройка данных выбора. Обработчик ОбработкаПолученияДанныхВыбора управляет списком подбора в полях ввода: можно добавить отбор, показать дополнительные колонки, изменить порядок.
- Получение формы. Обработчик ОбработкаПолученияФормы определяет, какую форму открыть в той или иной ситуации.
- Печатные формы. В типовых конфигурациях процедуры формирования печатных форм (например, Печать или функции добавления команд печати) размещаются именно в модуле менеджера.
- Сервисные функции. Поиск элемента по реквизитам, создание нового элемента с заполнением по умолчанию, получение ссылки по уникальному идентификатору.
Важно понимать: экспортные процедуры и функции модуля менеджера доступны из любого места кода через менеджер объекта, но их вызов — это всегда серверный вызов. Из клиентского контекста обращаться к ним напрямую нельзя, только через серверные процедуры.
Примеры кода: как вызвать функции модуля менеджера
Типовой пример — функция поиска контрагента по ИНН, размещенная в модуле менеджера справочника «Контрагенты»:
// Модуль менеджера справочника "Контрагенты"
Функция НайтиПоИНН(ИНН) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", ИНН);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Результат.Выгрузить()[0].Ссылка;
КонецФункции
Вызов этой функции из любого другого модуля выглядит так:
КонтрагентСсылка = Справочники.Контрагенты.НайтиПоИНН("7707083893");
Если КонтрагентСсылка = Неопределено Тогда
// Элемент не найден — можно создать новый
КонецЕсли;
Обратите внимание: для вызова не потребовалось создавать объект справочника, открывать формы или инициализировать данные. Это и есть главное преимущество размещения логики в модуле менеджера — минимальные накладные расходы.
// Пример обработчика представления в модуле менеджера
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) Экспорт
СтандартнаяОбработка = Ложь;
Представление = Строка(Данные.Ссылка) + " (" + Данные.Код + ")";
КонецПроцедурыКогда код в модуле менеджера — ошибка
Не любую «общую» логику стоит помещать в модуль менеджера. Есть ситуации, где это неуместно или прямо вредно:
- Код не привязан к конкретному типу объекта — такие алгоритмы логичнее разместить в общем модуле, чтобы не дублировать их в менеджерах разных объектов.
- Нужен доступ к реквизитам конкретного экземпляра — в модуле менеджера их нет, придется передавать ссылку и делать запрос, что усложняет код.
- Логика должна выполняться на клиенте — модуль менеджера компилируется только на сервере, клиентские вызовы невозможны.
Еще одна граница: модуль менеджера не подходит для хранения состояния. Переменные модуля не сохраняют значения между вызовами в привычном смысле — полагаться на них как на кэш нельзя, для кэширования используются другие механизмы (общие модули с повторным использованием возвращаемых значений).
Как проверить, что код работает правильно
После размещения логики в модуле менеджера проверьте несколько контрольных точек. Во-первых, убедитесь, что процедура или функция объявлена с ключевым словом Экспорт — без него вызов через менеджер объекта завершится ошибкой «Метод объекта не обнаружен». Во-вторых, проверьте, что вызов происходит в серверном контексте: в толстом клиенте обычное приложение допускает больше вольностей, а в тонком и веб-клиенте — только через серверные вызовы.
Для отладки используйте конфигуратор: поставьте точку останова внутри функции модуля менеджера и запустите отладку предприятия. Если точка не срабатывает — проверьте, действительно ли код доходит до вызова, и не переопределен ли метод в расширении конфигурации.
Как проверить результат
Вызов Справочники.Имя.Метод() выполняется без ошибок
Ошибка «Метод объекта не обнаружен» — нет ключевого слова Экспорт
Метод вызывается из серверной процедуры
Ошибка при вызове из клиентского контекста
Обработчики представления и выбора срабатывают в полях ввода
Точка останова не срабатывает — обработчик не объявлен или переопределен в расширении
Типичные ошибки при работе с модулем менеджера
Разработчики, которые только начинают использовать модуль менеджера, чаще всего допускают одни и те же промахи. Знание их заранее экономит часы отладки.
Отдельно стоит упомянуть производительность. Если функция модуля менеджера вызывается в цикле (например, при обработке тысяч строк таблицы), каждый вызов через менеджер — это обращение к серверному контексту. В массовых операциях лучше собрать данные одним запросом, чем вызывать функцию поиска для каждой строки.
Модуль менеджера и расширения конфигурации
Если конфигурация типовая и находится на поддержке, прямая правка модуля менеджера — крайняя мера. Механизм расширений позволяет добавлять в модуль менеджера собственные процедуры и функции, а также переопределять существующие обработчики с помощью аннотаций &После, &Вместо, &Перед.
При переопределении обработчиков событий менеджера (например, ОбработкаПолученияДанныхВыбора) важно помнить о порядке вызова: если несколько расширений изменяют один и тот же обработчик, результат зависит от порядка их применения, что может давать неочевидное поведение. После подключения расширения обязательно проверьте работу в режиме предприятия, а не только синтаксический контроль в конфигураторе.
Куда поместить код
Итоговые рекомендации
Модуль менеджера — правильное место для кода, который оперирует типом объекта, а не конкретным экземпляром: поиск и создание ссылок, представления в списках, настройка данных выбора, печатные формы. Его вызов не требует создания объекта, что делает такие операции легче и быстрее.
Главные правила безопасной работы: объявляйте методы с Экспорт, не обращайтесь к реквизитам экземпляра, помните о серверном контексте, а типовые конфигурации дорабатывайте через расширения. Перед любыми изменениями кода делайте резервную копию базы и тестируйте на копии, а не на рабочих данных.
Что важно запомнить
Модуль менеджера содержит код уровня типа объекта: поиск, создание, представления, выбор, печать. Он вызывается через менеджер (Справочники.Имя.Метод()), работает только на сервере и не имеет доступа к данным конкретного экземпляра. Для типовых конфигураций предпочтительны расширения вместо прямой правки.
Частые вопросы
Можно ли вызвать функцию модуля менеджера с клиента?
Напрямую — нет, модуль менеджера компилируется только на сервере. Из клиентской процедуры нужно вызвать серверную процедуру общего модуля (с флагами «Сервер» и «Вызов сервера»), которая уже обратится к менеджеру объекта и вернет результат.
Чем модуль менеджера отличается от общего модуля?
Модуль менеджера привязан к конкретному типу объекта и может содержать предопределенные обработчики событий (представление, выбор, получение формы). Общий модуль не привязан к типу и не имеет таких событий, но зато его методы доступны без указания конкретного объекта.
Почему возникает ошибка «Метод объекта не обнаружен»?
Чаще всего процедура или функция в модуле менеджера объявлена без ключевого слова Экспорт, либо имя метода написано с опечаткой. Реже причина в том, что метод переопределен в расширении конфигурации или кэш метаданных устарел — помогает перезапуск сеанса.
Где в типовых конфигурациях находится код печатных форм?
В большинстве типовых решений процедуры формирования печатных форм размещаются в модуле менеджера соответствующего документа, а регистрация команд печати выполняется через механизм подсистемы «Печать» библиотеки стандартных подсистем.
Можно ли хранить данные в переменных модуля менеджера?
Технически переменные объявить можно, но полагаться на сохранность их значений между вызовами нельзя — поведение зависит от контекста исполнения. Для кэширования используйте общие модули с повторным использованием возвращаемых значений.
Как доработать модуль менеджера, не снимая конфигурацию с поддержки?
Создайте расширение конфигурации, добавьте в него нужный объект и его модуль менеджера. Новые экспортные методы можно писать свободно, а существующие обработчики переопределяйте аннотациями &Вместо, &После или &Перед, сохраняя вызов исходной процедуры там, где это необходимо.