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