Разработка и Конфигурация · 13 мин
Как работает модуль менеджера в 1С
Что такое модуль менеджера в 1С, как он работает, чем отличается от модуля объекта и общего модуля, где размещать код и каких ошибок избегать.
Модуль менеджера — один из программных модулей конфигурации 1С:Предприятие, который привязан к конкретному прикладному объекту: справочнику, документу, регистру, плану счетов и другим. Его главное назначение — хранить процедуры и функции, которые работают с объектом «в целом», а не с отдельной его записью. Платформа создаёт этот модуль автоматически для каждого объекта метаданных, даже если разработчик не написал в нём ни строчки.
Ключевая особенность модуля менеджера в том, что его код выполняется в контексте менеджера объекта — программной сущности, через которую осуществляется доступ к коллекции данных целиком. Например, через менеджер справочника «Номенклатура» можно найти элемент по коду, создать новый элемент или получить ссылку, не открывая сам объект. Поэтому в модуль менеджера выносят логику поиска, создания, пакетной обработки и формирования представлений.
Разработчики часто путают модуль менеджера с модулем объекта и общими модулями, из-за чего код оказывается не там, где должен, а конфигурация замедляется и усложняется в поддержке. Ниже разобрано устройство модуля менеджера, его отличия от других модулей, типовые сценарии использования и границы разумного применения.
Что такое модуль менеджера и где он находится
Открыть модуль менеджера можно в конфигураторе: выделите нужный объект в дереве конфигурации (например, справочник или документ), нажмите правой кнопкой мыши и выберите «Открыть модуль менеджера». Если такого пункта нет в контекстном меню, модуль доступен через команду «Модули» на панели действий окна редактирования объекта.
Платформа формирует для каждого объекта метаданных менеджер — программный объект, доступный в коде через коллекции глобального контекста: Справочники, Документы, РегистрыСведений, ПланыСчетов и другие. Когда вы пишете Справочники.Контрагенты.НайтиПоКоду("0001"), вы обращаетесь именно к менеджеру. Процедуры и функции, объявленные в модуле менеджера с ключевым словом Экспорт, становятся методами этого менеджера и вызываются так же — через точку после имени объекта.
Важно понимать: модуль менеджера существует всегда, даже пустой. Платформа использует его для служебных целей — например, именно в нём располагаются обработчики получения данных представления объекта, полей представления и обработки получения формы. Если переопределить эти обработчики, можно управлять тем, как объект отображается в списках и какая форма открывается по умолчанию.
Чем модуль менеджера отличается от модуля объекта и общего модуля
Модуль объекта выполняется в контексте конкретной записи данных: конкретного документа, конкретного элемента справочника. В нём доступны реквизиты объекта через ЭтотОбъект, и именно там размещают обработчики проведения, заполнения, проверки заполнения. Модуль менеджера, напротив, не привязан к конкретной записи — у него нет доступа к реквизитам какого-то одного элемента.
Общие модули не привязаны к объектам вовсе и служат для универсальной логики, общей для всей конфигурации. Разница в вызове: функция из общего модуля вызывается по имени модуля (ОбщегоНазначения.ЗначениеРеквизитаОбъекта(...)), а функция модуля менеджера — через менеджер конкретного объекта.
| Критерий | Модуль менеджера | Модуль объекта | Общий модуль |
|---|---|---|---|
| Привязка | К типу объекта целиком | К конкретной записи данных | Нет привязки |
| Доступ к реквизитам записи | Нет | Да, через ЭтотОбъект | Нет |
| Типичное содержимое | Поиск, создание, печать, обработчики представления | Проведение, заполнение, проверка | Универсальные алгоритмы |
| Способ вызова | Документы.Заказ.МояФункция() | Вызывается платформой | ИмяМодуля.МояФункция() |
Где разместить код
Подходит для операций над коллекцией: поиск дублей, пакетное создание, формирование печатной формы по массиву ссылок. Ограничение — нет доступа к данным конкретной записи без её чтения.
Подходит для логики одной записи: проведение, обработка заполнения, контроль остатков при записи. Нельзя вызывать его методы извне без создания объекта.
Подходит для логики, не зависящей от типа объекта: работа со строками, файлами, обменами. Неуместен для специфичных операций одного справочника.
Что размещают в модуле менеджера: типовые сценарии
Наиболее частый сценарий — формирование печатных форм. В типовых конфигурациях процедура Печать и функции подготовки данных для макета размещаются именно в модуле менеджера документа. Это логично: печать может запускаться для массива ссылок из списка документов, когда ни один объект не открыт.
Второй сценарий — поиск и создание элементов. Например, функция НайтиИлиСоздатьКонтрагента(ИНН, Наименование) в модуле менеджера справочника «Контрагенты» инкапсулирует логику поиска по ИНН и создания нового элемента при его отсутствии. Весь остальной код конфигурации вызывает эту функцию, не дублируя запросы.
Третий сценарий — переопределение стандартных обработчиков: ОбработкаПолученияПредставления, ОбработкаПолученияПолейПредставления, ОбработкаПолученияФормы. С их помощью можно изменить, как объект отображается в списках (например, добавить к наименованию артикул), или подменить открываемую форму в зависимости от условий.
Пример экспортной функции
Ниже — типовой пример функции, размещённой в модуле менеджера справочника. Обратите внимание на директиву компиляции и ключевое слово Экспорт — без него функция не будет доступна извне.
Функция НайтиПоИНН(ИНН) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", ИНН);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат ПустаяСсылка();
КонецФункции
Вызов такой функции из любого места конфигурации выглядит как Справочники.Контрагенты.НайтиПоИНН("7701234567"). Обратите внимание: внутри модуля менеджера доступны методы самого менеджера — ПустаяСсылка(), НайтиПоКоду(), СоздатьЭлемент() — без указания имени справочника.
Контекст выполнения и директивы компиляции
Модуль менеджера компилируется на сервере. Это принципиально: в нём нельзя использовать клиентские вызовы — предупреждения, диалоги открытия файлов, методы глобального контекста, доступные только на клиенте. Если попытаться вызвать Предупреждение() из модуля менеджера, при проверке конфигурации или в момент выполнения возникнет ошибка.
Процедуры и функции модуля менеджера не требуют директив компиляции &НаСервере — контекст сервера подразумевается по умолчанию. Вызов из клиентского кода (например, из модуля формы с директивой &НаКлиенте) происходит как серверный вызов, что влечёт накладные расходы: сериализацию параметров и передачу данных между клиентом и сервером.
Ещё одно ограничение — модуль менеджера недоступен в тонком и веб-клиенте как самостоятельный контекст: весь его код исполняется на сервере. При работе в файловом варианте различие менее заметно, но в клиент-серверном режиме каждый вызов — это обращение к серверу, поэтому массовые вызовы в цикле из клиентского кода следует заменять одним серверным вызовом, обрабатывающим массив данных целиком.
Как добавить свою процедуру: порядок действий
- 1Откройте конфигуратор и найдите нужный объект в дереве конфигурации — например, документ «РеализацияТоваров».
- 2Правой кнопкой откройте контекстное меню и выберите «Открыть модуль менеджера».
- 3Добавьте процедуру или функцию с ключевым словом Экспорт, если она должна вызываться извне.
- 4Проверьте, что в коде нет клиентских вызовов: предупреждений, диалогов, обращений к интерфейсу.
- 5Обновите конфигурацию базы данных (F7) и вызовите метод через менеджер объекта: Документы.РеализацияТоваров.ВашаФункция(Параметры).
- 6Проверьте результат на тестовой копии базы, включая вызов из тонкого клиента, если он используется.
Перед изменением типовой конфигурации убедитесь, что понимаете механизм поддержки: прямая правка модуля менеджера типового объекта снимает его с полной поддержки и усложняет обновления. Если конфигурация поддерживает расширения, безопаснее вынести дополнительную логику в расширение, где можно дополнить модуль менеджера собственными методами через аннотации &После, &Вместо или добавить новые процедуры.
Производительность и типичные ошибки
Главная ошибка производительности — вызов серверных функций модуля менеджера в цикле из клиентского кода. Сто итераций означают сто серверных вызовов. Правильный подход: передать в функцию массив ссылок одним вызовом и выполнить всю обработку на сервере, включая запросы к данным.
Вторая распространённая проблема — тяжёлые запросы в обработчиках получения представления. Эти обработчики вызываются платформой при каждом отображении ссылки в списке, табличной части или поле ввода. Запрос к базе данных внутри такого обработчика умножается на количество видимых строк и способен заметно замедлить интерфейс. Если представление требует данных из базы, кешируйте результат или пересмотрите подход.
Как проверить, что всё работает правильно
После внесения изменений проверьте три вещи: конфигурация обновляется без ошибок, новый метод вызывается и возвращает ожидаемый результат, интерфейс не замедлился. Для отладки серверного кода включите в конфигураторе отладку по протоколу HTTP или используйте отладку на сервере — точки останова в модуле менеджера сработают только при активном подключении к серверному контексту.
Как проверить результат
Метод доступен через менеджер объекта, возвращает значение ожидаемого типа
Ошибка «Метод объекта не обнаружен» — забыто ключевое слово Экспорт или не обновлена конфигурация БД
Вызов выполняется, данные корректны
Ошибка сериализации — в параметрах или возврате используется объект вместо ссылки
Список открывается без видимой задержки
Замедление после правки обработчиков представления — внутри есть запросы к базе
Изменения в расширении, обновление проходит штатно
Объект снят с поддержки, при обновлении возникают конфликты
Для диагностики замедлений используйте замер производительности в конфигураторе: он покажет, сколько раз вызывался каждый метод и сколько времени заняло его выполнение. Если обработчик получения представления фигурирует в замере с большим количеством вызовов — это прямой сигнал перенести логику.
Удобный критерий выбора места для кода: если в теле функции пришлось писать «ПолучитьОбъект()» для каждой переданной ссылки — скорее всего, логика относится к модулю объекта и вызывается неправильно. Если функция оперирует только ссылками, запросами и созданием новых записей — она на своём месте в модуле менеджера.
Ответы на частые вопросы
Можно ли вызвать функцию модуля менеджера из модуля формы?
Да, но вызов будет серверным. Из процедуры с директивой &НаСервере обращайтесь напрямую: Справочники.Номенклатура.МояФункция(). Из клиентской процедуры формы вызов тоже возможен, однако каждый такой вызов — это обращение к серверу, поэтому в циклах его использовать нельзя; группируйте данные и передавайте массивом за один вызов.
Почему метод не виден, хотя он написан в модуле менеджера?
Чаще всего причина в отсутствии ключевого слова Экспорт после объявления процедуры или функции — без него метод доступен только внутри самого модуля. Вторая причина — конфигурация базы данных не обновлена: изменения модуля применяются только после обновления (F7 в конфигураторе).
Чем модуль менеджера отличается от модуля набора записей регистра?
Модуль набора записей регистра — аналог модуля объекта: он работает с конкретным набором записей при его записи (обработчики ПередЗаписью, ПриЗаписи). Модуль менеджера регистра работает с регистром как с коллекцией: создание наборов, получение срезов, блокировки, пакетная обработка данных.
Можно ли использовать модуль менеджера в расширении конфигурации?
Да, расширения позволяют дополнять модуль менеджера заимствованного объекта: можно перехватывать существующие методы аннотациями &Перед, &После, &Вместо и добавлять собственные процедуры и функции. Это предпочтительный способ доработки типовых конфигураций, так как основной модуль остаётся на поддержке.
Где правильно разместить код печатной формы документа?
Стандартное место — модуль менеджера документа: процедура формирования табличного документа получает массив ссылок, выполняет запросы и заполняет макет. Это позволяет печатать документы прямо из списка без открытия формы. Управление командой печати (добавление в подменю) в типовых конфигурациях выполняется отдельно — через механизм подключаемых команд.
Что важно запомнить
Модуль менеджера хранит серверный код, работающий с объектом как с коллекцией: поиск, создание, печать, представления. Его методы вызываются через менеджер объекта и требуют слова Экспорт. Не размещайте в нём клиентские вызовы и тяжёлые запросы в обработчиках представления, а типовые конфигурации дорабатывайте через расширения.