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