Запуск длительных процессов в фоновом режиме при старте сеанса пользователя — это распространенная задача. Она позволяет выполнять тяжелые операции (например, резервное копирование, обновление кэшей или проверку актуальности данных) незаметно для пользователя, не блокируя основной интерфейс программы. Однако начинающие разработчики часто сталкиваются с ошибкой Метод объекта не обнаружен при попытке вызвать нужную процедуру из Модуля управляемого приложения. Рассмотрим подробно, почему это происходит и как правильно организовать архитектуру кода для решения этой задачи.
Разберем ситуацию, описанную в теме: разработчик создал общий модуль и установил в его свойствах сразу несколько флагов: Клиент, Сервер и Вызов сервера. При попытке вызвать экспортную процедуру из этого модуля внутри обработчика ПриНачалеРаботыСистемы система выдает ошибку. Выясним причину такого поведения платформы 1С:Предприятие.
Когда у общего модуля одновременно стоят флаги Клиент (управляемое приложение) и Сервер, платформа ведет себя следующим образом:
ФоновыеЗадания. Если в коде процедуры используются серверные объекты, модуль просто не скомпилируется корректно для клиента или выдаст ошибку во время выполнения.Модуля управляемого приложения, 1С ищет ее в клиентской части общего модуля. Если там стоят инструкции препроцессора или если компиляция клиентской части прошла с ошибками из-за серверного кода, метод не будет найден.Проанализируем правильную настройку свойств общего модуля. Чтобы серверный метод был доступен для вызова из клиентского кода (которым является Модуль управляемого приложения), необходимо оставить только флаги Сервер и Вызов сервера. Флаг Клиент в данном случае вреден, так как он заставляет систему пытаться выполнить код не там, где нужно.
Рассмотрим по шагам создание модуля-посредника, который будет отвечать за инициацию фонового задания. Создадим новый общий модуль, например, с именем ФоновыеПроцедурыСервер.
В свойствах модуля установим следующие параметры:
Разместим в этом модуле процедуру, которая будет запускать фоновое задание:
Процедура ЗапуститьСозданиеБэкаповВФоне(Интервал) Экспорт
ИмяМетода = "ФоновыеПроцедурыСервер.ВыполнитьРезервноеКопированиеДанных";
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Интервал);
// Запускаем фоновое задание через менеджер
ФоновыеЗадания.Выполнить(ИмяМетода, ПараметрыЗадания, , "Автоматический бэкап при старте");
КонецПроцедуры
Процедура ВыполнитьРезервноеКопированиеДанных(Интервал) Экспорт
// Здесь располагается основной тяжелый код,
// который будет выполняться в отдельном потоке
// ...
КонецПроцедуры
Теперь перейдем в Модуль управляемого приложения. Для запуска процесса лучше всего использовать событие ПриНачалеРаботыСистемы. В отличие от ПередНачаломРаботыСистемы, этот обработчик вызывается, когда среда пользователя уже полностью инициализирована.
Рассмотрим пример вызова:
Процедура ПриНачалеРаботыСистемы()
// Вызываем нашу серверную обертку
Попытка
ФоновыеПроцедурыСервер.ЗапуститьСозданиеБэкаповВФоне(2);
Исключение
// Важно обработать исключение, чтобы не прерывать вход пользователя
ЗаписьЖурналаРегистрации("ЗапускФоновогоЗадания",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Если ваша конфигурация построена на базе БСП (как большинство современных решений 1С:ERP, УТ 11, БП 3.0), настоятельно рекомендуем использовать стандартные механизмы библиотеки. Это позволит избежать проблем с совместимостью в файловом режиме и обеспечит более удобный мониторинг.
Посмотрим, как это сделать с помощью общего модуля ДлительныеОперации:
Процедура ПриНачалеРаботыСистемы()
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Инициализация при старте";
ПараметрыПроцедуры = Новый Структура("Интервал", 2);
ДлительныеОперации.ВыполнитьВФоне(
"ФоновыеПроцедурыСервер.ВыполнитьРезервноеКопированиеДанных",
ПараметрыПроцедуры,
ПараметрыВыполнения
);
КонецПроцедуры
Проанализируем дополнительные аспекты, которые могут повлиять на стабильность работы системы:
ДокументОбъект. Используйте ссылки, структуры или массивы.Сервис -> Параметры -> Модули -> Проверка). Установите все флажки (включая проверку сервера и клиента), чтобы увидеть потенциальные ошибки обращения к контексту еще на этапе разработки.Таким образом, для успешного запуска фонового задания при старте системы необходимо четко разделять клиентский код запуска и серверную логику выполнения, правильно настраивая права доступа и контексты общих модулей.