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

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

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

Модуль менеджера в 1С: назначение, функции менеджера объекта, получение ссылок, печать и обработчики. Примеры кода и типичные ошибки разработчика.

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

Типичный сценарий: вам нужно написать функцию, которая по номенклатуре возвращает её цену, или процедуру, которая формирует печатную форму для любого документа реализации. Этот код не привязан к конкретному документу — он работает на уровне «всех документов этого вида». Именно для таких задач и существует модуль менеджера.

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

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

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

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

Чем модуль менеджера отличается от модуля объекта и общего модуля

Путаница между этими тремя модулями — самая частая проблема начинающих разработчиков. Различия принципиальны, и от правильного выбора зависит, будет ли код работать и насколько удобно его вызывать.

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

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

Основные задачи, которые решают в модуле менеджера

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

Вторая задача — формирование печатных форм. В типовых конфигурациях процедура Печать и функции получения макета размещаются именно в модуле менеджера документа, потому что печать может выполняться для списка документов, а не только для открытого.

Третья группа задач — предопределённые обработчики платформы. В модуле менеджера можно определить ОбработкаПолученияПредставления (как объект отображается в списках и полях ввода), ОбработкаПолученияПолейПредставления, ОбработкаПолученияДанныхВыбора (например, ограничить подбор в поле ввода) и ОбработкаПолученияФормы (подменить форму по умолчанию).

Пример: функция поиска контрагента

Функция НайтиПоИНН(ИНН) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Контрагенты.Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", ИНН);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат Справочники.Контрагенты.ПустаяСсылка();

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

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

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

Вызов выполняется через менеджер объекта: Справочники.Номенклатура.ПолучитьОсновнуюЕдиницу(Ссылка) или Документы.РеализацияТоваров.СформироватьПечатнуюФорму(МассивСсылок). Синтаксис единообразен для всех видов объектов: имя коллекции менеджеров, точка, имя объекта, точка, имя экспортного метода.

Если вызов нужен из формы (клиентского контекста), создайте в модуле формы серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста и вызовите метод менеджера из неё. Вариант «БезКонтекста» предпочтительнее: он не сериализует данные формы и работает быстрее.

Порядок действий
  1. 1
    Откройте объект в конфигураторе и создайте модуль менеджера через контекстное меню
  2. 2
    Напишите функцию или процедуру с ключевым словом Экспорт
  3. 3
    Проверьте модуль: Конфигурация — Проверка конфигурации
  4. 4
    Вызовите метод через менеджер: Справочники.Имя.Метод(Параметры)
  5. 5
    Убедитесь, что вызов происходит на сервере, а не в клиентском контексте

Типичные ошибки при работе с модулем менеджера

Первая ошибка — попытка обратиться к реквизитам объекта напрямую. В модуле менеджера нет ЭтотОбъект: если нужны данные конкретной записи, получите объект через Ссылка.ПолучитьОбъект() или прочитайте данные запросом. Массовое создание объектов через ПолучитьОбъект() ради пары реквизитов — антипаттерн, заметно замедляющий работу; используйте запрос.

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

Третья ошибка — игнорирование предопределённых обработчиков. Например, разработчик меняет представление объекта в десятке мест формирования строки вручную, хотя достаточно один раз определить ОбработкаПолученияПредставления в модуле менеджера.

Типичные ошибки
01
Попытка читать реквизиты текущей записи в модуле менеджера — ошибка компиляции, контекста объекта там нет
02
Пропуск слова Экспорт — метод недоступен извне, вызов падает с ошибкой
03
Вызов метода менеджера из клиентского кода формы — модуль менеджера исполняется только на сервере
04
Использование ПолучитьОбъект() в цикле вместо запроса — резкое падение производительности
05
Дублирование универсального кода в модулях менеджеров разных объектов вместо общего модуля

Ограничения и когда модуль менеджера не подходит

Модуль менеджера не компилируется на клиенте, поэтому весь интерактивный код (оповещения, диалоги, работа с формами) в нём невозможен. Для клиентской логики используются модули форм и общие клиентские модули.

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

Как проверить, что код в модуле менеджера работает правильно

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

Для предопределённых обработчиков проверка выполняется в пользовательском режиме: откройте список объектов (проверка представления), начните ввод в поле выбора (проверка ОбработкаПолученияДанныхВыбора), откройте объект (проверка ОбработкаПолученияФормы).

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

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

Вызов экспортной функции из внешнего кода
Норма

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

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

Ошибка «Процедура или функция не определена» — проверьте Экспорт и контекст сервера

Представление объекта в списке
Норма

Отображается формат, заданный в ОбработкаПолученияПредставления

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

Стандартное представление — обработчик не определён или содержит ошибку

Производительность функции поиска
Норма

Запрос по индексированному реквизиту выполняется быстро

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

Долгий поиск — нет индекса по полю поиска или используется перебор объектов

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

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

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

Есть ли модуль менеджера у регистров?

Да, у регистров сведений, накопления, бухгалтерии и расчёта модуль менеджера существует. Там размещают функции получения срезов, остатков и оборотов с дополнительной логикой, а также обработчики представления. У констант и последовательностей модуля менеджера нет.

Что лучше для печатной формы: модуль менеджера или общий модуль?

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

Почему метод модуля менеджера не виден в подсказке редактора кода?

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

Можно ли изменить модуль менеджера через расширение конфигурации?

Да, расширения позволяют дополнять модули менеджеров аннотациями &После, &Перед и &Вместо. Это предпочтительный способ доработки типовых конфигураций: расширение не затрагивается при обновлении, и конфликтов при установке обновлений не возникает.

Где разместить функцию, которая нужна и на клиенте, и на сервере?

В модуле менеджера такую функцию разместить нельзя — он исполняется только на сервере. Используйте общий модуль с установленными флагами «Клиент (управляемое приложение)» и «Сервер», а код, требующий серверных данных (запросы), вынесите в отдельный серверный вызов.

Итог

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

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