Имя: Пароль:
1C
1С v8
Как выполнить процедуру модуля внешнего отчета в фоне?
0 tciban
 
06.10.15
11:14
Уважаемые коллеги! Как выполнить процедуру модуля внешнего отчета в фоне? Лучше всего через Длительные операции БСП. Суть проблемы - есть внешний отчет на СКД, формируется долго, после формирования в результирующую таблицу надо проставить картинки, а затем сбросить все это в эксель. А пока все это делается - пользователь должен заниматься своими делами. Лучше всего - ссылку на пример дайте, ну или где такое в типовых делается. Проблем/вопросов собственно 2:
Как указать имя экспортной процедуры при вызове ДлительныеОперации.ЗапуститьВыполнениеВФоне
И второй вопрос - как выполнить компоновку СКД и вывод результата программно? пока написал в модуле внешнего отчета так:

Процедура ВыполнитьСКД(ДокументРезультат) Экспорт
    ДокументРезультат.Очистить();
    
    Настройки =    КомпоновщикНастроек.ПолучитьНастройки();
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
      
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

После выполнения, пока по кнопке формы вручную, таблицу выводит, но при этом пишет:"Отчет не сформирован, Нажмите Сформировать для получения отчета." Что я не так делаю?
1 tciban
 
06.10.15
11:48
up
2 tciban
 
06.10.15
12:06
Коллеги! Ну хоть что нибудь скажите!
3 lxndr
 
06.10.15
12:06
по 2 вопросу: замени код на СкомпоноватьРезультат(Док)
4 lxndr
 
06.10.15
12:08
Если пользователь будет заниматься своими делами, мобыть тогда ему и запускать отчет не нужно? Пусть стартует по расписанию.
5 qwerty
 
06.10.15
12:11
Фоновое выполнение длительных операций

Для того чтобы длительные операции дополнительного объекта запускались в фоновом режиме, необходимо запустить выполнение команды в фоновом задании и после его завершения принять результат.

Программный интерфейс, помогающий запускать длительные операции в фоне, представлен следующими процедурами:

1. В общем модуле ДополнительныеОтчетыИОбработкиКлиент: ВыполнитьКомандуВФоне и ПоказатьРезультатВыполненияКоманды.

2. В общем модуле ДополнительныеОтчетыИОбработки: ВыполнитьКомандуИзФормыВнешнегоОбъекта и ВыполнитьКоманду.

Рассмотрим подключение по шагам:

Шаг 1. Добавить реквизит управляемой формы для хранения ссылки внешнего объекта с типом СправочникСсылка.ДополнительныеОтчетыИОбработки. Например, «ОбъектСсылка».

Шаг 2. В обработчике события управляемой формы ПриСозданииНаСервере сохранить ссылку внешнего объекта:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Параметры.Свойство("ДополнительнаяОбработкаСсылка", ОбъектСсылка);
КонецПроцедуры

Шаг 3. Добавить функцию для выполнения команды в файловом режиме по шаблону (в блок служебных процедур и функций):
&НаСервере
Функция ВыполнитьКомандуНапрямую(ИдентификаторКоманды, ПараметрыКоманды)
    Возврат ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект);
КонецФункции

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

Шаг 5. В обработчике события управляемой формы ОбработкаВыбора добавить код для приемки результата:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ИсточникВыбора.ИмяФормы = ДополнительныеОтчетыИОбработкиКлиент.ИмяФормыДлительнойОперации() Тогда
        // Добавить код приемки результата
        ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтотОбъект, ВыбранноеЗначение);
    КонецЕсли;
КонецПроцедуры

Примечание. Длительные операции могут быть только серверными.
6 qwerty
 
06.10.15
12:12
Источник: http://its.1c.ru/
7 tciban
 
06.10.15
12:38
Я правильно понял, что это только для внешних отчетов, которые подключены через ДополнительныеОтчетыИОбработки?
8 tciban
 
06.10.15
13:15
Пример бы кто показал! Ну ничего я не понял из вышенаписанного! И теперь в отчаянии!
9 qwerty
 
06.10.15
18:50
(7) Да, по другому делать внешние отчеты не кошерно.