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