Фоновое формирование дополнительного отчета БСП

04.10.24

Разработка - БСП (Библиотека стандартных подсистем)

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Фоновое формирование дополнительного отчета БСП:
.erf 13,39Kb
68
68 Скачать бесплатно

Предположим, что нам поставлена задача создания дополнительного отчета. Сам алгоритм формирования отчета нестандартный и выполняется продолжительное время (например, мы получаем данные из внешних источников, анализируем результат и красиво выводим в макет схемы компоновки данных). Хорошим решением будет сделать отчет, алгоритм формирования которого выполняется в фоне и не блокирует работу пользователя. Также учтем, что стандартная форма отчета из БСП нам не подходит, и мы решаем сделать свою форму отчета.

Для решения задачи воспользуемся подсистемами «Дополнительные отчеты и обработки» и «Длительные операции». Во многом пример данной статьи будет основан на принципах запуска дополнительной обработки в фоне, которые я описывал в предыдущей публикации. Здесь также накладывается аналогичное ограничение – созданный дополнительный отчет необходимо разместить в справочнике «Дополнительные отчеты и обработки». Без этого решение не заработает.

Приступим к реализации. Первым делом открываем модуль объекта внешнего отчета и описываем алгоритм формирования отчета в обработчике «ПриКомпоновкеРезультата»:

 
Код обработчика "ПриКомпоновкеРезультата"

 

#Область ОбработчикиСобытий

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура Пауза()
	
	ФоновыйСеанс = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
	
	Если ФоновыйСеанс <> Неопределено Тогда
		ФоновыйСеанс.ОжидатьЗавершенияВыполнения(3);
	КонецЕсли;
	
КонецПроцедуры

Функция ТестовыеДанные()
	
	ТестовыеДанные = Новый ТаблицаЗначений;
	ТестовыеДанные.Колонки.Добавить("Группа", ОбщегоНазначения.ОписаниеТипаСтрока(255));
	ТестовыеДанные.Колонки.Добавить("Показатель", ОбщегоНазначения.ОписаниеТипаЧисло(10));
	
	Для Сч = 1 По 5 Цикл
		
		Группа = СтрШаблон("Группа_%1", Сч);
		
		Для Индекс = 1 По 3 Цикл
			
			Данные = ТестовыеДанные.Добавить();
			Данные.Группа = Группа;
			Данные.Показатель = Индекс;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат ТестовыеДанные;
	
КонецФункции

#КонецОбласти

 

 
Про обработчик «ПриКомпоновкеРезультата»

Алгоритм довольно простой – формируем внешний источник данных «ТестовыеДанные()» для СКД, имитируем задержку выполнения в процедуре «Пауза» и выводим результат в табличный документ.
Далее создадим макет основной схемы компоновки данных. Весь процесс довольно простой, поэтому подробно описывать не буду, детали можно посмотреть под спойлером.

 
Создание схемы компоновки данных

Сам отчет у нас готов – можно даже проверить в режиме предприятия через «Файл-Открыть» и попробовать сформировать.

Теперь реализуем методы по регистрации дополнительного отчета в справочнике «Дополнительные отчеты и обработки». Добавим следующий код в модуле объекта отчета:

 
Регистрация дополнительного отчета 
// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки

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

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

// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки

Функция ИдентификаторКомандыОткрытияФормыОтчета()
	
	Возврат Метаданные().Имя;
	
КонецФункции

Функция ИдентификаторКомандыФоновогоФормирования() Экспорт
	
	Возврат СтрШаблон("%1_ФоновоеФормирование", Метаданные().Имя);
	
КонецФункции

 

Следует обратить внимание на следующие моменты:

1. Для дополнительного отчета отключаем безопасный режим, т.к. для формирования будет использоваться фоновый сеанс с созданием экземпляра дополнительного отчета:

ПараметрыРегистрации.БезопасныйРежим = Ложь;

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

…
// Открытие формы отчета
Команда.Идентификатор = ИдентификаторКомандыОткрытияФормыОтчета();
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
…
// Фоновое формирование отчета
Команда.Идентификатор = ИдентификаторКомандыФоновогоФормирования();
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();

