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