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

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

Как обратиться к функции в модуле менеджера в 1С

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

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

Обращение к функции модуля менеджера выполняется через менеджер объекта — глобальную коллекцию вида Справочники, Документы, РегистрыСведений. Синтаксис выглядит как Документы.РеализацияТоваровУслуг.ИмяФункции(Параметры). При этом функция обязательно должна быть объявлена с ключевым словом Экспорт, иначе вызов завершится ошибкой «Метод объекта не обнаружен».

Ниже разобраны синтаксис вызова, правила объявления функций, отличия модуля менеджера от модуля объекта и общего модуля, а также типичные ошибки, из-за которых вызов не срабатывает.

Что такое модуль менеджера и когда его использовать

Модуль менеджера создаётся автоматически у каждого прикладного объекта конфигурации и изначально пуст. Открыть его можно в конфигураторе: выделите объект (например, справочник «Номенклатура»), нажмите правую кнопку мыши и выберите «Открыть модуль менеджера». Если пункта нет в контекстном меню, найдите модуль через дерево объекта или комбинацию Ctrl+O с фильтром по имени.

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

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

Синтаксис вызова функции из модуля менеджера

Обращение строится по шаблону: коллекция менеджеров → имя объекта → имя функции. Для справочника это выглядит так:

Результат = Справочники.Номенклатура.ПолучитьСтавкуНДС(ТекущаяДатаСеанса());

Для документа, регистра сведений или плана видов характеристик синтаксис аналогичен, меняется только глобальная коллекция:

МассивДублей = Документы.ПоступлениеТоваровУслуг.НайтиДублиПоНомеру(НомерВходящего, ДатаВходящего);

Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);

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

bsl
// В модуле менеджера справочника Номенклатура
Функция ПолучитьСтавкуНДС(НаДату) Экспорт
    // логика получения ставки
    Возврат Перечисления.СтавкиНДС.НДС20;
КонецФункции

// Вызов из любого серверного контекста
Ставка = Справочники.Номенклатура.ПолучитьСтавкуНДС(ТекущаяДатаСеанса());

Как правильно объявить функцию в модуле менеджера

Функция, доступная для внешнего вызова, объявляется с ключевым словом Экспорт после списка параметров. Без него функция остаётся локальной для модуля менеджера, и любой вызов извне приведёт к ошибке «Метод объекта не обнаружен» — это самая частая причина, почему «не видит» функцию.

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Штрихкод = &Штрихкод";

Запрос.УстановитьПараметр("Штрихкод", Штрихкод);

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

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

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

КонецЕсли;

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

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

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

Чем модуль менеджера отличается от модуля объекта и общего модуля

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

Модуль менеджера, напротив, не требует создания объекта и потому работает быстрее — не происходит чтения данных из базы. Общий модуль вообще не привязан к типу объекта и вызывается просто по имени: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Код").

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

Куда поместить функцию

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

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

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

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

Общий модуль

Логика универсальна для разных типов объектов. Обязательно продумайте флаги Сервер/Вызов сервера/Клиент, иначе вызовы будут недоступны из нужных контекстов.

Пошаговая инструкция: от создания функции до вызова

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

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

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

Типичные ошибки при обращении к модулю менеджера

Большинство проблем сводится к нескольким повторяющимся причинам. Ошибка «Метод объекта не обнаружен» почти всегда означает, что функция объявлена без Экспорт, опечатка в имени или вызов идёт не через ту коллекцию менеджеров (например, Справочники вместо Документы).

Вторая группа ошибок — попытка использовать контекст объекта внутри модуля менеджера. Обращение к реквизиту напрямую или вызов ЭтотОбъект.Записать() приведёт к ошибке компиляции или выполнения. Третья группа — вызов серверного кода с клиента: модуль менеджера недоступен в директиве &НаКлиенте.

Типичные ошибки
01
Забыли слово Экспорт — вызов падает с «Метод объекта не обнаружен», хотя функция написана верно.
02
Обращение к реквизитам объекта внутри модуля менеджера — контекста экземпляра нет, код не скомпилируется или упадёт в рантайме.
03
Вызов из клиентской процедуры формы — модуль менеджера доступен только на сервере; нужен вызов через &НаСервере.
04
Путаница менеджера и объекта: Справочники.Номенклатура.Функция() против Ссылка.ПолучитьОбъект().Функция() — это разные модули с разными функциями.
05
Изменили код модуля, но не сохранили конфигурацию — в режиме предприятия выполняется старая версия.

Как проверить, что вызов работает корректно

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

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

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

Точка останова внутри функции модуля менеджера
Норма

Отладчик останавливается при вызове

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

Точка не срабатывает — проверьте Экспорт, имя функции и коллекцию менеджеров

Параметры в табло переменных
Норма

Значения соответствуют переданным из места вызова

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

Неопределено или неверный тип — ошибка в вызывающем коде

Возвращаемое значение
Норма

Тип и содержимое совпадают с ожиданиями (ссылка, массив, структура)

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

Неопределено там, где ожидалось значение — проверьте все ветки Возврат в функции

Отдельно проверьте поведение функции на граничных данных: пустой параметр, несуществующая ссылка, отсутствие записей в запросе. Функция модуля менеджера часто вызывается из множества мест, и необработанный случай «ничего не найдено» рано или поздно приведёт к ошибке в чужом коде. Возвращайте предсказуемое значение — Неопределено, пустой массив или пустую ссылку — и документируйте это в комментарии к функции.

FAQ: частые вопросы о модуле менеджера

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

Да, но только из серверного контекста формы — процедур с директивой &НаСервере или &НаСервереБезКонтекста. Из клиентской процедуры (&НаКлиенте) прямой вызов невозможен: сделайте серверную обёртку в форме и вызывайте её с клиента.

Почему возникает ошибка «Метод объекта не обнаружен»?

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

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

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

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

Вызов Справочники.Имя.Функция() не читает объект из базы и не создаёт его в памяти, поэтому работает быстрее и безопаснее при массовых операциях. Создание объекта через ПолучитьОбъект() оправдано только когда нужен доступ к реквизитам и табличным частям конкретного элемента.

Работает ли модуль менеджера во внешних соединениях и COM?

Да, при подключении через COM-коннектор или внешнее соединение менеджеры объектов доступны так же, как в обычном серверном сеансе: Соединение.Справочники.Имя.Функция(). Ограничение — функция не должна обращаться к интерактивным механизмам (сообщения пользователю, модальные вызовы).

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

В конфигураторе используйте глобальный поиск (Ctrl+Shift+F) по строке «ИмяОбъекта.ИмяФункции» по всей конфигурации. Также полезен поиск ссылок на объект конфигурации через пункт «Поиск ссылок в объектах» — он покажет модули, где упоминается менеджер данного типа.

Итог

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

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