Индикатор прогресса фонового выполнения дополнительной обработки БСП

10.09.24

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

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

Скачать файл

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

Наименование Бесплатно
Индикатор прогресса фонового выполнения дополнительной обработки БСП:
.epf 8,73Kb
103
103 Скачать бесплатно

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

 

 

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

Приступим к реализации. Для примера создадим внешнюю обработку по загрузке документов с реквизитами:

  • КоличествоДокументовДляЗагрузки (Число)
  • ДатаДокументов (Дата)

 

 

В модуле объекта обработки необходимо разместить методы по регистрации внешней обработки в справочнике дополнительных отчетов и обработок, а также процедуру вызова серверного метода:

 
 1. Регистрация дополнительной обработки

 

#Область СлужебныйПрограммныйИнтерфейс

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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
	
	// Здесь будем вызывать нашу долгую процедуру
		
КонецПроцедуры

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

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

Функция ИдентификаторСерверногоМетодаОбработки() Экспорт

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

Функция ИдентификаторОткрытияФормыОбработки()

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

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

 

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

  1. Отключение безопасного режима в параметрах регистрации:
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    Т.к. при фоновом выполнении будет создаваться экземпляр внешней обработки, то безопасный режим должен быть отключен. Если не отключить, то фоновое задание будет завершено с ошибкой.
     
  2. Получение идентификатора команды вызова серверного метода:
    Функция ИдентификаторСерверногоМетодаОбработки() Экспорт
    
    Функцию по получению идентификатора команды вызова серверного метода делаем экспортной, чтобы иметь возможность передать полученный идентификатор в параметры метода фонового задания.
     
  •  
  •  
  •  
  • Отключение безопасного режима в параметрах регистрации:
     
  •  
  • Отключение безопасного режима в параметрах регистрации:
     
  •  
  • Отключение безопасного режима в параметрах регистрации:
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    Т.к. при фоновом выполнении будет создаваться экземпляр внешней обработки, то безопасный режим должен быть отключен. Если не отключить, то фоновое задание будет завершено с ошибкой
  • Получение идентификатора команды вызова серверного метода:
    Функция ИдентификаторСерверногоМетодаОбработки() Экспорт
    Функцию по получению идентификатора команды вызова серверного метода делаем экспортной, чтобы иметь возможность передать полученный идентификатор в параметры метода фонового задания.

Далее реализуем процедуру «ВыполнитьКоманду()». Проверяем полученный идентификатор и, если он совпадает с идентификатором вызова серверного метода, запускаем длительную загрузку документов:

 
 2. ВыполнитьКоманду()

 

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

 

Ниже в области служебных процедур добавляем саму длительную загрузку документов за период:

 
 3. Имитация длительной загрузки документов

 

// Параметры:
//  ПараметрыВыполнения	 - Структура - см. ВыполнитьКоманду.ПараметрыВыполнения  
//
Процедура ЗагрузитьДокументыЗаПериод(ПараметрыВыполнения)

	// Пример получения переданных параметров
	КоличествоДокументовДляЗагрузки = ПараметрыВыполнения.Контекст_КоличествоДокументовДляЗагрузки;
	ДатаДокументов                  = ПараметрыВыполнения.Контекст_ДатаДокументов;
	
	ПроцентВыполнения  = 0;
	СообщениеПрогресса = СтрШаблон("Начало загрузки документов за %1 в количетсве %2",
									ДатаДокументов, КоличествоДокументовДляЗагрузки);
			
	// Передаем информацию о прогрессе выполнения
	ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, СообщениеПрогресса);
	
	// Имитируем задержку выполнения
	Пауза();
	
	// Далее все аналогично 
	ПроцентВыполнения  = 50; 
	СообщениеПрогресса = СтрШаблон("Продолжение загрузки документов за %1 в количетсве %2",
									ДатаДокументов, КоличествоДокументовДляЗагрузки);
			
	ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, СообщениеПрогресса);
	
	Пауза();
	
	//...
	ПроцентВыполнения  = 100; 
	СообщениеПрогресса = СтрШаблон("Завершение загрузки документов за %1 в количетсве %2",
									ДатаДокументов, КоличествоДокументовДляЗагрузки);
			
	ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, СообщениеПрогресса);
	
КонецПроцедуры

Процедура Пауза()
	
	ПятьСекунд = ТекущаяДата() + 5;
	
	Пока ТекущаяДата() < ПятьСекунд Цикл
		// Имитация задержки
	КонецЦикла;
	
КонецПроцедуры

 

