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