К статье
Практический материал

Разработка и Конфигурация · 12 мин

Модуль менеджера в 1С: назначение и практика использования

Модуль менеджера в 1С — что это, для чего нужен, чем отличается от модуля объекта. Примеры кода, типичные ошибки и практические рекомендации.

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

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

Ключевая особенность модуля менеджера — он выполняется один раз на уровне типа, а не создается для каждого объекта. Это делает его правильным местом для общей логики: функций получения ссылок, обработчиков стандартных событий поиска и представления, команд печати. Размещение такого кода в модуле объекта — распространенная ошибка, которая приводит к дублированию логики и лишним серверным вызовам.

Чем модуль менеджера отличается от модуля объекта

Модуль объекта исполняется в контексте конкретного экземпляра: когда вы записываете документ, проводите его, заполняете табличную часть. Внутри модуля объекта доступны реквизиты объекта напрямую, есть события ПередЗаписью, ПриЗаписи, ОбработкаПроведения. Чтобы модуль объекта отработал, объект должен быть создан и инициализирован.

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

Сравнение модулей

Модуль объекта

Логика одного экземпляра: проверка заполнения, проведение, события записи. Требует создания объекта в памяти.

Модуль менеджера

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

Общий модуль

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

Какие задачи решает модуль менеджера

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

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

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

Примеры кода: как вызвать функции модуля менеджера

Типовой пример — функция поиска контрагента по ИНН, размещенная в модуле менеджера справочника «Контрагенты»:

// Модуль менеджера справочника "Контрагенты"

Функция НайтиПоИНН(ИНН) Экспорт

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1

| Контрагенты.Ссылка КАК Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", ИНН);

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

Если Результат.Пустой() Тогда

Возврат Неопределено;

КонецЕсли;

Возврат Результат.Выгрузить()[0].Ссылка;

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

Вызов этой функции из любого другого модуля выглядит так:

КонтрагентСсылка = Справочники.Контрагенты.НайтиПоИНН("7707083893");

Если КонтрагентСсылка = Неопределено Тогда

// Элемент не найден — можно создать новый

КонецЕсли;

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

bsl
// Пример обработчика представления в модуле менеджера
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) Экспорт
    СтандартнаяОбработка = Ложь;
    Представление = Строка(Данные.Ссылка) + " (" + Данные.Код + ")";
КонецПроцедуры

Когда код в модуле менеджера — ошибка

Не любую «общую» логику стоит помещать в модуль менеджера. Есть ситуации, где это неуместно или прямо вредно:

  • Код не привязан к конкретному типу объекта — такие алгоритмы логичнее разместить в общем модуле, чтобы не дублировать их в менеджерах разных объектов.
  • Нужен доступ к реквизитам конкретного экземпляра — в модуле менеджера их нет, придется передавать ссылку и делать запрос, что усложняет код.
  • Логика должна выполняться на клиенте — модуль менеджера компилируется только на сервере, клиентские вызовы невозможны.

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

Как проверить, что код работает правильно

После размещения логики в модуле менеджера проверьте несколько контрольных точек. Во-первых, убедитесь, что процедура или функция объявлена с ключевым словом Экспорт — без него вызов через менеджер объекта завершится ошибкой «Метод объекта не обнаружен». Во-вторых, проверьте, что вызов происходит в серверном контексте: в толстом клиенте обычное приложение допускает больше вольностей, а в тонком и веб-клиенте — только через серверные вызовы.

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

Контрольные точки

Как проверить результат

Доступность метода
Норма

Вызов Справочники.Имя.Метод() выполняется без ошибок

Тревожный признак

Ошибка «Метод объекта не обнаружен» — нет ключевого слова Экспорт

Контекст выполнения
Норма

Метод вызывается из серверной процедуры

Тревожный признак

Ошибка при вызове из клиентского контекста

Поведение в списках
Норма

Обработчики представления и выбора срабатывают в полях ввода

Тревожный признак

Точка останова не срабатывает — обработчик не объявлен или переопределен в расширении

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

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

Типичные ошибки
01
Забыто слово Экспорт — метод не виден снаружи, вызов падает с ошибкой
02
Попытка обратиться к реквизитам объекта напрямую — в модуле менеджера нет контекста экземпляра, доступны только параметры вызова
03
Размещение клиентских вызовов (Предупреждение, Вопрос) в модуле менеджера — модуль серверный, интерактивные вызовы запрещены
04
Дублирование одной и той же функции в модулях менеджера нескольких справочников вместо общего модуля
05
Использование переменных модуля для хранения данных между вызовами — значения не гарантированно сохраняются

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

Модуль менеджера и расширения конфигурации

Если конфигурация типовая и находится на поддержке, прямая правка модуля менеджера — крайняя мера. Механизм расширений позволяет добавлять в модуль менеджера собственные процедуры и функции, а также переопределять существующие обработчики с помощью аннотаций &После, &Вместо, &Перед.

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

Маршрут решения

Куда поместить код

Логика относится к одному конкретному документу или элементуИспользуйте модуль объекта
Нужны поиск, создание, представление, выбор или печать для типа в целомРазмещайте в модуле менеджера
Алгоритм универсален и не привязан к типу объектаСоздайте общий модуль
Конфигурация типовая на поддержкеДорабатывайте через расширение конфигурации

Итоговые рекомендации

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

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

Итог

Что важно запомнить

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

Частые вопросы

Можно ли вызвать функцию модуля менеджера с клиента?

Напрямую — нет, модуль менеджера компилируется только на сервере. Из клиентской процедуры нужно вызвать серверную процедуру общего модуля (с флагами «Сервер» и «Вызов сервера»), которая уже обратится к менеджеру объекта и вернет результат.

Чем модуль менеджера отличается от общего модуля?

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

Почему возникает ошибка «Метод объекта не обнаружен»?

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

Где в типовых конфигурациях находится код печатных форм?

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

Можно ли хранить данные в переменных модуля менеджера?

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

Как доработать модуль менеджера, не снимая конфигурацию с поддержки?

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