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