3. Точка входа для фонового выполнения – это процедура «ВыполнитьКоманду». Здесь мы сравниваем входящий идентификатор и передаем управление в метод «СформироватьДополнительныйОтчет» где будем запускать формирование отчета:

Если ИдентификаторКоманды = ИдентификаторКомандыФоновогоФормирования() Тогда
	СформироватьДополнительныйОтчет(ПараметрыВыполнения);
КонецЕсли;

Далее добавим в модуль объекта метод «СформироватьДополнительныйОтчет»:

 
Метод "СформироватьДополнительныйОтчет"

 

// Параметры:
//  ПараметрыВыполнения - Структура:
//    * РезультатВыполнения
//    * Контекст_АдресДанныхРасшифровки - Строка
//    * Контекст_НастройкиКомпоновки - НастройкиКомпоновкиДанных
//
Процедура СформироватьДополнительныйОтчет(ПараметрыВыполнения)
	
	КомпоновщикНастроек.ЗагрузитьНастройки(ПараметрыВыполнения.Контекст_НастройкиКомпоновки);
	
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	ДокументРезультат = Новый ТабличныйДокумент;
	
	СкомпоноватьРезультат(ДокументРезультат, ДанныеРасшифровки);
	
	ПоместитьВоВременноеХранилище(ДанныеРасшифровки, ПараметрыВыполнения.Контекст_АдресДанныхРасшифровки); 
	
	ПараметрыВыполнения.РезультатВыполнения.Вставить("ДокументРезультат", ДокументРезультат);
	
КонецПроцедуры

 

В этой процедуре мы формируем отчет и результат формирования помещаем в структуру, которую затем сможем получить после выполнения фонового формирования отчета. На вход процедуре поступает структура параметров, в которой:

  • РезультатВыполнения – это структура, в которую мы можем поместить результат выполняемой команды (см. описание программного интерфейса ДополнительныеОтчетыИОбработки.ВыполнитьКоманду ()). Сюда мы поместим сформированный табличный документ с результатом отчета.
  • Контекст_АдресДанныхРасшифровки – это наш параметр, переданный из клиентской формы в фоновое задание формирования отчета. Здесь содержится адрес временного хранилища, по которому нужно расположить данные расшифровки сформированного отчета.
  • Контекст_НастройкиКомпоновки – также наш параметр. Здесь содержатся настройки отчета, которые установил пользователь. Полученные настройки нужно загрузить в компоновщик настроек отчета, чтобы результат соответствовал установленным настройкам пользователя.

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

КомпоновщикНастроек.ЗагрузитьНастройки(ПараметрыВыполнения.Контекст_НастройкиКомпоновки);

Теперь можно сформировать отчет. Формируем отчет через вызов стандартного метода «СкомпоноватьРезультат» объекта «ВнешнийОтчет» (см. синтаксис-помощник: ВнешнийОтчет.СкомпоноватьРезультат):

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
ДокументРезультат = Новый ТабличныйДокумент;
	
СкомпоноватьРезультат(ДокументРезультат, ДанныеРасшифровки);

Помещаем данные расшифровки во временное хранилище по переданному адресу (как получить и передать этот адрес будет рассмотрено далее). Если этого не сделать, то не будет возможности работы с расшифровкой отчета:

ПоместитьВоВременноеХранилище(ДанныеРасшифровки, ПараметрыВыполнения.Контекст_АдресДанныхРасшифровки);

Итоговый табличный документ помещаем в структуру «РезультатВыполнения». Именно эту структуру мы получим как результат фонового задания по формированию отчета:

ПараметрыВыполнения.РезультатВыполнения.Вставить("ДокументРезультат", ДокументРезультат);
 
Код модуля объекта 

Теперь приступим к созданию формы отчета. Добавим основную форму отчета:

Наша основная задача на текущем этапе – переопределить команду кнопки «Сформировать». Сейчас по нажатию этой кнопки отчет формируется в основном «потоке» пользователя и блокирует интерфейс (т.е. выполняется стандартная компоновка):


