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

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

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

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

Модуль менеджера — это модуль прикладного объекта (справочника, документа, регистра, плана счетов и т.д.), в котором размещают процедуры и функции, работающие с объектом в целом, а не с конкретным его экземпляром. Классический пример — функция печати, формирующая печатную форму для массива ссылок, или процедура заполнения объекта по умолчанию. Чтобы обратиться к коду модуля менеджера, используется менеджер объекта — программный объект, доступный через коллекции вида Справочники, Документы, РегистрыСведений и подобные.

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

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

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

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

Базовый синтаксис обращения к модулю менеджера

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

ДанныеПечати = Документы.РеализацияТоваровУслуг.ПолучитьДанныеПечати(МассивСсылок);

// Вызов процедуры из модуля менеджера справочника

Справочники.Номенклатура.ЗаполнитьРеквизитыПоУмолчанию(НовыйОбъект);

// Вызов функции из модуля менеджера регистра сведений

Цена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьЦену(Номенклатура, ТекущаяДата());

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

bsl
// Обращение к экспортной функции модуля менеджера справочника
Результат = Справочники.Контрагенты.ПолучитьРеквизиты(СсылкаНаКонтрагента);

// Обращение к процедуре модуля менеджера документа
Документы.СчетНаОплатуПокупателю.ДобавитьКомандыПечати(КомандыПечати);

Как сделать метод доступным для вызова

Если вы добавляете собственную процедуру или функцию в модуль менеджера, её нужно объявить с ключевым словом Экспорт. Без этого слова метод остаётся приватным и доступен только внутри самого модуля. Рекомендуемая структура модуля по стандартам разработки: сначала область #Область ПрограммныйИнтерфейс для экспортных методов, затем СлужебныйПрограммныйИнтерфейс для методов, вызываемых из других подсистем, и в конце СлужебныеПроцедурыИФункции для внутренней логики.

#Область ПрограммныйИнтерфейс

// Возвращает реквизиты контрагента по ссылке.

//

// Параметры:

// Ссылка - СправочникСсылка.Контрагенты

//

// Возвращаемое значение:

// Структура - ИНН, КПП, Наименование.

//

Функция ПолучитьРеквизиты(Ссылка) Экспорт

// ... реализация

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

#КонецОбласти

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

Отличия от модуля объекта и общих модулей

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

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

Где размещать код

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

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

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

Логика конкретного экземпляра: обработчики событий, проверка заполнения, проведение. Доступны реквизиты и табличные части.

Общий модуль

Логика, не привязанная к одному объекту: утилиты, работа с несколькими типами, переиспользуемые функции.

Типичные ошибки при обращении и их устранение

Самая распространённая ошибка — «Процедура или функция с указанным именем не определена». Причины: метод объявлен без Экспорт, опечатка в имени метода, либо вызов идёт из клиентского контекста, а модуль менеджера доступен только на сервере. Проверьте все три пункта по порядку.

Вторая частая проблема — попытка обратиться к реквизитам объекта внутри метода модуля менеджера, например написать Наименование = "Новое" без контекста. Такой код не скомпилируется или будет работать неправильно: реквизиты нужно получать через ссылку, переданную параметром.

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

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

Проверка результата после доработки

После добавления или изменения метода в модуле менеджера выполните проверку конфигурации (Конфигурация → Проверка конфигурации) с включённой проверкой логической целостности — она выявит обращения к несуществующим методам. Затем обновите конфигурацию базы данных и протестируйте вызов в режиме предприятия.

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

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

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

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

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

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

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

Вызов метода
Норма

Метод возвращает ожидаемое значение для тестовых данных

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

Исключение времени выполнения или пустой результат

Права пользователя
Норма

Вызов работает под пользователем с типовыми правами

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

Ошибка нарушения прав доступа у рядовых пользователей

Ограничения и безопасные границы доработки

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

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

Итог

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

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

Частые вопросы

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

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

Чем вызов через менеджер отличается от Ссылка.ПолучитьОбъект()?

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

Почему после добавления Экспорт метод всё равно не виден?

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

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

Да, если объект заимствован в расширение. Доступны как экспортные методы типового модуля менеджера, так и собственные методы, добавленные в модуль менеджера расширения. Обращение выполняется тем же синтаксисом через менеджер объекта.

Как найти, откуда вызывается метод модуля менеджера?

Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) с текстом вида «ИмяОбъекта.ИмяМетода» или просто по имени метода. В результатах будут показаны все места вызова, включая общие модули, формы и другие модули менеджеров.

Нужны ли параметры при вызове метода без параметров?

Если метод объявлен без параметров, вызывайте его с пустыми скобками: Справочники.Номенклатура.МойМетод(). Пропуск скобок допустим синтаксически, но со скобками код читается однозначнее и соответствует стандартам оформления.