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