dlitelnye_operacii._fonovye_vypolnenija_bsp

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
dlitelnye_operacii._fonovye_vypolnenija_bsp [2024/05/03 10:12]
tro
dlitelnye_operacii._fonovye_vypolnenija_bsp [2025/08/29 06:30] (текущий)
tro
Строка 1: Строка 1:
-====== Вариант 1 ======+====== Вариант 1 (БСП с отслеживанием результата выполнения)======
 В общем виде процесс запуска и обработки результата длительной операции в модуле формы выглядит следующим образом: В общем виде процесс запуска и обработки результата длительной операции в модуле формы выглядит следующим образом:
  
   * 1) Процедура, которая будет исполняться в фоне, располагается в модуле менеджера объекта или в серверном общем модуле:   * 1) Процедура, которая будет исполняться в фоне, располагается в модуле менеджера объекта или в серверном общем модуле:
-  * **P.S. ОБЯЗАТЕЛЬО ДВА ПАРАМЕТРА ДОЛЖА ПРИНИМАТЬ ВІПОЛНЯЕМАЯ В ФОНЕ** +  * **P.S. ОБЯЗАТЕЛЬО ТОЛЬКО ДВА ПАРАМЕТРА ДОЛЖА ПРИНИМАТЬ ВІПОЛНЯЕМАЯ В ФОНЕ ПРОЦЕДУРА** 
 <code> <code>
-Процедура ВыполнитьРасчет(Знач МойПараметр1, Знач МойПараметр2Экспорт +Процедура ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности(СтруктураПараметровПроцедуры, СтруктураПараметровФоновогоВызова) Экспорт   
-   ... +  
-КонецПроцедуры+ //1. проверки 
 + Если СтруктураПараметровПроцедуры.отказ ИЛИ СтруктураПараметровПроцедуры.мКОнтрагентСсылка.Ссылка.Пустая() ИЛИ СтруктураПараметровПроцедуры.мКОнтрагентСсылка.НеКонтролироватьАктуальностьПоПактум Тогда  
 + Возврат; 
 + КонецЕсли; 
 + Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней = РегистрыСведений.РегистрКонстант.ПолучитьЗначениеКонстанты("Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней");  
 + Если не ЗначениеЗаполнено(Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней) Тогда Возврат; КонецЕсли; 
 +  
 +  
 +  
 + //2. Получаем данные по последнему обновлению и проверяем актуальность по колич ву пройденноных дней с последнего обновления с пактум 
 + Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении = РегистрыСведений.РегистрКонстант.ПолучитьЗначениеКонстанты("Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении").Получить(); 
 + КолВоДнейСПоследнегоОбновления = РегистрыСведений.ИсторияОбновленияДанныхСПактум.ПолучитьКоличествоДнейОтДатыОбновленияДаныхСПактум(СтруктураПараметровПроцедуры.мКОнтрагентСсылка)
 + 
 +  
 + //3. Перезаполняем контрагента по данным пактум 
 + Если КолВоДнейСПоследнегоОбновления > Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней Тогда  
 + ОшибкиПриЗаполнении = ""; 
 + Пактум_Сервер.ПроверитьИПерезаполнитьКОнтрагентаДаннымиСПактум(СтруктураПараметровПроцедуры.мКОнтрагентСсылка, Истина,СтруктураПараметровПроцедуры.ДатаПолученияДанныхСПактум, СтруктураПараметровПроцедуры.ИсточникПолученияДанныхСПактум, ОшибкиПриЗаполнении, Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении);  
 + КонецЕсли; 
 +  
 +КонецПроцедуры 
 </code> </code>
  
-2) Запуск операции на сервере и подключение обработчика ожидания (при необходимости):+2) Вызов на клиенте запуска фонового:
 <code> <code>
 &НаКлиенте &НаКлиенте
-Процедура ВыполнитьРасчет() +Процедура ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности_НаКлиенте() 
-   ДлительнаяОперация = НачатьВыполнениеНаСервере(); +  
-   ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект)+ СтруктураФоновогоЗадания  = НачатьВыполнениеОбновленияПактумНаСервере(ЭтотОбъект.УникальныйИдентификатор); 
-   ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ИДЗадания  = СтруктураФоновогоЗадания.ИдентификаторЗадания
-   ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);+  
 + ПараметрыОжидания   = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); 
 + ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; 
 +                ПараметрыОжидания.ВыводитьОкноОжидания          = Ложь; 
 + ПараметрыОжидания.Интервал  = 2; 
 +  
 + ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания); 
 +
 КонецПроцедуры КонецПроцедуры
 +
 </code> </code>
  
 <code> <code>
 &НаСервере &НаСервере
