Приветствую Вас ГостьПятница, 19.09.2025, 14:36

Каталог статей


БСП. Запустить доп обработку в фоновом режиме

В БСП есть предустановленный функционал для запуска дополнительной обработки в фоновом режиме. Мы рассматриваем тот случай, когда запуск обработки выполняется на клиенте.

Необходимое условие: обработка должна быть добавлена в справочник ДополнительныеОтчетыИОбработки.

далее в модуле формы в команде кнопки выполнения добавляем текст:

//Для выполнение на серевере в фоновом режиме

 ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
 СопровождающийТекст = НСтр("ru = 'Выполняется обработка...'");
 ПараметрыКоманды.СопровождающийТекст = СопровождающийТекст;
 Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
 ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик);

Пояснения:

Параметры.ДополнительнаяОбработкаСсылка - это ссылка на справочник ДополнительныеОтчетыИОбработки

По этой ссылке формируем параметры команды. 

Далее задаем текст сообщения пользователю вида "процесс идет..."

Вызываем процедуру ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(), которая будет возвращать в экспортную клиентскую процедуру ПослеЗавершенияДлительнойОперации() результат выполнения обработки

// Перехват окончания фонового выполнения
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
 // Добавить код приемки результата.
 // Например:
 Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
 Попытка
 ВладелецФормы.Прочитать();
 Исключение
 // Значит это форма списка.
 КонецПопытки;
 КонецЕсли;
 Если Открыта() Тогда
 Закрыть();
 КонецЕсли;
 Если Операция.Статус = "Выполнено" Тогда
 ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст, БиблиотекаКартинок.Успешно32);
 Иначе
 ПоказатьПредупреждение(, Операция.КраткоеПредставлениеОшибки);
 КонецЕсли;
КонецПроцедуры

 

Есть нюанс, как же без них...

В параметры обработки в фоне не передаются на прямую данные из формы. Так что если нам надо, чтобы были определены параметры выполнения обработки, то их надо передать через хранилище значений. 

Для этого в модуле формы добавляем код для записи значений реквизитов формы в хранилище:

&НаСервере
Процедура СохранитьНастройкиФормы()
    
    Если ЗначениеЗаполнено(Объект.ДополнительнаяОбработкаСсылка) Тогда
    
     Настройки = Новый Соответствие;
     //положим все значения реквизитов обработки
     ОбъектОбработки = РеквизитФормыВЗначение("Объект");
        Для каждого ОписаниеРеквизита Из ОбъектОбработки.Метаданные().Реквизиты Цикл
         Настройки.Вставить(ОписаниеРеквизита.Имя,Объект[ОписаниеРеквизита.Имя]);    
        КонецЦикла; 
        
        
        Попытка
            ЗаблокироватьДанныеДляРедактирования(Объект.ДополнительнаяОбработкаСсылка);
        Исключение
            ТекстОшибки = НСтр("ru='Не удалось заблокировать %Объект%. %ОписаниеОшибки%'");
            ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Объект%", Объект.ДополнительнаяОбработкаСсылка);
            ТекстОшибки = СтрЗаменить(ТекстОшибки, "%ОписаниеОшибки%", КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Объект.ДополнительнаяОбработкаСсылка);
            Возврат;
        КонецПопытки;

        ДополнительнаяОбработкаОбъект = Объект.ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
        ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки);
        ДополнительнаяОбработкаОбъект.Записать();
        
    КонецЕсли;

КонецПроцедуры

В модуле обработки в процедуре ВыполнитьКоманду, перед кодом самой обработки добавляем считывание настроек:

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    ДополнительнаяОбработкаСсылка = ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка;
    ХранилищеНастроек = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДополнительнаяОбработкаСсылка,"ХранилищеНастроек");
    Настройки = ХранилищеНастроек.Получить();
    
    ФлНетРеквизитов = Истина; 
        
    Если Настройки <> Неопределено Тогда
        Для каждого ЭлементНастроек Из Настройки Цикл
            ЭтотОбъект[ЭлементНастроек.Ключ] = ЭлементНастроек.Значение;
            ФлНетРеквизитов = Ложь;
        КонецЦикла; 
    КонецЕсли;     
        
    ВыполнитьФункционал(ИдентификаторКоманды); //там - сама обработка

КонецПроцедуры
Если реквизитов в хранилище нет, то переменная ФлНетРеквизитов = Истина, и надо определить настройки по умолчанию.

Шаблон внешней обработки можно скачать здесь.

 

 

Категория: Программирование | Добавил: leshic (13.08.2025)
Просмотров: 7 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [52]
Регистры [7]
Формы [48]
Администрирование [51]
Запросы [11]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [54]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0