Как заполнять управляемую форму 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_Картинка;
// Будет создан "колокольчик":
ПараметрыОжидания.ОповещениеПользователя.Важное = Истина;