Как вызвать клиентский код и механизм длительных операций из регламентного задания в 1С?

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

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

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

Ограничения контекста регламентных заданий

Регламентные и фоновые задания всегда выполняются на стороне сервера в неинтерактивном сеансе. В этом контексте полностью отсутствует клиентский уровень:

  1. Нельзя открывать управляемые формы, обращаться к объектам форм и элементам интерфейса.
  2. Недоступны процедуры с директивой компиляции &НаКлиенте и методы клиентских общих модулей.
  3. Нельзя использовать интерактивные методы платформы, такие как ПодключитьОбработчикОжидания, Предупреждение, Вопрос или ОткрытьФорму.

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

Принцип работы длительных операций в 1С

Проанализируем, как устроен типовой механизм длительных операций БСП на клиенте:

  1. Пользователь нажимает кнопку в форме.
  2. Клиентский код вызывает метод подсистемы (например, ДлительныеОперации.ЗапуститьВыполнениеВФоне(...)), который стартует фоновое задание на сервере.
  3. Чтобы интерфейс программы не зависал, на клиенте вызывается ПодключитьОбработчикОжидания, периодически проверяющий статус готовности данных.
  4. Вся тяжелая работа (запросы к веб-сервисам, расчеты, заполнение реквизитов) выполняется исключительно на сервере в процедуре общего модуля.

В контексте регламентного задания интерактивного пользователя нет, а серверный поток не требует разблокировки интерфейса. Соответственно, отслеживать завершение через клиентские таймеры не требуется.

Вариант 1. Прямой вызов серверной процедуры (рекомендуемый способ)

Наиболее простое, быстрое и надежное решение для регламентного задания — вызов серверной процедуры напрямую без создания дополнительных фоновых заданий.

Выясним процедуру, которая передается в фоновое задание в форме обработки, и вызовем ее в синхронном режиме:


// В модуле объекта регламентного задания или общем модуле:
Процедура ВыполнитьРегламентнуюОбработку() Экспорт
    
    // Получаем список контрагентов для актуализации
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Контрагенты.Ссылка КАК Контрагент,
        |   Контрагенты.ИНН КАК ИНН,
        |   Контрагенты.КПП КАК КПП
        |ИЗ
        |   Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |   НЕ Контрагенты.ПометкаУдаления";
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Для Каждого Стр Из РезультатЗапроса Цикл
        Попытка
            // Вызываем серверную процедуру заполнения реквизитов напрямую
            // без открытия формы и клиентских оберток
            ЗаполнитьРеквизитыПоСервису(Стр.Контрагент, Стр.ИНН, Стр.КПП);
        Исключение
            ЗаписьЖурналаРегистрации(
                "Обновление контрагентов",
                УровеньЖурналаРегистрации.Ошибка,,,
                "Ошибка обработки контрагента " + Строка(Стр.Контрагент) + ": " + ОписаниеОшибки()
            );
        КонецПопытки;
    КонецЦикла;
    
КонецПроцедуры

Вариант 2. Ожидание завершения фонового задания на сервере

Если логика жестко завязана на функции БСП и не может быть легко вынесена в синхронную процедуру, запустим процедуру через фоновое задание и дождемся его завершения серверными методами:


ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ИНН", ТекущийИНН);
ПараметрыПроцедуры.Вставить("КПП", ТекущийКПП);

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Неопределено);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Получение данных контрагента";

// Запуск фонового задания на сервере
ДлительнаяОперация = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
    "ЗаполнениеРеквизитовКонтрагентов.ЗаполнитьДанные",
    ПараметрыПроцедуры,
    ПараметрыВыполнения
);

// Ожидание завершения на сервере без клиентских обработчиков ожидания
Если ДлительнаяОперация.Статус = "Выполняется" Тогда
    ПараметрыОжидания = ДлительныеОперации.ПараметрыОжидания(Неопределено);
    ПараметрыОжидания.Таймаут = 60; // Максимальное время ожидания в секундах
    
    ДлительныеОперации.ОжидатьЗавершение(ДлительнаяОперация, ПараметрыОжидания);
КонецЕсли;

Если ДлительнаяОперация.Статус = "Выполнено" Тогда
    Результат = ПолучитьИзВременногоХранилища(ДлительнаяОперация.АдресРезультата);
    // Запись полученных данных в регистр
КонецЕсли;

Также платформа предоставляет базовый метод ФоновыеЗадания.ОжидатьЗавершения(...), принимающий массив запущенных заданий и таймаут.

Особенности работы с сервисом «1С:Контрагент» в регламентных заданиях

При настройке фонового обмена с сервисом 1С:Контрагент учтем следующие нюансы:

  1. Подключение Интернет-поддержки: Регламентное задание выполняется под системной учетной записью сервера. Убедимся, что интернет-поддержка пользователей авторизована глобально для информационной базы.
  2. Сетевой доступ: Сервер 1С:Предприятия должен иметь прямой доступ в интернет по защищенному протоколу HTTPS к серверам сервиса без интерактивной авторизации через прокси.
  3. Обработка таймаутов и ошибок сети: Сетевые вызовы обязательно оборачиваются в блок Попытка ... Исключение с фиксацией событий в ЖурналРегистрации, чтобы сбой по одному контрагенту не прерывал выполнение всего регламентного задания.
  4. Лимиты тарифа: Пакетный опрос сервиса может быстро израсходовать лимит автозаполнений. Рекомендуется фильтровать выборку и обновлять только контрагентов с измененными или незаполненными реквизитами.
← На главную