Не секрет, что после запуска "тяжелой" обработки хочется продолжать работать в программе, а также "видеть" время от времени сам процесс выполнения. Для простого пояснения, как это реализовано, и предназначена эта статья. Если ваша конфигурация не на БСП 2.3.2, можно сразу перейти, например, на эту статью //infostart.ru/public/157706/
Важно! Обработка должна использоваться только через штатный механизм БСП "Дополнительные отчеты и обработки".
Код модуля обработки
Примечание: обработку можно запустить как из формы (см. представление команды "Открыть форму и выполнить в фоне с индикацией") так и сразу на сервере (см представление команды "Выполняем на сервере"). Запуск непосредственно на сервере можно сделать по расписанию.
// Возвращает сведения о внешней обработке. Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); ПараметрыРегистрации.Версия = "2.1"; ПараметрыРегистрации.БезопасныйРежим = Истина; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Выполняем на сервере'"); НоваяКоманда.Идентификатор = "ВыполнениеНаСервереОбработку"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Истина; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Открыть форму и выполнить в фоне с индикацией'"); НоваяКоманда.Идентификатор = "ОткрытьФормуОбработку"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); НоваяКоманда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции // Интерфейс для выполнения команд обработки. Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000*10; Попытка СтандартныеПодсистемыКлиентСервер.ВывестиОповещение( ПараметрыВыполнения.РезультатВыполнения, НСтр("ru = 'Выполнена длит. операция!'"),, БиблиотекаКартинок.Успешно32); Исключение СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке( ПараметрыВыполнения.РезультатВыполнения, СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды), ИнформацияОбОшибке()); Возврат; КонецПопытки; //Имитация длительной операции - вместо этого вставте свой код который будет выполняться на сервере в фоне Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл КонецЦикла; КонецПроцедуры
Код модуля формы обработки
Важно добавить в форму эти параметры:
- ДополнительнаяОбработкаСсылка (тип "СправочникСсылка.ДополнительныеОтчетыИОбработки").
- ИдентификаторКоманды (тип "Строка")
.. и эти реквизиты:
- ОбъектСсылка (тип "СправочникСсылка.ДополнительныеОтчетыИОбработки")
- ИдентификаторКоманды (тип "Строка")
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбъектСсылка = Параметры.ДополнительнаяОбработкаСсылка; ИдентификаторКоманды = Параметры.ИдентификаторКоманды; КонецПроцедуры &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Если ИсточникВыбора.ИмяФормы = ДополнительныеОтчетыИОбработкиКлиент.ИмяФормыДлительнойОперации() Тогда ЗагрузитьРезультат(ВыбранноеЗначение); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Фигачить(Команда) ПараметрыКоманды = Новый Структура("ДополнительнаяОбработкаСсылка, СопровождающийТекст"); ПараметрыКоманды.ДополнительнаяОбработкаСсылка = ОбъектСсылка; ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняем из формы в фоне...'"); Состояние(ПараметрыКоманды.СопровождающийТекст); ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); КонецПроцедуры &НаКлиенте Процедура ЗагрузитьРезультат(РезультатВыполнения) Если Открыта() Тогда Закрыть(); КонецЕсли; ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ВладелецФормы, РезультатВыполнения); КонецПроцедуры &НаСервере Функция ВыполнитьКомандуНапрямую(ИдентификаторКоманды, ПараметрыКоманды) Возврат ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); КонецФункции
Примечание: для формы нужно назначить обработчики событий для процедур "ПриСозданииНаСервере" и "ОбработкаВыбора".
Вот, собственно, и все...
З.Ы. Для тех, кому недостаточно "простого" описания и кто хочет подробно разобраться в предмете - см. описание с ИТС
UPDATE 20/09/19: добавил вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.
Немного тут подсмотрел
Модуль обработки:
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
Если ИмяКоманды = "ОткрытьФормуОбработку" Тогда
ВремяФиниша = ТекущаяДатаСеанса() + 100;
Пока ТекущаяДатаСеанса() < ВремяФиниша Цикл
Процент = 100 - (ВремяФиниша - ТекущаяДатаСеанса());
Если НЕ (Процент % 10) Тогда
ДлительныеОперации.СообщитьПрогресс(Процент, СтрШаблон("Выполнено %1 процентов: пример параметра команды = %2", Процент,ПараметрыВыполнения.СвойПараметр));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Модуль формы:
&НаСервере
Функция ФигачитьВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, СвойПараметр");
ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор;
ПараметрыПроцедуры.СвойПараметр = ВыполняемаяКоманда.СвойПараметр;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьВФоне("ДополнительныеОтчетыИОбработки.ВыполнитьКоманду", ПараметрыПроцедуры, ПараметрыВыполнения);
КонецФункции
&НаКлиенте
Процедура Фигачить(Команда)
СопровождающийТекст = НСтр("ru = 'Выполняется обработка данных'");
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) Тогда
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
НастройкиОжидания.ВыводитьСообщения = Истина;
НастройкиОжидания.ТекстСообщения = НСтр("ru = 'Выполняется обработка данных...'");
ВыполняемаяКоманда = Новый Структура("Ссылка, Идентификатор, СвойПараметр", Параметры.ДополнительнаяОбработкаСсылка, Параметры.ИдентификаторКоманды, "это мой параметр (фоновое)");
ОперацияВФоне = ФигачитьВФоне(ВыполняемаяКоманда, УникальныйИдентификатор);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ОперацияВФоне, Обработчик, НастройкиОжидания);
Иначе
Параметры.ИдентификаторКоманды = "ОткрытьФормуОбработку";
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = СопровождающийТекст + "...";
ПараметрыКоманды.Вставить("СвойПараметр","это мой параметр");
Операция = ВыполнитьКомандуНапрямую(ПараметрыКоманды);
ВыполнитьОбработкуОповещения(Обработчик, Операция);
КонецЕсли;
КонецПроцедуры
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция ВыполнитьКомандуНапрямую(ПараметрыКоманды)
Операция = Новый Структура("Статус, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки");
Попытка
ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(
Параметры.ИдентификаторКоманды,
ПараметрыКоманды,
ЭтотОбъект);
Операция.Статус = "Выполнено";
Исключение
Операция.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Операция.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Возврат Операция;
КонецФункции
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
Если Операция.Статус = "Выполнено" Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст, БиблиотекаКартинок.Успешно32);
Иначе
ПоказатьПредупреждение(, Операция.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
#КонецОбласти