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

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

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

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

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

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

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

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

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

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

Открыть модуль менеджера можно в конфигураторе: в дереве конфигурации выделите объект, нажмите правую кнопку мыши и выберите «Открыть модуль менеджера». Если пункт недоступен, проверьте, что у объекта вообще может быть модуль менеджера — у констант, например, его нет.

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

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

Функция ПолучитьЦенуПоУмолчанию(Номенклатура) Экспорт

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

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Цены.Цена КАК Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК Цены

|ГДЕ

| Цены.Номенклатура = &Номенклатура";

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

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

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

Возврат Выборка.Цена;

КонецЕсли;

Возврат 0;

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

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

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

Обращение строится по шаблону: КоллекцияМенеджеров.ИмяОбъекта.ИмяФункции(Параметры). Коллекция зависит от типа объекта: Справочники, Документы, Перечисления, ПланыВидовХарактеристик, РегистрыСведений, Обработки и так далее.

// Вызов из модуля формы или общего модуля

Цена = Справочники.Номенклатура.ПолучитьЦенуПоУмолчанию(ТекущаяНоменклатура);

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

НовыйНомер = Документы.РеализацияТоваровУслуг.ПолучитьСледующийНомер(ТекущаяДата);

// Вызов без параметров

Настройки = Обработки.ПанельАдминистрирования.ПолучитьНастройкиПоУмолчанию();

Возвращаемое значение можно использовать в выражениях напрямую, не присваивая переменной: Если Справочники.Контрагенты.ЭтоНерезидент(Контрагент) Тогда … КонецЕсли;. Это обычная практика для функций-проверок, возвращающих булево.

Вызов из модуля формы

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

&НаСервереБезКонтекста

Функция ПолучитьЦенуНаСервере(Номенклатура)

Возврат Справочники.Номенклатура.ПолучитьЦенуПоУмолчанию(Номенклатура);

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

Вызов функций модуля менеджера у разных типов объектов

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

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

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

Альтернатива: общие модули

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

Где размещать функцию

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

Логика относится к одному типу объекта: поиск элемента справочника, расчёт по виду документа. Не требует флагов в свойствах.

Общий модуль

Логика универсальна или межобъектная. Требует настройки флагов Сервер, Клиент, ВызовСервера — ошибка в флагах ломает вызов.

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

Логика работает с данными конкретной записи и вызывается через ссылку: Ссылка.ПолучитьОбъект() или методы объекта.

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

Проверка результата и отладка

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

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок по модулю менеджера

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

Ошибка «Процедура или функция не определена» — нет Экспорт или опечатка в имени

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

Тип значения соответствует ожиданию во всех ветках, включая Возврат без значения

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

В одной из веток функция возвращает Неопределено, а вызывающий код ждёт число

Вызов под пользователем
Норма

Функция отрабатывает под ролью обычного пользователя

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

Ошибка доступа к данным — функция читает объекты, на которые у роли нет прав

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

Типичные ошибки при вызове

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

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

Итог

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

Функция вызывается из модуля менеджера через менеджер объекта: Справочники.Имя.Функция(). Обязательны слово Экспорт и серверный контекст вызова. Для универсальной логики вместо модуля менеджера используйте общий модуль.

Частые вопросы

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

Нет. Без Экспорт функция является внутренней и доступна только в пределах самого модуля менеджера. Попытка вызова извне завершится ошибкой «Процедура или функция с указанным именем не определена».

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

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

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

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

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

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

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

У внешних обработок нет модуля менеджера. Экспортные функции размещаются в модуле объекта и вызываются через созданный экземпляр: ВнешниеОбработки.Создать(ПутьКФайлу).ИмяФункции(). Для разрешения доступа может потребоваться отключение защиты от опасных действий.