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

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

Как работает модуль менеджера в 1С

Что такое модуль менеджера в 1С, как он работает, чем отличается от модуля объекта и общего модуля, где размещать код и каких ошибок избегать.

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

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

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

Что такое модуль менеджера и где он находится

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

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

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

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

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

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

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

Где разместить код

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

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

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

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

Общий модуль

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

Что размещают в модуле менеджера: типовые сценарии

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

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

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

Пример экспортной функции

Ниже — типовой пример функции, размещённой в модуле менеджера справочника. Обратите внимание на директиву компиляции и ключевое слово Экспорт — без него функция не будет доступна извне.

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

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат ПустаяСсылка();

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

Вызов такой функции из любого места конфигурации выглядит как Справочники.Контрагенты.НайтиПоИНН("7701234567"). Обратите внимание: внутри модуля менеджера доступны методы самого менеджера — ПустаяСсылка(), НайтиПоКоду(), СоздатьЭлемент() — без указания имени справочника.

Контекст выполнения и директивы компиляции

Модуль менеджера компилируется на сервере. Это принципиально: в нём нельзя использовать клиентские вызовы — предупреждения, диалоги открытия файлов, методы глобального контекста, доступные только на клиенте. Если попытаться вызвать Предупреждение() из модуля менеджера, при проверке конфигурации или в момент выполнения возникнет ошибка.

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

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

Как добавить свою процедуру: порядок действий

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный объект в дереве конфигурации — например, документ «РеализацияТоваров».
  2. 2
    Правой кнопкой откройте контекстное меню и выберите «Открыть модуль менеджера».
  3. 3
    Добавьте процедуру или функцию с ключевым словом Экспорт, если она должна вызываться извне.
  4. 4
    Проверьте, что в коде нет клиентских вызовов: предупреждений, диалогов, обращений к интерфейсу.
  5. 5
    Обновите конфигурацию базы данных (F7) и вызовите метод через менеджер объекта: Документы.РеализацияТоваров.ВашаФункция(Параметры).
  6. 6
    Проверьте результат на тестовой копии базы, включая вызов из тонкого клиента, если он используется.

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

Производительность и типичные ошибки

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

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

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

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

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

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

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

Вызов экспортной функции
Норма

Метод доступен через менеджер объекта, возвращает значение ожидаемого типа

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

Ошибка «Метод объекта не обнаружен» — забыто ключевое слово Экспорт или не обновлена конфигурация БД

Работа в тонком клиенте
Норма

Вызов выполняется, данные корректны

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

Ошибка сериализации — в параметрах или возврате используется объект вместо ссылки

Скорость открытия списков
Норма

Список открывается без видимой задержки

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

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

Обновление типовой конфигурации
Норма

Изменения в расширении, обновление проходит штатно

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

Объект снят с поддержки, при обновлении возникают конфликты

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

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

Ответы на частые вопросы

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

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

Почему метод не виден, хотя он написан в модуле менеджера?

Чаще всего причина в отсутствии ключевого слова Экспорт после объявления процедуры или функции — без него метод доступен только внутри самого модуля. Вторая причина — конфигурация базы данных не обновлена: изменения модуля применяются только после обновления (F7 в конфигураторе).

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

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

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

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

Где правильно разместить код печатной формы документа?

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

Итог

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

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