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

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

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

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

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

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

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

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

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

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

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

Что размещают в модуле менеджера

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

Характерные сценарии размещения кода:

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

Пример простой экспортной функции в модуле менеджера справочника:

Функция ПолучитьОсновнуюСтавкуНДС(Ссылка) Экспорт

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

Запрос.Текст = "ВЫБРАТЬ СтавкаНДС ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

Возврат Выборка.СтавкаНДС;

КонецЕсли;

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

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

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

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

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

МодульКонтекст исполненияТиповое содержимое
Модуль менеджераСервер, без экземпляра объектаПечать, получение данных по ссылке, создание, начальное заполнение
Модуль объектаСервер, в контексте конкретного экземпляраОбработкаПроведения, ПередЗаписью, ПриКопировании, ОбработкаЗаполнения
Модуль формыКлиент и сервер, в контексте формыОбработчики событий формы и элементов, интерактивная логика
Общий модульЗависит от флагов (сервер, клиент)Универсальные алгоритмы, не привязанные к конкретному объекту

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

Как вызываются процедуры модуля менеджера

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

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

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

При вызове с тонкого или веб-клиента помните о серверном контексте: прямой вызов из клиентского общего модуля невозможен, нужен либо серверный общий модуль-обёртка, либо вызов с сервера формы. В модуле формы для этого используют процедуры с директивой &НаСервере или &НаСервереБезКонтекста.

Ограничения и подводные камни

Главное ограничение — отсутствие контекста экземпляра. В модуле менеджера нельзя обратиться к реквизитам конкретного объекта напрямую, нельзя использовать ЭтотОбъект. Если нужно изменить данные элемента, придётся получать объект через ПолучитьОбъект() и записывать его — либо переносить логику в модуль объекта.

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

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

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

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

Расширения позволяют дорабатывать модули менеджера, не меняя саму конфигурацию. Для этого объект добавляется в расширение, а в заимствованном модуле менеджера объявляются процедуры-обработчики с аннотациями: &Перед("ИмяПроцедуры"), &После("ИмяПроцедуры") или &Вместо("ИмяПроцедуры"). Так можно дополнить типовую печать или функцию получения данных своей логикой.

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

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

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

Подходит для собственных (нетиповых) объектов или внутренних доработок базы, которую не планируется обновлять автоматически. Риск — конфликты при обновлении типовых решений.

Расширение конфигурации

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

Общий модуль

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

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

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

Затем проверьте вызов в режиме предприятия. Быстрый способ — внешняя обработка или консоль кода, где выполняется строка вида Результат = Справочники.Номенклатура.ПолучитьОсновнуюСтавкуНДС(ТестоваяСсылка); с выводом результата. Если функция не экспортная или имя не совпадает, ошибка появится сразу при выполнении.

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок в модуле менеджера

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

Ошибки «переменная не определена», «процедура не обнаружена» при проверке

Вызов извне
Норма

Вызов через менеджер объекта возвращает ожидаемое значение

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

Ошибка «Процедура или функция с указанным именем не определена» — проверьте Экспорт и имя

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

Вызов выполняется один раз и быстро, интерфейс не зависает

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

Задержки при каждом вызове — значит, вызовы идут с клиента по одному, нужен пакетный серверный вызов

Часто задаваемые вопросы

Можно ли обратиться к реквизитам объекта из модуля менеджера?

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

Почему моя процедура из модуля менеджера не видна при вызове?

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

Что лучше для печатной формы: модуль менеджера или модуль объекта?

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

Выполняется ли модуль менеджера на клиенте?

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

Что будет с моим кодом в модуле менеджера при обновлении типовой конфигурации?

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

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

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

Итог

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

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