Имя: Пароль:
1C
1С v8
БСП Дополнительная обработка и Временное хранилище в фоновых заданиях
0 kirillkr
 
28.12.16
17:40
Добрый день.
Кто разрабатывал допобработки для БСП, которые выполняются в фоне и обмениваются данными между сеансом которые его запустил и самой процедурой в модуле обработки?

Задача такая: Обработка с типом открытия формы. На форме есть параметры (Период, Организация). При нажатии на выполнение необходимо на клиенте получить по ADO данные в таблицу значений и эту таблицу значений передать в фоновое задание которое запустится потом.
По результату выполнения фоновой процедуры надо получить Результат (структура).

Взял пример из демо обработки БСП.
На форме команда выполнить:
<code>
&НаКлиенте
Процедура ГенерацияДокументов(Команда)
    Состояние(НСтр("ru = 'Загрузка прайс-листа'"));
    ПолучитьПрайсНаКлиенте();
    МассивСтрокПрайсЛиста = СохранитьПрайсЛистВоВременноеХранилище(); // здесь переделал передачу не через адрес хранилища, а через массив структур
    
    СопровождающийТекст = НСтр("ru = 'Генерация документов'");
    ИдентификаторКоманды = Команда.Имя;

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

<code>
&НаСервере
Функция ВыполнитьКомандуНапрямую(ПараметрыКоманды)
    РезультатВыполнения = Новый Структура("Статус, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки, Результат");
    Попытка
        ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ПараметрыКоманды.ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект);
        РезультатВыполнения.Статус = "Выполнено";
        Результат.Очистить();
        Результат.Вывести(ПараметрыКоманды.Результат);
        Результат.АвтоМасштаб            = Истина;
        Результат.ОтображатьГруппировки    = Истина;
        Результат.ОтображатьЗаголовки    = Ложь;
        Результат.ОтображатьСетку        = Ложь;
    Исключение
        РезультатВыполнения.КраткоеПредставлениеОшибки   = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        РезультатВыполнения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    Возврат РезультатВыполнения;
КонецФункции
</code>

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

Для файловой базы прекрасно работает, т.к. в процедуре модуля я записываю в переданные ей параметры Табличный Документ в Результат, а вот если через фоновые задания клиент-серверного, то все значения теряются. И передать таблицу значений в фоновое задание не получается и обратно получить результат.
Как правильно поправить передачу в фоновое задание адрес с входящими результатами и адрес с результатом получаемыми данными..
Именно для дополнительных обработок!!! А не через прямой вызов Фоновых заданий, т.к. процедура генерации не в конфигурации!!!
Премного благодарен за помощь... Я уже целый день бьюсь - не получается.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший