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