Самый очевидный вариант – это добавить свою кнопку «Сформировать» при нажатии на которую запускается формирование отчета в фоне. Именно так мы и поступим. А чтобы добавленная кнопка не вызывала подозрения и выглядела как стандартная, придется проявить чудеса смекалки и находчивости. Если интересно – подробности под спойлером.

 
Добавление своей кнопки "Сформировать" 

Для формы в разделе «Параметры» добавляем два ключевых параметра:

  • ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки)
  • ИдентификаторКоманды (Строка)


Теперь приступим к созданию процедуры запуска фонового формирования отчета. Для кнопки «Сформировать» создадим клиентский обработчик, пока оставим пустым:


 
 Обработчик кнопки "Сформировать"

 

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Сформировать(Команда)
	
	
	
КонецПроцедуры

#КонецОбласти

 

Теперь подумаем, как запустить фоновое формирование отчета. В этом нам поможет программный интерфейс «ДлительныеОперации.ВыполнитьФункцию()». Данный метод выполняет запуск фонового выполнения переданной функции. Через указанный интерфейс мы запустим функцию «ДополнительныеОтчетыИОбработки.ВыполнитьКоманду()» с параметрами нашего отчета и идентификатором команды фонового формирования. Тем самым вызовем метод «ВыполнитьКоманду» модуля объекта нашего отчета в фоновом задании, а следовательно, сформируем отчет также в фоне.

Как мы помним, в процедуру формирования отчета нам также необходимо передать текущие установленные настройки отчета и адрес временного хранилища для данных расшифровки (напомню это параметры «Контекст_НастройкиКомпоновки» и «Контекст_АдресДанныхРасшифровки»).

Добавим в модуль формы функцию «ЗапуститьФоновоеФормированиеОтчета» реализующую описанный алгоритм:

 
ЗапуститьФоновоеФормированиеОтчета 

 

&НаСервере
Функция ЗапуститьФоновоеФормированиеОтчета()
	
	ПараметрыФоновогоЗадания = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	ПараметрыФоновогоЗадания.ОжидатьЗавершение = 0;
	ПараметрыФоновогоЗадания.ЗапуститьВФоне = Истина;
	
	ИдентификаторКомандыФоновогоВыполнения = РеквизитФормыВЗначение("Отчет").ИдентификаторКомандыФоновогоФормирования();
	ДанныеРасшифровки = ПоместитьВоВременноеХранилище("", УникальныйИдентификатор);
	
	ПараметрыФункции = Новый Структура;
	ПараметрыФункции.Вставить("ДополнительнаяОбработкаСсылка", Параметры.ДополнительнаяОбработкаСсылка);
	ПараметрыФункции.Вставить("ИдентификаторКоманды", ИдентификаторКомандыФоновогоВыполнения);
	ПараметрыФункции.Вставить("Контекст_АдресДанныхРасшифровки", ДанныеРасшифровки);
	ПараметрыФункции.Вставить("Контекст_НастройкиКомпоновки", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
	
	ИмяФункции = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыФоновогоЗадания, ИмяФункции, ПараметрыФункции);
	
КонецФункции

 

Для того чтобы просто запустить выполнение формирования отчета в фоне, не дожидаясь завершения, указываем следующие параметры для фонового задания:

ПараметрыФоновогоЗадания = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
ПараметрыФоновогоЗадания.ОжидатьЗавершение = 0;
ПараметрыФоновогоЗадания.ЗапуститьВФоне = Истина;

Для функции «ДополнительныеОтчетыИОбработки.ВыполнитьКоманду» обязательными являются параметры «ДополнительнаяОбработкаСсылка» и «ИдентификаторКоманды». Ссылка на обработку отчета хранится в одноименном ключевом параметре формы отчета, а идентификатор команды мы получим, вызвав соответствующий экспортный метод модуля объекта отчета:

