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

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

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

Зачем нужен модуль менеджера в 1С: где он находится, какие процедуры в нём размещают, как получить менеджер объекта и чем он отличается от модуля объекта.

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

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

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

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

В конфигураторе модуль менеджера доступен из окна редактирования объекта: откройте, например, справочник «Номенклатура», перейдите на вкладку «Прочее» → «Модули» → «Модуль менеджера». Либо через контекстное меню объекта в дереве конфигурации: «Открыть модуль менеджера».

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

Что размещают в модуле менеджера

Стандартно в модуле менеджера размещают следующие категории кода:

  • Создание и заполнение. Функции вида СоздатьЭлемент() с предустановленными реквизитами, обработка ОбработкаПолученияДанныхВыбора — автоподбор при вводе по строке.
  • Поиск. Функции НайтиПоКоду(), НайтиПоРеквизиту(), собственные функции поиска по ИНН, штрихкоду, наименованию.
  • Представления. Обработчики ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления — как объект отображается в списках и ссылочных полях.
  • Печать. Процедуры ДобавитьКомандыПечати и Печать — интерфейс подсистемы печати БСП.
  • Обновление и обмен. Обработчики отложенного обновления данных, регистрации изменений для обмена.
  • Формы по умолчанию. Обработчик ОбработкаПолученияФормы — какую форму открывать в зависимости от условий.

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

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

Доступ к менеджеру объекта в коде выполняется через свойства глобального контекста: Справочники, Документы, РегистрыСведений и т.д. Экспортная функция модуля менеджера вызывается как метод менеджера:

// В модуле менеджера справочника "Контрагенты"

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

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Контрагенты КАК Т ГДЕ Т.ИНН = &ИНН";

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

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

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

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

КонецЕсли;

Возврат Неопределено;

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

// Вызов из любого другого модуля

НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоИНН("7701234567");

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

bsl
Менеджер = Справочники.Номенклатура; // менеджер объекта
НовыйЭлемент = Менеджер.СоздатьЭлемент();
СсылкаПоКоду = Менеджер.НайтиПоКоду("000000001");

Модуль менеджера против модуля объекта и общего модуля

Частый вопрос — куда поместить новую функцию. Выбор определяется контекстом выполнения и областью переиспользования кода.

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

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

Куда поместить код

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

Операции над типом: поиск, создание, печать, обработчики БСП. Ограничение — только сервер, нет доступа к данным конкретного объекта.

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

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

Общий модуль

Алгоритмы, общие для нескольких типов объектов. Ограничение — избыточная связанность при злоупотреблении.

Типовые сценарии использования

Печатные формы через БСП

В конфигурациях на БСП модуль менеджера — обязательная точка интеграции с подсистемой «Печать». Процедура ДобавитьКомандыПечати регистрирует команды, а Печать формирует табличный документ. Без этих процедур кнопка «Печать» в форме документа не покажет вашу форму.

Автоподбор и представление в полях ввода

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

Отложенное обновление данных

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

Как добавить свою функцию в модуль менеджера
  1. 1
    Откройте конфигуратор, найдите объект в дереве конфигурации
  2. 2
    Через контекстное меню откройте «Открыть модуль менеджера»
  3. 3
    Добавьте функцию с ключевым словом Экспорт
  4. 4
    Проверьте синтаксис (Ctrl+F7) и обновите конфигурацию базы данных
  5. 5
    Вызовите функцию через менеджер: Справочники.Имя.ВашаФункция() и проверьте результат

Ограничения и частые ошибки

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

Вторая распространённая ошибка — размещение в модуле менеджера кода, который должен работать на клиенте. Модуль компилируется только на сервере, поэтому директивы &НаКлиенте в нём бессмысленны, а попытка вызвать клиентский контекст приведёт к ошибке. Для клиентской логики используйте общие модули с признаком «Клиент».

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

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

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

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

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

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

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

Объявление функции
Норма

Функция объявлена с Экспорт и вызывается через менеджер

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

Ошибка «Метод объекта не обнаружен» при вызове

Контекст выполнения
Норма

Код использует запросы и менеджеры, работает на сервере

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

Попытка использовать клиентские объекты или формы

Производительность
Норма

Один запрос на пакет данных, нет ПолучитьОбъект() в цикле

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

Запросы или получение объектов внутри цикла

Часто задаваемые вопросы

Чем модуль менеджера отличается от модуля объекта простыми словами?

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

Почему моя функция из модуля менеджера не видна при вызове?

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

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

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

Как изменить модуль менеджера в типовой конфигурации, не теряя поддержку?

Используйте расширение конфигурации: в расширении можно добавить свой модуль менеджера для заимствованного объекта и переопределить или дополнить процедуры типового. Это сохраняет возможность автоматического обновления основной конфигурации.

Где искать обработчики печати документа в типовой конфигурации?

В модуле менеджера соответствующего документа: процедуры ДобавитьКомандыПечати и Печать. Если конфигурация использует БСП, именно эти процедуры подключают макеты к кнопке «Печать» в форме документа.

Что выбрать для новой функции: модуль менеджера или общий модуль?

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

Итог

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

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