Здесь из интересного:

  • Получение входящих параметров:
    КоличествоДокументовДляЗагрузки = ПараметрыВыполнения.Контекст_КоличествоДокументовДляЗагрузки;
    ДатаДокументов                  = ПараметрыВыполнения.Контекст_ДатаДокументов;
    Перед запуском фонового задания мы можем добавить параметры, которые необходимы для выполнения процедуры в фоне (будет рассмотрено далее). В данном случае мы будем получать переданные дату документов и количество документов для загрузки.
     
  • И самое важное:
    ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, СообщениеПрогресса);
    Благодаря этой строчке мы сможем получать информацию о прогрессе выполнения процедуры загрузки документов на форме клиентского приложения и выводить процент выполнения на индикатор, а также сообщать дополнительную информацию из текста сообщения прогресса.
 
 Полный текст модуля объекта

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

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

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

 

 

Затем добавим два реквизита формы:

  1. ПрогрессВыполнения (Число, 3, неотрицательное)
  2. СообщениеПрогресса (Строка)

 

 

Разместим добавленные реквизиты на форме. Для элемента реквизита «ПрогрессВыполнения» укажем вид поля «Индикатор» скроем заголовок и установим свойство «Отображать проценты»:

 

 

После индикатора прогресса расположим реквизит «СообщениеПрогресса» в виде поля надписи и скроем заголовок. Также установим свойства по растягиванию элемента по горизонтали:

 

 

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

 

 

С дизайном формы закончили. Теперь можно приступать к написанию кода. Создаем клиентский обработчик команды загрузить документы:

 

 

Созданный обработчик пока оставляем пустым:

 
 4. Созданный обработчик кнопки

 

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

&НаКлиенте
Процедура ЗагрузитьДокументы(Команда)
	
КонецПроцедуры

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

 

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

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

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

 
 5. Запуск фонового выполнения загрузки документов

 

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

&НаКлиенте
Процедура ЗагрузитьДокументы(Команда)
	
	// Запускаем фоновое задание загрузки документов
	ДанныеЗадания = ЗапуститьФоновуюЗагрузкуДокументов();
	
КонецПроцедуры

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

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

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

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

 

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

ПараметрыВыполненияФоновогоЗадания.ОжидатьЗавершение = 0;
ПараметрыВыполненияФоновогоЗадания.ЗапуститьВФоне = Истина;

Ссылка на дополнительную обработку хранится в ключевом параметре «ДополнительнаяОбработкаСсылка»:

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

Идентификатор серверного метода загрузки документов получаем из экспортного метода модуля обработки:

ИдентификаторКомандыЗагрузкиДокументов = РеквизитФормыВЗначение("Объект").ИдентификаторСерверногоМетодаОбработки();

Дату и количество документов передаем из данных формы с ключами «Контекст_ДатаДокументов» и «Контекст_КоличествоДокументовДляЗагрузки»:

ПараметрыОбработкиЗагрузки.Вставить("Контекст_ДатаДокументов", Объект.ДатаДокументов);
ПараметрыОбработкиЗагрузки.Вставить("Контекст_КоличествоДокументовДляЗагрузки", Объект.КоличествоДокументовДляЗагрузки);

Напомню, данные параметры мы получаем в процедуре загрузки документов (см. модуль объекта обработки).

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

 
 6. Подключение обработчиков ожидания завершения фонового задания и отслеживания прогресса

 

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

// Выполнится после завершения фонового задания
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОповеститьОЗавершенииЗагрузки", ЭтаФорма);
	
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДанныеЗадания, ОповещениеОЗавершении, ПараметрыОжидания);

 

И две процедуры-обработчики оповещения:

 
 7. Процедуры-обработчики оповещений о ходе выполнения и завершения фонового задания

 

&НаКлиенте
Процедура ОбновитьПрогрессВыполнения(ДанныеПрогресса, ДополнительныеПараметры) Экспорт
    
    // Здесь обновляем шкалу прогресса
    Если ДанныеПрогресса.Прогресс = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПрогрессВыполнения = ДанныеПрогресса.Прогресс.Процент;
    СообщениеПрогресса = ДанныеПрогресса.Прогресс.Текст;
    
КонецПроцедуры

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

 

Из важного стоит обратить внимание на параметры ожидания:

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

Поскольку мы отслеживаем процесс выполнения самостоятельно, то окно ожидания нам не нужно. Параметр «ВыводитьОкноОжидания» отключаем.

Информацию о ходе выполнения нужно где-то получать и обрабатывать – указываем обработчик оповещения о прогрессе с именем процедуры, в которой реализовано отображение прогресса:

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

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

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

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

 

 

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

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

     

Пример обработки прикреплен к данной публикации. Тестировалось на:

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

Полезные ссылки:

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

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

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

БСП дополнительные обработки длительные операции индикатор прогресс-бар

См. также

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

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

1800 руб.

21.11.2024    3636    16    15    

18

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