ИдентификаторКомандыФоновогоВыполнения = РеквизитФормыВЗначение("Отчет").ИдентификаторКомандыФоновогоФормирования();
…
ПараметрыФункции = Новый Структура;
ПараметрыФункции.Вставить("ДополнительнаяОбработкаСсылка", Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыФункции.Вставить("ИдентификаторКоманды", ИдентификаторКомандыФоновогоВыполнения);

Адрес временного хранилища, в который будут помещены данные расшифровки сформированного отчета присваиваем реквизиту формы «ДанныеРасшифровки» и передаем этот адрес в параметре «Контекст_АдресДанныхРасшифровки» (используется в процедуре «СформироватьДополнительныйОтчет()» модуля объекта)

ДанныеРасшифровки = ПоместитьВоВременноеХранилище("", УникальныйИдентификатор);
…	
ПараметрыФункции.Вставить("Контекст_АдресДанныхРасшифровки", ДанныеРасшифровки);

Текущие настройки отчета передаем в параметре «Контекст_НастройкиКомпоновки» (используется в процедуре «СформироватьДополнительныйОтчет()» модуля объекта):

ПараметрыФункции.Вставить("Контекст_НастройкиКомпоновки", Отчет.КомпоновщикНастроек.ПолучитьНастройки());

И запускаем фоновое выполнение функции «ДополнительныеОтчетыИОбработки.ВыполнитьКоманду» с установленными параметрами:

ИмяФункции = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыФоновогоЗадания, ИмяФункции, ПараметрыФункции);

Теперь вернемся к клиентскому обработчику кнопки «Сформировать» и вставим в тело процедуры следующий код:

 
Код обработчика кнопки "Сформировать" 

 

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

 

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

 
Про установку состояния отчета 

Чтобы не отображать стандартное окно ожидания длительной операции, устанавливаем соответствующий параметр в значение «Ложь»:

ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;

После завершения формирования отчета будет вызвана экспортная процедура модуля формы, указанная в описании оповещения о завершении:

ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеФормированияОтчета", ЭтаФорма); 

Добавим в модуль формы реализацию экспортной процедуры «ПослеФормированияОтчета»:

 
Обработчик оповещения "ПослеФормированияОтчета" 

 

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

 

Этот обработчик для нас важен тем, что здесь происходит получение сформированного табличного документа:

Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата).ДокументРезультат; 

Напомню, что табличный документ с результатом отчета мы помещали в структуру РезультатВыполнения в процедуре модуля объекта «СформироватьДополнительныйОтчет()». Именно этот табличный документ мы и получили в обработчике «ПослеФормированияОтчета».

 
Полный код модуля формы

Все готово. Можно добавлять отчет в справочник и проверять:

Отображение прогресса выполнения отчета.

Основную задачу мы выполнили. На текущий момент отчет формируется у нас в фоне и не блокирует интерфейс пользователя. Напоследок предлагаю добавить интересный функционал – отображение прогресса выполнения отчета. Для этого нам понадобится немного доработать обработчик команды кнопки «Сформировать» и добавить пару строк кода в событие «ПриКомпоновкеРезультата» в модуле объекта.

Начнем с обработчика события «ПриКомпоновкеРезультата» модуля объекта. Для передачи информации о прогрессе выполнения воспользуемся функцией:

ДлительныеОперации.СообщитьПрогресс()

После каждого вызова добавим паузу:

 
Обработчик события "ПриКомпоновкеРезультата" модуля объекта 

 

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

 

А в клиентском обработчике кнопки «Сформировать» укажем описание оповещения процедуры, в которой будем обрабатывать сообщения прогресса. Это оповещение необходимо передать в параметре ожидания «ОповещениеОПрогрессеВыполнения»:

ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПослеПолученияПрогресса", ЭтаФорма);
 
Обработчик команды "Сформировать" модуля формы 

 

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

 

Добавим в модуль формы реализацию процедуры «ПослеПолученияПрогресса»:

 
"ПослеПолученияПрогресса" 

 

&НаКлиенте
Процедура ПослеПолученияПрогресса(ДанныеПрогресса, ДополнительныеПараметры) Экспорт
	
	Если ДанныеПрогресса.Прогресс = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Процент = ДанныеПрогресса.Прогресс.Процент;
	Текст = ДанныеПрогресса.Прогресс.Текст;
	
	ОтображениеСостояния = Элементы.Результат.ОтображениеСостояния;
	ОтображениеСостояния.Текст = СтрШаблон("Выполнено %1%%. %2", Процент, Текст);
	
