Объединил две идеи и получилось вот такое развитие. (Только не спрашивайте меня, - как это работает?)
Почитать статьи предшественники можно здесь Фоновое выполнение кода и здесь Запуск процедур и функций в асинхронном режиме.
Во вложенном файле обработка, которая перепроводит документы Реализация товаров и услуг по выбранной организации и за выбранный период.
Перечислю по пунктам, что требуется сделать, чтобы все заработало:
1. В свой общий серверный модуль (такой наверняка есть почти у всех) добавляем код, представленный ниже.
///////////////////////////// Выполнение процедур в фоне /////////////////////////////////////////////////////////////////////////////////////
///////////////////////////// почитать можно здесь //infostart.ru/1c/articles/1102674/ и здесь //infostart.ru/1c/articles/1318934/
// Суть всех стараний - теперь можно из любой внешней обработки запусть выполнение в фоне с выводом прогресса и/или сообщений
// ниже процедура и функция как раз используют идею из первой статьи
//
// Пример выполнения во внешней обработке "Проведение документов в фоне"
// в обработке мы используем идею из второй статьи
Процедура ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения) Экспорт
ПолныйТекстМодуля = "";
Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
КонецЦикла;
ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
Выполнить(ПолныйТекстМодуля);
КонецПроцедуры
Функция ФоноваяФункция(ТекстМодуля,ПараметрыВыполнения) Экспорт
//
ТЗ = Новый Массив;
ПолныйТекстМодуля = "";
Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
КонецЦикла;
ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
Выполнить(ПолныйТекстМодуля);
Возврат ТЗ;
КонецФункции
2. В модуле формы обработки поменять в двух местах Мой_СерверныйМодуль на имя того модуля, куда вы поместили код из первого пункта.
3. В вашей базе должен быть модули БСП с функцией ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки,
4. Вся соль в наличии модулей ДлительныеОперацииКлиент, ДлительныеОперации
5. Для вывода сообщений используется процедура общего модуля
ОбщегоНазначенияКлиентСервер.СообщитьПользователю
Все, теперь обработка заработает.
Теперь описание того, что внутри и как из этого сделать другую, нужную вам обработку с прогрессом.
1. На форме 2 кнопки "Запустить в фоне" и "Запустить в фоне функцию". По названию понятно, что первая запускает фоновую процедуру, а вторая функцию. Во втором случае вы можете вернуть результат выполнения.
2. В модуле обработке все просто: регистрация внешней обработки, процедура и функция, где, собственно, сам цикл и вывод сообщений, вспомогательная функция, которая собирает документы для перепроведения.
3. Менять название основных процедур нельзя. Обратите внимание, что в данный момент мы используем только три параметра, но изначально зашита возможность использовать еще четыре. Текст процедуры представлен ниже
Процедура ВыполнитьФоновуюПроцедуруСПрогрессом(ДатаНачала,ДатаОкончания,Организация,П4,П5,П6,П7) Экспорт
//
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(П4 + П5 + П6 + П7);
//
ТаблицаДокументов = ЗаполнитьДокиНаСервере(ДатаНачала,ДатаОкончания,Организация);
//
ВсегоДокументов = ТаблицаДокументов.Количество();
ТекДок = 1;
//
Для Каждого Строка ИЗ ТаблицаДокументов Цикл
//
ДокОбъект = строка.Документ.ПолучитьОбъект();
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось провести " + Строка(ДокОбъект) + " по причине " + ОписаниеОшибки());
КонецПопытки;
//
ПроцентВыполнения = (ТекДок/ВсегоДокументов)*100;
ПроцентВыполнения = Окр(ПроцентВыполнения,0);
//МассивВозврат.Добавить(ПроцентВыполнения);
// сообщаем "процент" и "текст сообщения"
ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,СокрЛП(Строка.Документ));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выполнено " + Строка(ТекДок) + " из " + Строка(ВсегоДокументов));
ТекДок = ТекДок + 1;
КонецЦикла;
КонецПроцедуры
4. В модуле формы две хитрости: заготовка на 4 дополнительных параметра, функция ПолучитьТекстПроцедуры. Важно, что первым параметром (Парам1) мы передаем Наименование внешней обработки из функции СведенияОВнешнейОбработке().
&НаКлиенте
Процедура ЗапуститьОперациюФункцию(Команда)
//
Парам1 = "Перепроведение документов в фоне"; // первым параметром имя внешней обработки
Парам2 = Период.ДатаНачала;
Парам3 = Период.ДатаОкончания;
Парам4 = Организация;
Парам5 = "1";
Парам6 = "2";
Парам7 = "3";
Парам8 = "4";
ПараметрыЗапуска = Новый Структура;
ПараметрыЗапуска.Вставить("Параметр", ПолучитьТекстПроцедуры1());
ПараметрыЗапуска.Вставить("ПараметрыВыполнения",Новый Структура("Параметр1,Параметр2,Параметр3,Параметр4,параметр5,параметр6,параметр7,параметр8",Парам1,Парам2,Парам3,парам4,парам5,парам6,парам7,парам8));
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере1(ПараметрыЗапуска, УникальныйИдентификатор);
ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; // можно выводить прогресс
ПараметрыОжидания.Интервал = 1;
ПараметрыОжидания.ВыводитьСообщения = Истина; // можно выводить сообщения
ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные1", ЭтотОбъект), ПараметрыОжидания);
//
КонецПроцедуры
&НаКлиенте
Функция ПолучитьТекстПроцедуры1()
//
ТекстФоновойПроцедуры = "
|ВнешнийОтчетОбработкаДляОткрытияСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(Параметр1).Ссылка;
|//
|ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВнешнийОтчетОбработкаДляОткрытияСсылка);
|ТЗ = ОбработкаОбъект.ВыполнитьФоновуюФункциюСПрогрессом(Параметр2,Параметр3,параметр4,параметр5,параметр6,параметр7,параметр8);
|;";
Возврат ТекстФоновойПроцедуры;
КонецФункции
Ну, вот и все.
Что надо сделать, чтобы заработала моя новая обработка? - спросите вы меня.
1. Скопировать мою (считаем, что в общем модуле уже есть ФоновояПроцедура и ФоноваяФункция и вы поправили две строчки как описано в самом начале п1.и п2)
2. Заменить Наименование (название и идентификатор команды) в СведенияОВнешнейОбработке()
3. Заменить Парам1 = "Перепроведение документов в фоне"; // берем из того, что написали в пункте 2
4. Добавляем на форму свои реквизиты и присваиваем их параметрам.
5. Включаем свою логику в функцию ЗаполнитьДокиНаСервере().
Добавляем в избранное, чтобы не потерять.
Используется на ERP 2.5.12.147, платформа 8.3.23.1782.
Продолжает цикл полезных отчетов и обработок.
1. Анализ использования номенклатуры
2. Форма списка Заказы поставщикам с выводом состава
3. Товары на складах по срокам хранения
4. Структура подчиненности деревом
5. Загрузка из Excel (любой таблицы) в ТЧ документа
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.12.147