Как правильно запустить фоновое задание при начале работы системы в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ причины ошибки и работа с контекстами модулей

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

Когда у общего модуля одновременно стоят флаги Клиент (управляемое приложение) и Сервер, платформа ведет себя следующим образом:

  1. При вызове с клиента: Система обращается к "клиентскому экземпляру" модуля. Она даже не пытается "постучаться" на сервер, так как считает, что раз модуль доступен на клиенте, то и выполнять его нужно локально.
  2. Ограничения клиентского контекста: На стороне клиента недоступно большинство системных менеджеров, включая ФоновыеЗадания. Если в коде процедуры используются серверные объекты, модуль просто не скомпилируется корректно для клиента или выдаст ошибку во время выполнения.
  3. Конфликт имен: Если вы вызываете процедуру, которая по логике должна быть серверной, из клиентского Модуля управляемого приложения, 1С ищет ее в клиентской части общего модуля. Если там стоят инструкции препроцессора или если компиляция клиентской части прошла с ошибками из-за серверного кода, метод не будет найден.

Проанализируем правильную настройку свойств общего модуля. Чтобы серверный метод был доступен для вызова из клиентского кода (которым является Модуль управляемого приложения), необходимо оставить только флаги Сервер и Вызов сервера. Флаг Клиент в данном случае вреден, так как он заставляет систему пытаться выполнить код не там, где нужно.

Шаг 1. Создание и настройка серверного общего модуля

Рассмотрим по шагам создание модуля-посредника, который будет отвечать за инициацию фонового задания. Создадим новый общий модуль, например, с именем ФоновыеПроцедурыСервер.

В свойствах модуля установим следующие параметры:

Разместим в этом модуле процедуру, которая будет запускать фоновое задание:


Процедура ЗапуститьСозданиеБэкаповВФоне(Интервал) Экспорт
    
    ИмяМетода = "ФоновыеПроцедурыСервер.ВыполнитьРезервноеКопированиеДанных";
    ПараметрыЗадания = Новый Массив;
    ПараметрыЗадания.Добавить(Интервал);
    
    // Запускаем фоновое задание через менеджер
    ФоновыеЗадания.Выполнить(ИмяМетода, ПараметрыЗадания, , "Автоматический бэкап при старте");
    
КонецПроцедуры

Процедура ВыполнитьРезервноеКопированиеДанных(Интервал) Экспорт
    // Здесь располагается основной тяжелый код, 
    // который будет выполняться в отдельном потоке
    // ...
КонецПроцедуры

Шаг 2. Инициация задания из Модуля управляемого приложения

Теперь перейдем в Модуль управляемого приложения. Для запуска процесса лучше всего использовать событие ПриНачалеРаботыСистемы. В отличие от ПередНачаломРаботыСистемы, этот обработчик вызывается, когда среда пользователя уже полностью инициализирована.

Рассмотрим пример вызова:


Процедура ПриНачалеРаботыСистемы()
    
    // Вызываем нашу серверную обертку
    Попытка
        ФоновыеПроцедурыСервер.ЗапуститьСозданиеБэкаповВФоне(2);
    Исключение
        // Важно обработать исключение, чтобы не прерывать вход пользователя
        ЗаписьЖурналаРегистрации("ЗапускФоновогоЗадания", 
            УровеньЖурналаРегистрации.Ошибка, , , 
            ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    
КонецПроцедуры

Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (как большинство современных решений 1С:ERP, УТ 11, БП 3.0), настоятельно рекомендуем использовать стандартные механизмы библиотеки. Это позволит избежать проблем с совместимостью в файловом режиме и обеспечит более удобный мониторинг.

Посмотрим, как это сделать с помощью общего модуля ДлительныеОперации:


Процедура ПриНачалеРаботыСистемы()
    
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Инициализация при старте";
    
    ПараметрыПроцедуры = Новый Структура("Интервал", 2);
    
    ДлительныеОперации.ВыполнитьВФоне(
        "ФоновыеПроцедурыСервер.ВыполнитьРезервноеКопированиеДанных", 
        ПараметрыПроцедуры, 
        ПараметрыВыполнения
    );
    
КонецПроцедуры

Важные нюансы и рекомендации

Проанализируем дополнительные аспекты, которые могут повлиять на стабильность работы системы:

  1. Файловый режим работы: Помните, что в файловом режиме фоновые задания выполняются последовательно или требуют отдельного выделенного сеанса (в зависимости от версии платформы). Не стоит запускать слишком много фоновых процессов при старте, так как это может замедлить работу программы для других пользователей в файловой базе.
  2. Передача параметров: В фоновое задание можно передавать только сериализуемые значения. Вы не сможете передать открытую форму, мутабельное значение или объект типа ДокументОбъект. Используйте ссылки, структуры или массивы.
  3. Диагностика: Если фоновое задание запускается, но "ничего не происходит", проверьте Журнал регистрации. Ошибки внутри фонового задания не выводятся на экран пользователю в виде окна, они фиксируются только в системном логе.
  4. Проверка через Конфигуратор: Как было верно замечено в обсуждении на форуме, всегда используйте встроенную проверку модулей (Сервис -> Параметры -> Модули -> Проверка). Установите все флажки (включая проверку сервера и клиента), чтобы увидеть потенциальные ошибки обращения к контексту еще на этапе разработки.

Таким образом, для успешного запуска фонового задания при старте системы необходимо четко разделять клиентский код запуска и серверную логику выполнения, правильно настраивая права доступа и контексты общих модулей.

← На главную