КонецПроцедуры

 

 

 
Полный код модуля формы
 
Полный код модуля объекта 

Теперь можно обновлять отчет в справочнике и проверять выполнение:

Пример отчета прикреплен к данной публикации.

Тестировалось на:

  • БСП 3.1.6.100
  • Управление торговлей (Демо) 11.5.12.256

Спасибо за внимание!

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.6.100

дополнительный отчет БСП фоновое формирование отчета

См. также

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1066    PROSTO-1C    0    

12

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    975    PROSTO-1C    4    

10

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

10.09.2024    1812    MadRave    1    

17

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1251    n_mezentsev    10    

8

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4099    John_d    10    

52

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5347    PROSTO-1C    12    

52
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Viktor_Ermakov 369 07.10.24 10:13 Сейчас в теме
Уважаемый автор, я конечно не осилил весь текст прочитать, хочу уточнить, в статье на ИТС в разделе по этой тематике, чего то не хватает?
2. MadRave 67 07.10.24 16:03 Сейчас в теме
(1) К сожалению, при использовании программного интерфейса ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне мы не сможем скрыть стандартное окно ожидания длительной операции (пример в прикрепленном скриншоте).
Также при использовании этого интерфейса невозможно указать параметры, значения которых доступны только в контексте сервера. В нашем примере это настройки компоновки данных, которые мог изменить пользователь на форме (параметр "Контекст_НастройкиКомпоновки" из примера статьи).
Ещё одно ограничение ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне() - нельзя назначить обработчик отслеживания прогресса выполнения отчета.

Про методы "ВыполнитьКомандуИзФормыВнешнегоОбъекта" и "ВыполнитьКоманду" хоть и сказано, но не показано примера как с их помощью выполнить отчет в фоне.
Прикрепленные файлы:
3. Xershi 1555 08.10.24 00:20 Сейчас в теме
А я просто типовую форму использую и там есть процедуры, которые в модуль доп. отчёта выводишь и бсп всё за тебя сделает.
RocKeR_13; +1 Ответить
6. RocKeR_13 1366 09.10.24 10:16 Сейчас в теме
(3) Уточнение: если в сведениях указать БезопасныйРежим = Истина, то отчет будет формироваться не в фоне)
7. Xershi 1555 09.10.24 12:09 Сейчас в теме
(6) по моему у меня была в истина и формирование было с колесом. Но это не точно.
8. RocKeR_13 1366 09.10.24 13:27 Сейчас в теме
(7) Неа, в безопасном режиме внешние отчеты выполняются непосредственно (скрины модуля общей формы "ФормаОтчета")
Прикрепленные файлы:
10. Xershi 1555 09.10.24 13:48 Сейчас в теме
(8) спасибо за развернутый ответ!
...
ПараметрыРегистрации.Вставить("БезопасныйРежим",			Истина);
...

// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения - Форма отчета.
//   КлючВарианта - Строка - Имя предопределенного варианта отчета или уникальный идентификатор пользовательского.
//   Настройки - см. ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	// Для выполнения в фоне!
	Настройки.ФормироватьСразу = Ложь;
	
	Настройки.События.ПриСозданииНаСервере = Истина;
	Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
	
КонецПроцедуры
Показать

Действительно кружок не вылез, не отрабатывает ФормироватьСразу = Ложь!
Поставил параметр в ложь и был кружок.
11. RocKeR_13 1366 09.10.24 13:51 Сейчас в теме
9. RocKeR_13 1366 09.10.24 13:33 Сейчас в теме
(7) Даже вот так)
Прикрепленные файлы:
4. BackinSoda 08.10.24 08:33 Сейчас в теме
Что обычно делают люди, пока у них "фоново" формируется отчет ?)
starponyx; SerVer1C; +2 Ответить
5. AndreyShitov 08.10.24 11:01 Сейчас в теме
(4) наполняют справочники и создают документы.
Оставьте свое сообщение