1С 8.3 БСП ОжидатьЗавершение
Данные > 1С 8.3 БСП > Длительные операции
Перейти в раздел примеры кода 1С 8.3:
1С 8.3 БСП ОжидатьЗавершение. Ожидать завершения выполнения процедуры в фоновом задании и открыть форму ожидания длительной операции.
Примера кода от rayastar
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания)
//
Процедура НачатьОжиданиеФормированияОтчета(Форма, ДлительнаяОперация, ОповещениеЗавершитьФормированиеОтчета) Экспорт
Если ДлительнаяОперация = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Форма.Элементы.Результат, "ФормированиеОтчета");
ОповещениеОЗавершении = Новый ОписаниеОповещения(
"ЗакончитьОжиданиеФормированияОтчета",
ЭтотОбъект,
ОповещениеЗавершитьФормированиеОтчета);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
// См. далее ЗакончитьОжиданиеФормированияОтчета
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСписокДокументовНаЭкспортЗавершение(ДлительнаяОперация, ДополнительныеПараметры) Экспорт
Если ДлительнаяОперация = Неопределено Тогда // задание было отменено
Возврат;
КонецЕсли;
Если ДлительнаяОперация.Статус = "Ошибка" Тогда
ПоказатьОшибкуОбновленияДокументовНаЭкспортВФоне(ДлительнаяОперация);
Иначе
ЗагрузитьПлатежныеДокументыПослеОбновленияВФоне(ДлительнаяОперация);
КонецЕсли;
УправлениеФормой();
//
Процедура НачатьОжиданиеФормированияОтчета(Форма, ДлительнаяОперация, ОповещениеЗавершитьФормированиеОтчета) Экспорт
Если ДлительнаяОперация = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Форма.Элементы.Результат, "ФормированиеОтчета");
ОповещениеОЗавершении = Новый ОписаниеОповещения(
"ЗакончитьОжиданиеФормированияОтчета",
ЭтотОбъект,
ОповещениеЗавершитьФормированиеОтчета);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
// См. далее ЗакончитьОжиданиеФормированияОтчета
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСписокДокументовНаЭкспортЗавершение(ДлительнаяОперация, ДополнительныеПараметры) Экспорт
Если ДлительнаяОперация = Неопределено Тогда // задание было отменено
Возврат;
КонецЕсли;
Если ДлительнаяОперация.Статус = "Ошибка" Тогда
ПоказатьОшибкуОбновленияДокументовНаЭкспортВФоне(ДлительнаяОперация);
Иначе
ЗагрузитьПлатежныеДокументыПослеОбновленияВФоне(ДлительнаяОперация);
КонецЕсли;
УправлениеФормой();
КонецПроцедуры;
// Автор библиотеки: ООО "1С-Софт". Все права защищены © 2021
// Типовая конфигурация Библиотека стандартных подсистем (далее - БСП)
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode
Примера кода от quаzarе (https://infostart.ru/1c/articles/1625217/)
// создаем искусственную процедуру, которую будем использовать в многопоточном запуске
&НаСервере
Процедура ПроцедураМногопоток(Поток, Параметры) Экспорт
КоличествоСозданныхОбъектов = 0;
Если Параметры.ТипОбработки = "Вариант 1" Тогда // Создадим 500 документов поступления (можно и загрузить)
Для Счетчик = 1 По 500 Цикл
НовДок = Документы._ДемоПоступлениеТоваров.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.Организация = Параметры.Организация;
НовДок.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НовДок.Комментарий = Параметры.КомментарийДокумента;
Попытка
НовДок.Записать(РежимЗаписиДокумента.Запись);
Исключение
КонецПопытки;
КоличествоСозданныхОбъектов = КоличествоСозданныхОбъектов + 1;
КонецЦикла;
ИначеЕсли Параметры.ТипОбработки = "Вариант 2" Тогда // Создадим 1000 записей справочника "Номенклатура"
Для Счетчик = 1 По 1000 Цикл
НовСпр = Справочники._ДемоНоменклатура.СоздатьЭлемент();
НовСпр.Наименование = "Новая номенклатура_"+Строка(Счетчик);
НовСпр.НаименованиеДляПечати = "Новая номенклатура_"+Строка(Параметры.ОписаниеСправочника);
НовСпр.Записать();
КонецЦикла;
КоличествоСозданныхОбъектов = КоличествоСозданныхОбъектов + 1;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроцедураМногопоток(Поток, Параметры) Экспорт
КоличествоСозданныхОбъектов = 0;
Если Параметры.ТипОбработки = "Вариант 1" Тогда // Создадим 500 документов поступления (можно и загрузить)
Для Счетчик = 1 По 500 Цикл
НовДок = Документы._ДемоПоступлениеТоваров.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.Организация = Параметры.Организация;
НовДок.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НовДок.Комментарий = Параметры.КомментарийДокумента;
Попытка
НовДок.Записать(РежимЗаписиДокумента.Запись);
Исключение
КонецПопытки;
КоличествоСозданныхОбъектов = КоличествоСозданныхОбъектов + 1;
КонецЦикла;
ИначеЕсли Параметры.ТипОбработки = "Вариант 2" Тогда // Создадим 1000 записей справочника "Номенклатура"
Для Счетчик = 1 По 1000 Цикл
НовСпр = Справочники._ДемоНоменклатура.СоздатьЭлемент();
НовСпр.Наименование = "Новая номенклатура_"+Строка(Счетчик);
НовСпр.НаименованиеДляПечати = "Новая номенклатура_"+Строка(Параметры.ОписаниеСправочника);
НовСпр.Записать();
КонецЦикла;
КоличествоСозданныхОбъектов = КоличествоСозданныхОбъектов + 1;
КонецЕсли;
КонецПроцедуры
Код модуля формы обработки
&НаСервере
Функция ПараметрыМногопоточнойФункции()
Результат = Новый Структура();
Результат.Вставить("ТипОбработки", 0);
Результат.Вставить("ОписаниеСправочника", "");
Результат.Вставить("КомментарийДокумента", "");
Результат.Вставить("Организация", Справочники._ДемоОрганизации.ПустаяСсылка());
Результат.Вставить("ЗагружатьПорциями", Истина);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ЗапуститьМногопоток(Команда)
ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
Задание = СоздадимПотокиНаСервере(УникальныйИдентификатор);
//ИдентификаторЗадания = ПолучитьИЗВременногоХранилища(Задание.АдресРезультата).Получить("Поток 1").ИдентификаторЗадания;//Задание.ИдентификаторЗадания;
ИдентификаторЗадания = Задание.ИдентификаторЗадания;
//Сообщить(ИдентификаторЗадания);
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
Обработчик = Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
КонецПроцедуры
&НаСервере
Функция СоздадимПотокиНаСервере(УникальныйИдентификатор)
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Выполнение многопоточной функции'");
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыМетода = Новый Соответствие();
// ===== первый поток выполнения =====
КодПотока = "Поток 1";
ПараметрыПотока = ПараметрыМногопоточнойФункции();
ПараметрыПотока.ТипОбработки = "Вариант 1";
ПараметрыПотока.ОписаниеСправочника = Объект.ОписаниеСправочника;
ПараметрыПотока.КомментарийДокумента = Объект.КомментарийДокумента;
ПараметрыПотока.Организация = Объект.Организация;
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодПотока); // КодПотока
ПараметрыВызоваСервера.Добавить(ПараметрыПотока); // Параметры функции в потоке
ПараметрыМетода.Вставить(КодПотока,ПараметрыВызоваСервера);
// ===== второй поток выполнения =====
КодПотока = "Поток 2";
ПараметрыПотока = ПараметрыМногопоточнойФункции();
ПараметрыПотока.ТипОбработки = "Вариант 2";
ПараметрыПотока.ОписаниеСправочника = Объект.ОписаниеСправочника;
ПараметрыПотока.КомментарийДокумента = Объект.КомментарийДокумента;
ПараметрыПотока.Организация = Объект.Организация;
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодПотока); // КодПотока
ПараметрыВызоваСервера.Добавить(ПараметрыПотока); // Параметры функции в потоке
ПараметрыМетода.Вставить(КодПотока,ПараметрыВызоваСервера);
// ===================================
ИмяФункцииИлиПроцедуры = "ОбщийМодуль1.ПроцедураМногопоток";
ФоновоеЗадание = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(ИмяФункцииИлиПроцедуры, ПараметрыВыполнения, ПараметрыМетода);
Если ФоновоеЗадание.Статус = "Ошибка" Тогда
Сообщить(СокрЛП(ФоновоеЗадание.Статус));
КонецЕсли;
Возврат ФоновоеЗадание;
КонецФункции
&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьПрогресс(ИдентификаторЗадания)
Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
КонецФункции
&НаКлиенте
Процедура ОбработатьДанные(Задание, ДополнительныеПараметры) Экспорт
Если Задание = Неопределено Тогда
Возврат;
КонецЕсли;
ЭтаФорма.РезультатВыполнения = СокрЛП(Задание.Статус) +" "+СокрЛП(ПолучитьИЗВременногоХранилища(Задание.АдресРезультата));
КонецПроцедуры
Результат = Новый Структура();
Результат.Вставить("ТипОбработки", 0);
Результат.Вставить("ОписаниеСправочника", "");
Результат.Вставить("КомментарийДокумента", "");
Результат.Вставить("Организация", Справочники._ДемоОрганизации.ПустаяСсылка());
Результат.Вставить("ЗагружатьПорциями", Истина);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ЗапуститьМногопоток(Команда)
ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
Задание = СоздадимПотокиНаСервере(УникальныйИдентификатор);
//ИдентификаторЗадания = ПолучитьИЗВременногоХранилища(Задание.АдресРезультата).Получить("Поток 1").ИдентификаторЗадания;//Задание.ИдентификаторЗадания;
ИдентификаторЗадания = Задание.ИдентификаторЗадания;
//Сообщить(ИдентификаторЗадания);
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
Обработчик = Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
КонецПроцедуры
&НаСервере
Функция СоздадимПотокиНаСервере(УникальныйИдентификатор)
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Выполнение многопоточной функции'");
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыМетода = Новый Соответствие();
// ===== первый поток выполнения =====
КодПотока = "Поток 1";
ПараметрыПотока = ПараметрыМногопоточнойФункции();
ПараметрыПотока.ТипОбработки = "Вариант 1";
ПараметрыПотока.ОписаниеСправочника = Объект.ОписаниеСправочника;
ПараметрыПотока.КомментарийДокумента = Объект.КомментарийДокумента;
ПараметрыПотока.Организация = Объект.Организация;
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодПотока); // КодПотока
ПараметрыВызоваСервера.Добавить(ПараметрыПотока); // Параметры функции в потоке
ПараметрыМетода.Вставить(КодПотока,ПараметрыВызоваСервера);
// ===== второй поток выполнения =====
КодПотока = "Поток 2";
ПараметрыПотока = ПараметрыМногопоточнойФункции();
ПараметрыПотока.ТипОбработки = "Вариант 2";
ПараметрыПотока.ОписаниеСправочника = Объект.ОписаниеСправочника;
ПараметрыПотока.КомментарийДокумента = Объект.КомментарийДокумента;
ПараметрыПотока.Организация = Объект.Организация;
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВызоваСервера.Добавить(КодПотока); // КодПотока
ПараметрыВызоваСервера.Добавить(ПараметрыПотока); // Параметры функции в потоке
ПараметрыМетода.Вставить(КодПотока,ПараметрыВызоваСервера);
// ===================================
ИмяФункцииИлиПроцедуры = "ОбщийМодуль1.ПроцедураМногопоток";
ФоновоеЗадание = ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(ИмяФункцииИлиПроцедуры, ПараметрыВыполнения, ПараметрыМетода);
Если ФоновоеЗадание.Статус = "Ошибка" Тогда
Сообщить(СокрЛП(ФоновоеЗадание.Статус));
КонецЕсли;
Возврат ФоновоеЗадание;
КонецФункции
&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьПрогресс(ИдентификаторЗадания)
Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
КонецФункции
&НаКлиенте
Процедура ОбработатьДанные(Задание, ДополнительныеПараметры) Экспорт
Если Задание = Неопределено Тогда
Возврат;
КонецЕсли;
ЭтаФорма.РезультатВыполнения = СокрЛП(Задание.Статус) +" "+СокрЛП(ПолучитьИЗВременногоХранилища(Задание.АдресРезультата));
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник