![]() |
![]() |
![]() |
|
БСП Дополнительная обработка и Временное хранилище в фоновых заданиях | ☑ | ||
---|---|---|---|---|
0
kirillkr
28.12.16
✎
17:40
|
Добрый день.
Кто разрабатывал допобработки для БСП, которые выполняются в фоне и обмениваются данными между сеансом которые его запустил и самой процедурой в модуле обработки? Задача такая: Обработка с типом открытия формы. На форме есть параметры (Период, Организация). При нажатии на выполнение необходимо на клиенте получить по ADO данные в таблицу значений и эту таблицу значений передать в фоновое задание которое запустится потом. По результату выполнения фоновой процедуры надо получить Результат (структура). Взял пример из демо обработки БСП. На форме команда выполнить: <code> &НаКлиенте Процедура ГенерацияДокументов(Команда) Состояние(НСтр("ru = 'Загрузка прайс-листа'")); ПолучитьПрайсНаКлиенте(); МассивСтрокПрайсЛиста = СохранитьПрайсЛистВоВременноеХранилище(); // здесь переделал передачу не через адрес хранилища, а через массив структур СопровождающийТекст = НСтр("ru = 'Генерация документов'"); ИдентификаторКоманды = Команда.Имя; ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(ОбъектСсылка); ПараметрыКоманды.СопровождающийТекст = СопровождающийТекст + "..."; ПараметрыКоманды.Вставить("НачалоПериода", НачалоДня(Объект.ДатаНачала)); ПараметрыКоманды.Вставить("КонецПериода", КонецДня(Объект.ДатаОкончания)); ПараметрыКоманды.Вставить("Организация", Объект.Организация); ПараметрыКоманды.Вставить("ИдентификаторКоманды", ИдентификаторКоманды); ПараметрыКоманды.Вставить("Пользователь", ПользователиКлиентСервер.ТекущийПользователь()); ПараметрыКоманды.Вставить("ПрайсЛист", МассивСтрокПрайсЛиста); ПараметрыКоманды.Вставить("АдресХранилища", ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор)); ПараметрыКоманды.Вставить("ПолучатьРезультат", Истина); ПараметрыКоманды.Вставить("ФормаВладелец", ЭтаФорма); ПараметрыКоманды.Вставить("Результат", Неопределено); Состояние(ПараметрыКоманды.СопровождающийТекст); ОбработчикЗавершения = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, ПараметрыКоманды); Если СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда Состояние(ПараметрыКоманды.СопровождающийТекст, , , БиблиотекаКартинок.ДлительнаяОперация48); РезультатВыполнения = ВыполнитьКомандуНапрямую(ПараметрыКоманды); ВыполнитьОбработкуОповещения(ОбработчикЗавершения, РезультатВыполнения); Иначе ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ОбработчикЗавершения); КонецЕсли; КонецПроцедуры </code> <code> &НаСервере Функция ВыполнитьКомандуНапрямую(ПараметрыКоманды) РезультатВыполнения = Новый Структура("Статус, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки, Результат"); Попытка ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ПараметрыКоманды.ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект); РезультатВыполнения.Статус = "Выполнено"; Результат.Очистить(); Результат.Вывести(ПараметрыКоманды.Результат); Результат.АвтоМасштаб = Истина; Результат.ОтображатьГруппировки = Истина; Результат.ОтображатьЗаголовки = Ложь; Результат.ОтображатьСетку = Ложь; Исключение РезультатВыполнения.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); РезультатВыполнения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Возврат РезультатВыполнения; КонецФункции </code> <code> &НаКлиенте Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт Если Операция.Статус = "Выполнено" Тогда Результат = ПолучитьИзВременногоХранилища(Операция.АдресРезультата); ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст.СопровождающийТекст, БиблиотекаКартинок.Успешно32); Иначе Предупреждение = Новый Структура; Предупреждение.Вставить("Текст", Операция.КраткоеПредставлениеОшибки); Предупреждение.Вставить("Подробно", Операция.ПодробноеПредставлениеОшибки); СтандартныеПодсистемыКлиент.ВывестиПредупреждение(ЭтотОбъект, Предупреждение); КонецЕсли; КонецПроцедуры </code> Для файловой базы прекрасно работает, т.к. в процедуре модуля я записываю в переданные ей параметры Табличный Документ в Результат, а вот если через фоновые задания клиент-серверного, то все значения теряются. И передать таблицу значений в фоновое задание не получается и обратно получить результат. Как правильно поправить передачу в фоновое задание адрес с входящими результатами и адрес с результатом получаемыми данными.. Именно для дополнительных обработок!!! А не через прямой вызов Фоновых заданий, т.к. процедура генерации не в конфигурации!!! Премного благодарен за помощь... Я уже целый день бьюсь - не получается. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |