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