-Функция НачатьВыполнениеНаСервере() +Функция НачатьВыполнениеОбновленияПактумНаСервере(УникальныйИдентификатор)  
-   Возврат ДлительныеОперации.ВыполнитьПроцедуру(,бработки.МояОбработка.ВыполнитьРасчет", +  
-   МойПараметр1, МойПараметр2);+ ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); 
 + ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Получение данных в ПАКТУМ при смене контрагента в заказе клиента";  
 + ПараметрыВыполнения.КлючФоновогоЗадания         = ""+ЭтаФорма.УникальныйИдентификатор+", "+XMLСтрока(Объект.Контрагент); 
 + ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор); 
 +  
 + СтруктураПараметровПроцедуры = Новый Структура; 
 + СтруктураПараметровПроцедуры.Вставить("отказ",Ложь); 
 + СтруктураПараметровПроцедуры.Вставить("мКОнтрагентСсылка",Объект.Контрагент);  
 + СтруктураПараметровПроцедуры.Вставить("ДатаПолученияДанныхСПактум",ТекущаяДата()); 
 + СтруктураПараметровПроцедуры.Вставить("ИсточникПолученияДанныхСПактум","При смене контрагента в заказе клиента"); 
 +  
 + СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне("Пактум_Сервер.ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности", СтруктураПараметровПроцедуры, ПараметрыВыполнения); 
 +  
 + Возврат СтруктураФоновогоЗадания; 
 +  
 +
 КонецФункции КонецФункции
 +
 </code> </code>
  
Строка 32: Строка 76:
 <code> <code>
 &НаКлиенте &НаКлиенте
-Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт +Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт 
-   Если Результат = Неопределено Тогда + 
-       Возврат; + Если Результат = Неопределено Тогда 
-   КонецЕсли; + Возврат; 
-   ПриЗавершенииРасчета();+ ИначеЕсли Результат.Статус = "Ошибка" Тогда 
 + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Произошла ошибка при получении данных по контрагенту с сервиса ПАКТУМ'; uk = 'Відбулася помилка при отриманні даних щодо контрагенту з сервісу ПАКТУМ'")); 
 + ИначеЕсли Результат.Статус = "Выполнено" Тогда 
 + ПоказатьПредупреждениеПоПроблемномуПартнеруКОнтрагенту();  
 + КонецЕсли; 
 +
 КонецПроцедуры КонецПроцедуры
 +
 </code> </code>
  
-<code> 
-&НаСервере 
-Функция ЗапуститьФоновуюОтправкуФайлов() 
- 
-   ОтправляемыеФайлы = Новый Массив; 
-   Для Каждого Файл Из Файлы.ПолучитьЭлементы() Цикл 
- 
-       ОписаниеФайла = Новый Структура; 
-       ОписаниеФайла.Вставить("ИмяФайла", Файл.Наименование); 
-       ОписаниеФайла.Вставить("ДатаИзменения"); 
-       ОписаниеФайла.Вставить("Каталог"); 
-       ОписаниеФайла.Вставить("ДвоичныеДанные", ПолучитьИзВременногоХранилища(Файл.Адрес)); 
- 
-       ОтправляемыеФайлы.Добавить(ОписаниеФайла); 
-   КонецЦикла; 
- 
-   ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(); 
-   ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Отправка файлов в сервиса распознавания документов'"); 
- 
-   ФоновоеЗадание = ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, 
-"Обработки.РаспознаваниеДокументов.ОтправитьФайлыНаРаспознавание", ОтправляемыеФайлы); 
- 
-   Возврат ФоновоеЗадание; 
- 
-КонецФункции; 
-</code> 
 ====== Вариант 2 (БСП. Для вызова с сервера без отслеживания выполнения) ====== ====== Вариант 2 (БСП. Для вызова с сервера без отслеживания выполнения) ======
 1. Необходимая на выоплнение процедура должна быть экспортной и обязательно иметь два параметра 1. Необходимая на выоплнение процедура должна быть экспортной и обязательно иметь два параметра
Строка 77: Строка 101:
 &НаСервере &НаСервере
 Процедура тестАсинхроннойОтправкиНаСервере() Процедура тестАсинхроннойОтправкиНаСервере()
- результат = ДлительныеОперации.ВыполнитьВФоне("Доработки_Сервер.ОтправитьДанныеООтмеченныхВхНДПоЗаказам",Новый Структура,ДлительныеОперации.ПараметрыВыполненияВФоне(Неопределено));+ результат = ДлительныеОперации.ВыполнитьВФоне("Доработки_Сервер.ОтправитьДанныеООтмеченныхВхНДПоЗаказам",Структура_ПередаваемыеПараметрыПроцедуры,ДлительныеОперации.ПараметрыВыполненияВФоне(Неопределено));
 КонецПроцедуры КонецПроцедуры
 </code> </code>
-====== Вариант 3 ====== +
-**в БСП вместо длительных операций уже рекомендуется применять "ВыполнитьПроцедуру" или "ВыполнитьФункцию"**+
  • /sites/data/attic/dlitelnye_operacii._fonovye_vypolnenija_bsp.1714731126.txt.gz
  • Последнее изменение: 2024/05/03 10:12
  • tro