Разработка и Конфигурация · 10 мин
Вызов функции из модуля менеджера в 1С
Разбираем, как вызвать функцию из модуля менеджера объекта в 1С: синтаксис, директива Экспорт, примеры для справочников и документов, типичные ошибки и FAQ.
Модуль менеджера в 1С — это программный модуль, который существует у объектов конфигурации, имеющих прикладную логику: справочников, документов, планов счетов, регистров, обработок и других. В отличие от модуля объекта, код модуля менеджера не привязан к конкретной записи в базе данных, поэтому в нём удобно размещать функции, работающие с объектом «в целом»: подбор данных, расчёты, создание новых элементов.
Чтобы вызвать функцию из модуля менеджера, нужно выполнить два обязательных условия: функция должна быть объявлена с ключевым словом Экспорт, а обращение к ней выполняется через менеджер объекта — например, Справочники.Номенклатура.ИмяФункции(). Если хотя бы одно из условий не выполнено, платформа выдаст ошибку «Метод объекта не обнаружен» или «Процедура или функция с указанным именем не определена».
Ниже разобран синтаксис вызова, правила видимости, примеры для разных типов объектов, а также типичные ошибки, из-за которых вызов не срабатывает даже при корректном, на первый взгляд, коде.
Что такое модуль менеджера и когда его использовать
Модуль менеджера компилируется один раз на уровне объекта конфигурации и не требует получения ссылки или создания объекта. Это его ключевое отличие от модуля объекта, код которого выполняется в контексте конкретной записи — открытого документа, редактируемого элемента справочника.
Типичные задачи для модуля менеджера: поиск элемента по набору реквизитов, создание нового документа с заполнением по умолчанию, расчёт итогов по виду объекта, формирование данных для печатных форм и обменов. Стандартные подсистемы БСП активно используют этот подход — например, обработчики обновления и функции получения представлений объектов.
Открыть модуль менеджера можно в конфигураторе: в дереве конфигурации выделите объект, нажмите правую кнопку мыши и выберите «Открыть модуль менеджера». Если пункт недоступен, проверьте, что у объекта вообще может быть модуль менеджера — у констант, например, его нет.
Как объявить экспортную функцию в модуле менеджера
Функция становится доступной извне только при наличии ключевого слова Экспорт после объявления параметров. Без него функция считается внутренней и видна только в пределах модуля менеджера.
Функция ПолучитьЦенуПоУмолчанию(Номенклатура) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК Цены
|ГДЕ
| Цены.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Цена;
КонецЕсли;
Возврат 0;
КонецФункции
Рекомендуется снабжать экспортные функции описанием в виде комментария перед объявлением: назначение, параметры, возвращаемое значение. В типовых конфигурациях это обязательное требование стандартов разработки, кроме того, описание отображается в контекстной подсказке при вызове.
Синтаксис вызова функции из другого модуля
Обращение строится по шаблону: КоллекцияМенеджеров.ИмяОбъекта.ИмяФункции(Параметры). Коллекция зависит от типа объекта: Справочники, Документы, Перечисления, ПланыВидовХарактеристик, РегистрыСведений, Обработки и так далее.
// Вызов из модуля формы или общего модуля
Цена = Справочники.Номенклатура.ПолучитьЦенуПоУмолчанию(ТекущаяНоменклатура);
// Вызов функции из модуля менеджера документа
НовыйНомер = Документы.РеализацияТоваровУслуг.ПолучитьСледующийНомер(ТекущаяДата);
// Вызов без параметров
Настройки = Обработки.ПанельАдминистрирования.ПолучитьНастройкиПоУмолчанию();
Возвращаемое значение можно использовать в выражениях напрямую, не присваивая переменной: Если Справочники.Контрагенты.ЭтоНерезидент(Контрагент) Тогда … КонецЕсли;. Это обычная практика для функций-проверок, возвращающих булево.
Вызов из модуля формы
В модуле формы вызов выполняется аналогично, но учитывайте директиву компиляции. Код с директивой &НаКлиенте не может напрямую обращаться к серверным экспортным функциям менеджера — контекст сервера там недоступен. Перенесите вызов в процедуру с директивой &НаСервере или &НаСервереБезКонтекста.
&НаСервереБезКонтекста
Функция ПолучитьЦенуНаСервере(Номенклатура)
Возврат Справочники.Номенклатура.ПолучитьЦенуПоУмолчанию(Номенклатура);
КонецФункции
Вызов функций модуля менеджера у разных типов объектов
Шаблон вызова одинаков, но есть нюансы по типам объектов. У перечислений модуль менеджера чаще всего содержит функции получения связанных данных. У регистров сведений и накопления — функции формирования движений или получения срезов. У обработок модуль менеджера доступен, но на практике логику чаще размещают в модуле объекта или общих модулях.
| Тип объекта | Пример вызова | Типичное назначение функций |
|---|---|---|
| Справочник | Справочники.Контрагенты.НайтиПоИНН(ИНН) | Поиск, создание, проверки |
| Документ | Документы.Заказ.РассчитатьСтатус(Ссылка) | Статусы, итоги, печать |
| Перечисление | Перечисления.СтавкиНДС.ПолучитьРазмер(Ставка) | Расшифровка значений |
| Регистр сведений | РегистрыСведений.Курсы.ПолучитьКурс(Валюта, Дата) | Срезы, настройки |
Для внешних обработок вызов функции из модуля объекта выполняется иначе — через создание объекта обработки: ВнешниеОбработки.Создать(Путь).ИмяФункции(). Модуль менеджера у внешних обработок отсутствует, это ограничение платформы, которое часто путают.
Альтернатива: общие модули
Если функция не привязана жёстко к одному типу объекта или должна вызываться из разных подсистем, правильнее разместить её в общем модуле. Вызов тогда выглядит как ИмяОбщегоМодуля.ИмяФункции() — без указания коллекции объектов.
Где размещать функцию
Логика относится к одному типу объекта: поиск элемента справочника, расчёт по виду документа. Не требует флагов в свойствах.
Логика универсальна или межобъектная. Требует настройки флагов Сервер, Клиент, ВызовСервера — ошибка в флагах ломает вызов.
Логика работает с данными конкретной записи и вызывается через ссылку: Ссылка.ПолучитьОбъект() или методы объекта.
При выборе учитывайте производительность: общие модули с флагом «Привилегированный режим» выполняются без проверки прав, а функции модуля менеджера работают в контексте прав текущего пользователя. Для операций, которые пользователь не должен выполнять напрямую, это может быть как плюсом, так и проблемой.
Проверка результата и отладка
После внедрения вызова проверьте три вещи: модуль компилируется без ошибок (меню «Конфигурация — Проверка конфигурации»), функция возвращает ожидаемый тип значения, вызов работает под пользователем с ограниченными правами, а не только под полными правами.
Как проверить результат
Проверка конфигурации проходит без ошибок по модулю менеджера
Ошибка «Процедура или функция не определена» — нет Экспорт или опечатка в имени
Тип значения соответствует ожиданию во всех ветках, включая Возврат без значения
В одной из веток функция возвращает Неопределено, а вызывающий код ждёт число
Функция отрабатывает под ролью обычного пользователя
Ошибка доступа к данным — функция читает объекты, на которые у роли нет прав
Для отладки поставьте точку останова внутри функции модуля менеджера и запустите отладку предприятия. Если точка не срабатывает, чаще всего вызывается другая одноимённая функция — проверьте, нет ли дубля в общем модуле или модуле объекта.
Типичные ошибки при вызове
Отдельно стоит упомянуть кэширование: если вы изменили модуль менеджера, а вызов ведёт себя по-старому, обновите конфигурацию базы данных и перезапустите сеанс. В файловых базах иногда помогает очистка кэша метаданных.
Что важно запомнить
Функция вызывается из модуля менеджера через менеджер объекта: Справочники.Имя.Функция(). Обязательны слово Экспорт и серверный контекст вызова. Для универсальной логики вместо модуля менеджера используйте общий модуль.
Частые вопросы
Можно ли вызвать функцию модуля менеджера без слова Экспорт?
Нет. Без Экспорт функция является внутренней и доступна только в пределах самого модуля менеджера. Попытка вызова извне завершится ошибкой «Процедура или функция с указанным именем не определена».
Чем модуль менеджера отличается от модуля объекта?
Модуль менеджера работает с типом объекта в целом и не требует ссылки на конкретную запись. Модуль объекта выполняется в контексте конкретной записи — например, при записи документа — и имеет доступ к его данным через контекст объекта.
Как вызвать функцию модуля менеджера из клиентской процедуры формы?
Напрямую — никак, если функция серверная. Создайте в модуле формы процедуру с директивой &НаСервереБезКонтекста, выполните вызов в ней и обращайтесь к этой процедуре из клиентского кода.
Почему возникает ошибка «Метод объекта не обнаружен» при вызове?
Основные причины: отсутствует слово Экспорт, опечатка в имени функции, функция написана в модуле объекта, а не в модуле менеджера, либо конфигурация базы данных не обновлена после изменения модуля.
Можно ли вызвать функцию модуля менеджера внешней обработки?
У внешних обработок нет модуля менеджера. Экспортные функции размещаются в модуле объекта и вызываются через созданный экземпляр: ВнешниеОбработки.Создать(ПутьКФайлу).ИмяФункции(). Для разрешения доступа может потребоваться отключение защиты от опасных действий.