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