diamond АШ Tlg

Как заполнять управляемую форму 1С в фоновом задании

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

Минимально необходимый код для запуска длительной операции

Для команды на клиенте пишем следующие процедуры по примеру:

&НаКлиенте
Процедура ВыполнитьДолгуюЗагруузку(Команда)
                
    ДлОп = ДлительнаяЗагрузка(
            Параметр1, 
            Параметр2, 
            Параметр3, 
            // все необходимые параметры, максимум 7 штук! 
            УникальныйИдентификатор
    );
    ОповещениеОЗавершении = Новый ОписаниеОповещения(
        "ПослеДлительнойЗагрузки", 
        ЭтотОбъект
    );
    
    ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    
    // В конфигурации БП здесь показывается жёлтая кошка, 
    // в остальных по умолчанию анимированный круг:
    ДлительныеОперацииКлиент.ОжидатьЗавершение(
        ДлОп, 
        ОповещениеОЗавершении, 
        ПараметрыОжидания
    );
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДлительнаяЗагрузка(Параметр1, Параметр2, Параметр3, УникальныйИдентификатор)
        
    //// { Для отладки раскомментировать
    //расш1_ОбщийМодуль1.ЗагрузкаНаСервере(
    //	Параметр1,
    //	Параметр2,
    //	Параметр3
    //);
    //Возврат Неопределено;	
    //// }
        
    ПараметрыВыполненияФункции = ДлительныеОперации.ПараметрыВыполненияФункции(
        УникальныйИдентификатор
    );
        
    Возврат ДлительныеОперации.ВыполнитьФункцию(
        ПараметрыВыполненияФункции,
        // имя процедуры в общем модуле, где и будет выполняться загрузка:
        "расш1_ОбщийМодуль1.ЗагрузкаНаСервере", 
        Параметр1,
        Параметр2,
        Параметр3
    );                               
    
КонецФункции

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

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

Все долгие процедуры выполняюся в серверном общем модуле. Обратите внимание, что все аргументы должны передаваться по значению! Максимальное число аргументов (ограничение БСП) - 7 штук. Если не хватает - используйте структуру.

Функция ЗагрузкаНаСервере(Знач Параметр1, Знач Параметр2, Знач Параметр3) Экспорт
	
    РезультатДлительнойОперации = Новый Массив; 
    // Структура, Строка, число и т.д. - всё что сериализуется и понятно тонкому клиенту
	
    // здесь ваша обработка

    Возврат РезультатДлительнойОперации; 
		
КонецФункции

Прогресс выполнения

В окне ожидания можно выводить свои сообщения и прогресс выполнения, для этого обратите внимание на строку из кода выше:

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);

Заполните всего один параметр:

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;

В долгом серверном модуле вставьте в главном цикле обхода следующий вызов, из описания БСП рекомендуется вызывать его не более 100 раз:

// текущее значение прогресса от 0 до 100
ДлительныеОперации.СообщитьПрогресс(0);
...
ДлительныеОперации.СообщитьПрогресс(30, "Выполняю полезное дело");

Важное ограничение, о котором нигде не упомянуто: вызов ДлительныеОперации.СообщитьПрогресс не работает, если обернёте главный цикл процедуры в одну длительную транзакцию!

Жёлтая кошка

Поменять анимацию ожидания на "жёлтую кошку", как в Бухгалтерии Предприятия, настройкой параметров только для своей обработки вы не сможете. Для этого придётся заимствовать в расширение общую форму ДлительнаяОперация и поменять гифку там - но эта модификация распространится на всю конфигурацию включая типовые обработки. Считаю плохим тоном менять её на свою анимацию глобально. Несложно доработать форму и общий модуль так, чтобы передавать новый параметр с именем картинки и таким образом показываеть авторскую анимацию только в своих доработках.

Уведомление об окончании длительной операции

Можно включить оповещение, которое будет показано в правом нижнем углу экрана после завершения длительного фонового задания:

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ОповещениеПользователя.Показать = Истина;
ПараметрыОжидания.ОповещениеПользователя.Тест = "Загрузка данных завершена";
ПараметрыОжидания.ОповещениеПользователя.Пояснение = "Обновите список документов";
// Украшение
ПараметрыОжидания.ОповещениеПользователя.Картинка = БиблиотекаКартинок.расш1_Картинка;
// Будет создан "колокольчик":
ПараметрыОжидания.ОповещениеПользователя.Важное = Истина;