Расскажу, как использовать полезный функционал - инструментарий разработчика «1С:Библиотека стандартных подсистем» (БСП) в своих объектах метаданных. Статья будет полезна как шпаргалка при написании собственных объектов метаданных.

27.12.2024    3432    PROSTO-1C    15    

43

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

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    3899    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    993    Iaskeliainen    2    

7

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

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3328    milkers    3    

12

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

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

24.10.2024    1678    PROSTO-1C    0    

18

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

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

08.10.2024    1372    PROSTO-1C    4    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rozer 312 12.09.24 12:48 Сейчас в теме
Спасибо за публикацию.
Эх, где вы были раньше? )
Не пришлось бы ковырять ОМ "ДлительныеОперации" )
Поделюсь: пришлось год назад внедрять подобное в мобильное приложение 1С:Мобильная касса но отображать не индикатор а обновлять надпись на форме с текстовой инфо о прогрессе выполнения операции.
Но там видимо попалась старая БСП и такое получение прогресса не сработает:

&НаКлиенте
Процедура ОбновитьПрогрессВыполнения(ДанныеПрогресса, ДополнительныеПараметры) Экспорт
    
    // Здесь обновляем шкалу прогресса
    Если ДанныеПрогресса.Прогресс = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПрогрессВыполнения = ДанныеПрогресса.Прогресс.Процент;
    СообщениеПрогресса = ДанныеПрогресса.Прогресс.Текст;
    
КонецПроцедуры
Показать


На всякий случай оставлю тут как решил:

&НаКлиенте
Процедура ПриПолученииПрогрессаДлительнойОперации(ДлительнаяОперация, ДополнительныеПараметры) Экспорт
	
	Лог = "";
	Если ДлительнаяОперация = Неопределено Тогда
		Возврат;	
	КонецЕсли;
	
	ОбщегоНазначенияКлиентСервер.ДополнитьТекст(Лог, 
		СтрШаблон(НСтр("ru = 'Статус обмена: %1'"), ДлительнаяОперация.Статус)); 
	Если ТипЗнч(ДлительнаяОперация.Сообщения) = Тип("ФиксированныйМассив") Тогда
		МаксИндекс = ДлительнаяОперация.Сообщения.ВГраница();
		Если МаксИндекс > 0 Тогда
			Сообщение = ДлительнаяОперация.Сообщения[МаксИндекс];
			Если СтрНачинаетсяС(Сообщение.Текст, "{") Тогда
				Позиция = СтрНайти(Сообщение.Текст, "}");
				Если Позиция > 2 Тогда
					ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2);
					Если ИдентификаторМеханизма = "СтандартныеПодсистемы.ДлительныеОперации" Тогда
						ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1);
						ОбщегоНазначенияКлиентСервер.ДополнитьТекст(Лог, ПолучитьЗначениеИзСтрокиXML(ПолученныйТекст)); 
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;	
	ИначеЕсли ТипЗнч(ДлительнаяОперация.Сообщения) = Тип("Строка") Тогда 
		ОбщегоНазначенияКлиентСервер.ДополнитьТекст(Лог, ДлительнаяОперация.Сообщения);
	КонецЕсли; 
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьЗначениеИзСтрокиXML(ПолученныйТекст)
	Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст);
	Возврат Результат.Текст;	
КонецФункции 

Показать
gucci76; MadRave; +2 Ответить
2. rin0310 14 11.12.24 15:53 Сейчас в теме
Очень хорошая публикация, благодарю.
Есть вопрос: как в приведенном функционале реализовать отправку некоего результата выполнения фонового задания из модуля доп. обработки обратно в форму?
3. MadRave 73 12.12.24 09:22 Сейчас в теме
(2) Если рассматривать в контексте примера из статьи, то в модуле объекта в процедуре "ЗагрузитьДокументыЗаПериод()" нужно добавить следующие строки:
Процедура ЗагрузитьДокументыЗаПериод(ПараметрыВыполнения)

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


Для получения результата на форме в обработчике "ОповеститьОЗавершенииЗагрузки" добавляем строки:

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


Также учитываем контекст доступности передаваемого значения на форму. Например, если мы передадим таблицу значений, то переменную Задание.АдресРезультата предварительно нужно передать в серверный метод формы и получать результат из временного хранилища уже в контексте сервера
4. rin0310 14 12.12.24 11:18 Сейчас в теме
(3)
"Это мы передадим на форму"

Спасибо большое за подробный ответ. Благодаря ему получилось передать данные на форму (в моем случае таблицу значений).
5. LevV 8 15.12.24 21:18 Сейчас в теме
Рекомендую исправить опечатку в слове "количество". Вот здесь:
СообщениеПрогресса = СтрШаблон("Начало загрузки документов за %1 в количетсве %2"
Оставьте свое сообщение