БСП 2.3 и БСП 3.0: Просто про выполнение внешней обработки в фоне (c индикацией прогресса выполнения)

20.09.19

Разработка - Инструментарий разработчика

Простое пояснение о том, как сделать внешнюю обработку с фоновым выполнением и индикацией процесса для любой конфигурации на основе БСП 2.3.2. UPDATE 20/09/19: добавлен вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.

Файлы

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

Наименование Скачано Купить файл
(только для физ. лиц)
старый вариант для БСП 2.3
.epf 7,86Kb
149 1 850 руб. Купить
новый вариант для БСП 3.0
.epf 7,80Kb
136 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Не секрет, что после запуска "тяжелой" обработки хочется продолжать работать в программе, а также "видеть" время от времени сам процесс выполнения. Для простого пояснения, как это реализовано, и предназначена эта статья. Если ваша конфигурация не на БСП 2.3.2, можно сразу перейти, например, на эту статью //infostart.ru/public/157706/ 

Важно! Обработка должна использоваться только через штатный механизм БСП "Дополнительные отчеты и обработки".

Код модуля обработки

Примечание: обработку можно запустить как из формы (см. представление команды "Открыть форму и выполнить в фоне с индикацией") так и сразу на сервере (см представление команды "Выполняем на сервере"). Запуск непосредственно на сервере можно сделать по расписанию.

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

// Интерфейс для выполнения команд обработки.
Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт
	ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000*10;
	
	Попытка
		СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
		ПараметрыВыполнения.РезультатВыполнения,
		НСтр("ru = 'Выполнена длит. операция!'"),,
		БиблиотекаКартинок.Успешно32);
	Исключение
		СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке(
		ПараметрыВыполнения.РезультатВыполнения,
		СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды),
		ИнформацияОбОшибке());
		Возврат;
	КонецПопытки;
	
	 //Имитация длительной операции - вместо этого вставте свой код который будет выполняться на сервере в фоне
	Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл
	КонецЦикла;
КонецПроцедуры

Код модуля формы обработки

Важно добавить в форму эти параметры:

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

.. и эти реквизиты:

  • ОбъектСсылка (тип "СправочникСсылка.ДополнительныеОтчетыИОбработки")
  • ИдентификаторКоманды (тип "Строка")
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ОбъектСсылка = Параметры.ДополнительнаяОбработкаСсылка;
	ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
КонецПроцедуры

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

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

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

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

Примечание: для формы нужно назначить обработчики событий для процедур "ПриСозданииНаСервере" и "ОбработкаВыбора".

Вот, собственно, и все...

З.Ы. Для тех, кому недостаточно "простого" описания и кто хочет подробно разобраться в предмете - см. описание с ИТС

 

UPDATE 20/09/19: добавил вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.

Немного тут подсмотрел

Модуль обработки:

Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	
	Если ИмяКоманды = "ОткрытьФормуОбработку" Тогда
		
		ВремяФиниша = ТекущаяДатаСеанса() + 100;
		Пока ТекущаяДатаСеанса() < ВремяФиниша Цикл
			Процент = 100 - (ВремяФиниша - ТекущаяДатаСеанса());
			Если НЕ (Процент % 10)  Тогда
				ДлительныеОперации.СообщитьПрогресс(Процент, СтрШаблон("Выполнено %1 процентов: пример параметра команды = %2", Процент,ПараметрыВыполнения.СвойПараметр));
			КонецЕсли;
		КонецЦикла; 
		
	КонецЕсли;
	
КонецПроцедуры

Модуль формы:

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

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

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

КонецПроцедуры

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

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

фоновое выполнение внешняя обработка длительная операция БСП

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    202808    1116    410    

1022

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    35755    206    104    

196

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    24008    62    26    

92

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

16000 руб.

10.11.2023    16491    69    39    

88

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

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

9360 руб.

17.05.2024    34717    123    53    

165

SALE! 30%

Инструментарий разработчика WEB-интеграция 1С v8.3 1C v8.2 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Инструмент для генерации OpenApi (Swagger) спецификаций на основании файлов конфигураций 1С. Это консольное и десктопное приложение на языке Rust с полноценным редактором кода, содержащим автозамену и подсвечивание ошибок для быстрого и безошибочного написания документирующего комментария.

18000 12600 руб.

22.11.2024    1790    1    0    

8

Инструментарий разработчика Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

6000 руб.

07.02.2018    107179    249    100    

313

Инструментарий разработчика 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    2880    6    0    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Fragster 1159 19.05.16 11:50 Сейчас в теме
Добавьте в пример вывод прогресс-бара
2. rozer 313 19.05.16 17:22 Сейчас в теме
(1) Fragster, можно конечно как тут http://infostart.ru/public/458778/ но пришлось бы снимать с поддержки для добавления своей общей формы. Другого способа более легкого не знаю )
3. Fragster 1159 19.05.16 17:38 Сейчас в теме
(2) Зачем? есть же "ДлительныеОперации.СообщитьПрогресс" и ".ПрочитатьПрогресс", а отображать прогресс можно в своей форме с обработчиком ожидания? Или в данном случае это неприменимо?
Дмитрий74Чел; +1 Ответить
4. rozer 313 19.05.16 19:22 Сейчас в теме
(3) хм, посмотрю на досуге...
6. rozer 313 21.05.16 16:03 Сейчас в теме
(3) Fragster, у меня не получилось с индикатором в этом случае.
Дело в том что нет возможности получить "ИдентификаторЗадания" для использования
ДлительныеОперации.ПрочитатьПрогресс(ФоновоеЗаданиеИдентификатор)
.

Вот если используется "ДлительныеОперации.ЗапуститьВыполнениеВФоне" тогда да это получиться:

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


Но это не для внешних обработок - остается только как в http://infostart.ru/public/159607/ самому запускать фоновое оповещать через "СообщениеПользователю" и "ловить" в форме в "обработчике ожидания".
5. rozer 313 20.05.16 10:37 Сейчас в теме
если запустить эту обработку в последней версии БП 3.0 то вместо "крутящегося колесика" - этот
веселый котэ )))
Настоящий подарок бухгалтерам )
Atori-kun; TeMochkiN; invertex; +3 Ответить
9. 1vasia1 15 27.05.16 15:35 Сейчас в теме
(5) И правда котэ в картинки "ДлительнаяОперация48" добавили :)
10. config 205 27.05.16 15:41 Сейчас в теме
(5) бухгалтерия ЛИЧНО звонила и благодарила за "такого замечательного котика"
7. aldor188 15 25.05.16 08:48 Сейчас в теме
А что за процедура Фигачить()? Она не используется по коду.
8. rozer 313 25.05.16 10:30 Сейчас в теме
(7) это обработчик команды формы обработки
11. aaudin90 02.06.16 10:58 Сейчас в теме
(8) есть опыт работы с длительными операциями для внешних отчетов? Делаем через набор данных "объект" и стандартная обработка в процедуре ПриКомпоновкеРезультата = ложь, поэтому стандартное скдшное фоновое задание не работает.
12. rozer 313 02.06.16 12:40 Сейчас в теме
(11) aaudin90,
внешних отчетов



а зачем - отчет сервер смотрит ? ))
13. aaudin90 02.06.16 12:52 Сейчас в теме
Отчет делается около 60 секунд, хотелось бы его каким то образом перевести в фон.
14. rozer 313 02.06.16 13:48 Сейчас в теме
(13) aaudin90, примерно так: сделайте на сервере программный вывод из ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент в табл документ, заполните в РезультатВыполнения табл.документ и на клиенте "ловите" этот РезультатВыполнения и демонстрируете его пользователю...
15. aaudin90 03.06.16 05:35 Сейчас в теме
(14) спасибо за совет, но все таки отказались от идеи использования набора данных объект)
16. user595572_katigugu 02.08.16 20:04 Сейчас в теме
Здравствуйте! Что-то не могу допереть, как передать параметры в серверную экспортную процедуру ВыполнитьКоманду. Т.е., если длительная операция содержит выполнение запроса к базе, значения параметров вводятся через форму, как их подтянуть в процедуру? День протупил. :) Буду очень признателен за помощь. Заранее спасибо.
17. rozer 313 03.08.16 10:29 Сейчас в теме
(16) user595572_katigugu, поместить в "ПараметрыКоманды " в Фигачить()
например:
ПараметрыКоманды .Вставить("струкНастроек", РеквизитФормыВЗначение("Объект").ПолучитьСтруктуруНастроекСервер());


и получать в ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения)
например:
ПараметрыНастроекВФорме=ПараметрыВыполненияКоманды.струкНастроек;

vasiliy_b; Дмитрий74Чел; +2 Ответить
18. user595572_katigugu 09.08.16 13:49 Сейчас в теме
25. vasiliy_b 284 01.12.17 12:43 Сейчас в теме
А есть идеи как передать ТЧ в фоновое задание?

Пробовал передать данные через ПоместитьВоВременноеХранилище. Но именно при фоновом запуске данные уже не получить.
PS: Пробовал использовать все три Варианта помещения данных, но ни один не заработал. Т.е на сервере ПолучитьИзВременногоХранилища всегда получается значение = неопределено.
26. rozer 313 02.12.17 12:39 Сейчас в теме
(25) ну не знаю, может не серилизуемые данные и если не по идентификатору формы то один серв вызов живет ВХ. Попробуй параметр сеанса...
27. vasiliy_b 284 02.12.17 17:31 Сейчас в теме
(26), точно не сериализуемые данные, пока выкрутился функцией ЗначениеВСтрокуВнутр и обратно, но данное решение мне не очень нравится.
А можешь поподробней про способ через параметр сеанса? типа помещать в какой-то из параметров данные и потом их оттуда забирать?
28. rozer 313 02.12.17 21:49 Сейчас в теме
19. Yackov 98 15.11.16 09:57 Сейчас в теме
На новом релизе бухгалтерии обработка перестала работать
20. rozer 313 13.02.17 08:24 Сейчас в теме
(19) ну видимо БСП поменяли как обычно...
21. Дмитрий74Чел 250 02.03.17 16:40 Сейчас в теме
Вопрос: а как отлаживать фоновое? Отладчик не хочет заходить в созданный объект-обработку. Останавливается на Объект.Выполнить(ИмяКоманды,ПараметрыВыполнения)
23. zarankony 315 02.03.17 17:27 Сейчас в теме
(21)Отладку к сожалению можно делать только поставив галку на форме для отладки и по ней запускать процедуру непосредственно, не через фоновое задание. Если кто знает другой способ- мне и самому будет интересно узнать.
55. Xershi 1538 23.01.20 12:27 Сейчас в теме
(23) открываем форму и кнопкой запускаем то что 1С запустить регламентом. Опять же эмуляция вызова.
22. zarankony 315 02.03.17 17:07 Сейчас в теме
Рассказываю рабочий способ: запускаем фоновое задание
Результат = ВыполнитьЗапускВФонеНаСервере();	
ИдентификаторЗадания = Результат.ИдентификаторЗадания;


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

Дальше для прогресс бара нам понадобится из запущенного сеанса выводить сообщения нужного нам формата, например "Прогресс=32". в основной обработке получаем эти сообщения и интерпретируем(парсим) через ПолучитьСообщенияПользователю() так:
ПодключитьОбработчикОжидания("ВыводСообщений",1,Ложь);

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

&НаСервере
Функция ВыводСообщенийНаСервере()
	ДлинаЛога = 50000;
	Задание=ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	Если Задание=Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	Сообщения=Задание.ПолучитьСообщенияПользователю(Истина);
		Для Каждого Сообщение ИЗ Сообщения Цикл
			Если Лев(Сообщение.Текст,8)="Прогресс" Тогда
				Прогресс=Число(Сообщение.Текст,2);
								
			Иначе
				
				Лог=Строка(ТекущаяДата())+": "+Сообщение.Текст+Символы.ПС+Лев(Лог,ДлинаЛога);
			КонецЕсли;
			
			
		КонецЦикла;
	Если Задание.Состояние=СостояниеФоновогоЗадания.Активно Тогда
		
		Возврат Истина;
	Иначе
		
		Возврат Ложь;
	КонецЕсли;
КонецФункции
Показать

На форме у меня Переменные ИдентификаторЗадания, Прогресс и Лог(многострочное текстовое поле для вывода прочих служебных сообщений).
29. Xershi 1538 12.06.18 17:27 Сейчас в теме
(22) это хорошо написали. Сейчас переписывал обработку, которая использует ключ ОткрытиеФормы, на ВызовСерверногоМетода.
И похоже чтобы регламентное задание разделило процедуру на куски нужна "Модуль.Процедура". Если нет модуля и процедуры, то ничего не выйдет я так понял!
30. zarankony 315 18.06.18 13:00 Сейчас в теме
(29) есть немного извращенный метод получать модули и процедуры из внешней обработки, но это надо передавать её целиком на сервер и сохранять там.
31. Xershi 1538 18.06.18 13:15 Сейчас в теме
(30) а вот это уже интересно.
Речь идет именно о подключенной обработке?
Что за метод там используется, БСП?
32. zarankony 315 03.09.18 10:50 Сейчас в теме
(31) Да, БСП. ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки я тут описывал как делать: https://infostart.ru/public/842660/
33. Xershi 1538 03.09.18 12:11 Сейчас в теме
(32) публикация не активна!
34. zarankony 315 03.09.18 14:08 Сейчас в теме
40. Xershi 1538 07.10.18 15:17 Сейчас в теме
(34) написал вам комментарий по статье, сыровата и тема не раскрыта, если сможете показать, что не так и дополнить статью, то будет отлично!
41. zarankony 315 08.10.18 09:41 Сейчас в теме
(40)ответил Вам там, метод рабочий и используется, думаю дополнить статью можно
24. Xershi 1538 21.08.17 19:30 Сейчас в теме
Отличная статья!
Попытка
		СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
		ПараметрыВыполнения.РезультатВыполнения,
		НСтр("ru = 'Выполнена длит. операция!'"),,
		БиблиотекаКартинок.Успешно32);
	Исключение
		СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке(
		ПараметрыВыполнения.РезультатВыполнения,
		СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды),
		ИнформацияОбОшибке());
		Возврат;
	КонецПопытки;
Показать

Этот код в версии БСП 2.3.5.65 не работает, просто его удалил!
И дописал свой код выполнения задания:
УдалитьДокументыНаСервере(ПараметрыВыполнения.СписокДокументов);

Передав в параметры выполнения список значения интеграция прошла на ура!
А в форме распараллеливание потоков написал:
&НаКлиенте
Процедура УдалитьДокументыВПотоке(Команда)
	
	УдалитьДокументыВПотокеНаСервере();
	
	Кратность = Цел(Объект.ТаблицаПисем.Количество() / Объект.КоличествоПотоков);
	
	СписокДокументов = Новый СписокЗначений;
	
	Счетчик = 1;
	
	Для Каждого Строка Из Объект.ТаблицаПисем Цикл 		
		
		СписокДокументов.Добавить(Строка.Документ); 
		
		Если СписокДокументов.Количество() % Кратность = 0 Тогда
			
			ПараметрыКоманды = Новый Структура();
			ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", Объект.ОбъектСсылка);
			ПараметрыКоманды.Вставить("СопровождающийТекст", НСтр("ru = 'Регламентное удаление входящих электронных писем в фоне потока " + Счетчик + "...'"));
			ПараметрыКоманды.Вставить("СписокДокументов", СписокДокументов);
			
			ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Объект.ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма);
			
			СписокДокументов.Очистить();
			
			Счетчик = Счетчик + 1;
			
		КонецЕсли;                                   					
		
	КонецЦикла;
	
	//Состояние(ПараметрыКоманды.СопровождающийТекст); 
	
КонецПроцедуры
Показать

Правда такой метод делает при не целом делении на 1 поток больше, но зато результат на лицо!
53. platonov.e 162 23.01.20 07:58 Сейчас в теме
(24)
ВыполнитьКомандуВФоне
а это будет работать только если обрабботка подключена в справочнике, если открыть через файл - открыть - то не будет работать?
54. Xershi 1538 23.01.20 09:27 Сейчас в теме
(53) там придётся извратиться. Проще через дополнительные сделать.
56. Xershi 1538 23.01.20 13:04 Сейчас в теме
(53) в своих наработках у меня работает, если обработка подключена. А копия которую я запускаю через файл вызывает эту подключенную обработку, отлаживать так проще.
А если без подключения, то вам придется сохранить обработку, передать на сервер и вызвать метод из переданной обработки, что согласитесь треш! Но если очень нужно, то можно.
57. platonov.e 162 23.01.20 13:28 Сейчас в теме
(56) ну да я тоже уже вызываю из спраочника)
58. platonov.e 162 23.01.20 16:08 Сейчас в теме
(56) так, а можно сделать чтобы при фоновым выполнении никакое окошко, не статус бар не вылазило? выполнялось себе и ладно.
59. Xershi 1538 23.01.20 16:25 Сейчас в теме
(58) да, если запустить на сервере, как любое фоновое задание. Тут же суть в прогрессе, а это клиент.
60. platonov.e 162 10.02.20 14:46 Сейчас в теме
(59) блин, а я не могу на сервере вызвать, есть оповещение...
61. Xershi 1538 10.02.20 14:50 Сейчас в теме
(60) для этого запускают второе фоновое задание, которое и выводит результат после завершения первого.
62. platonov.e 162 11.02.20 13:28 Сейчас в теме
(61) а как отследить выполнилось оно или нет, чтобы повторно еще одно не запустить?
63. Xershi 1538 11.02.20 13:32 Сейчас в теме
(62) ну код поковыряйте. Там же все уже предусмотрели.
35. login1020 145 20.09.18 11:50 Сейчас в теме
А как вернуть значение из
Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт

или заполнить реквизит обработки/табличную часть?

Выполняю запрос, и через Сообщить() видно что запрос отрабатывает и идёт обход выборки, но заполнение не происходит

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
стр = тч.Добавить();
Сообщить(ВыборкаДетальныеЗаписи.Партнер);
ЗаполнитьЗначенияСвойств(Стр,ВыборкаДетальныеЗаписи);
КонецЦикла;
36. rozer 313 25.09.18 20:17 Сейчас в теме
(35) тч - табчасть объекта ? да все должно ИМХО норм отрабатывать
37. login1020 145 26.09.18 10:40 Сейчас в теме
ТЧ - таб часть объекта, командой "Открыть форму и выполнить в фоне с индикацией"
В фоне отрабатывает запрос, все партнеры через сообщить выводятся, но таб часть
на форме остается пустой
Процедура ВыполнитьКоманду(ИмяКоманды,ПараметрыВыполнения) Экспорт
	ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000*10;
	
	Попытка
		Сообщить("Успешно");
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	 //Имитация длительной операции - вместо этого вставте свой код который будет выполняться на сервере в фоне
	Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл
	КонецЦикла;
	
		Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Партнеры.Ссылка КАК Партнер,
	|	Партнеры.ДатаРождения КАК ДатаРождения
	|ИЗ
	|	Справочник.Партнеры КАК Партнеры
	|ГДЕ
	|	Партнеры.Ссылка = &ссылка";
	Запрос.УстановитьПараметр("Ссылка",ПараметрыВыполнения.ПараметрПартнёр);

	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		стр  = тч.Добавить();
		стр.Партнер  =  ВыборкаДетальныеЗаписи.Партнер;
		стр.ДатаРождения  = Дата("20180101");
	 	Сообщить(ВыборкаДетальныеЗаписи.Партнер);
	КонецЦикла;
	
КонецПроцедуры
Показать
38. rozer 313 26.09.18 11:01 Сейчас в теме
(37)
на форме остается пустой


ах на форме )
ага это точно так форму тут обновлять намного сложнее чем использовать РеквизитФормыВЗначение() или ДанныеФормыВзначение()
39. kassbar 159 04.10.18 14:41 Сейчас в теме
Процедура ВыполнитьКомандуВФоне(Знач ИдентификаторКоманды, Знач ПараметрыКоманды, Знач Обработчик)
третий параметр это описание оповещения.
почему в него передается "ЭтаФорма" ?
42. Xershi 1538 08.10.18 13:35 Сейчас в теме
(0) в своей логике не использовал передачу ТЗ с клиента в фоновое задание. Сейчас это понадобилось.
На форме есть данные формы коллекция. Через серверный вызов преобразовываю в ТЗ и помещаю во временное хранилище.
Как получить потом ТЗ в фоновом задании?
У меня не получилось! Передал адрес ТЗ на клиенте, а когда к нему обратилось фоновое задание, то там ничего не было.
Я так понимаю это особенность работы 1С. Был ли опыт такой работы?
43. kassbar 159 20.10.18 17:13 Сейчас в теме
(42)
Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Фоновое задание - это и есть другой сеанс. А ТЗ осталась во ВХ клиентского сеанса.
Я сохранял данные во временном файле и передавал в фоновое путь к временному файлу на сервере.
44. Xershi 1538 20.10.18 20:09 Сейчас в теме
(43) про это я написал. Решение вопроса, то есть?
45. kassbar 159 20.10.18 20:20 Сейчас в теме
(44) сохраняй в любом хранилище, не связанном с текущим сеансом. Например в хранилище внешней обработки (если это форма внешней обработки), в хранилище настроек конфигурации, в любом регистре сведений где есть ресурс с типом ХранилищеЗначения (например Версии объектов), сохраняй в файл в каталоге темп (если нужно передать файл)
46. Xershi 1538 20.10.18 20:23 Сейчас в теме
(45) каким методом?
ПоместитьВоВременноеХранилище(ТекущийСписокВалют, Новый УникальныйИдентификатор())

Я так понимаю этот метод только на сеанс.
47. kassbar 159 20.10.18 20:47 Сейчас в теме
(46) например
ХранилищеОбщихНастроек.Сохранить();
ХранилищеОбщихНастроек.Загрузить();
или
Новый хранилищеЗначения()
48. Xershi 1538 20.10.18 21:49 Сейчас в теме
(47)
Новый ХранилищеЗначения()

Отличный вариант! Как раз на клиенте вызываю серверную функцию, которая возвращает тип "ХранилищеЗначения", а далее передаю параметром в клиентский фоновый вызов!
49. kaliuzhnyi 136 22.08.19 09:57 Сейчас в теме
Не забывайте в СведенияОВнешнейОбработке() указывать версию БСП.

ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");


Интересно какая минимальная версия для работы этого метода?
50. rozer 313 20.09.19 15:39 Сейчас в теме
добавил вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0
51. Eret1k 27.09.19 11:48 Сейчас в теме
52. rozer 313 27.09.19 13:23 Сейчас в теме
(51) Да, помогла ваша публикация о чем я собственно и написал )

>>Немного тут подсмотрел

но в дополнение показал как доп. параметры передавать ну и использовал типовые приемы из внешней обработки "ЗаполнениеКонтрагентов" из БСП 3.0.3.
64. burgomister 61 09.04.20 19:01 Сейчас в теме
Полный код для фонового задания... что-то это мне напоминает:
#include
class string
{ private:
int size;
char *ptr;
public:
string() : size(0), ptr(new char('*')) {}
string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}
~string()
{
delete [] ptr;
}
friend ostream &operator << (ostream &, const string &);
string &operator = (const char *);
};
ostream &operator << (ostream &stream, const tring &s)
{
return(stream << s.ptr);
}
string &string::operator = (const char *chrs)
{
if(this != &chr)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chr);
}
return(*this);
}
int main()
{
string str;
str = 'Hello World';
cout << str << endl;
return(0);
}
Показать
65. zels 175 13.10.20 10:13 Сейчас в теме
Скачал версию для БСП3, запустил в БП3 - ничего не индицируется...
66. zabaluev 466 03.02.21 00:03 Сейчас в теме
(65) Что бы была индикация, надо подключить, как внешнюю обработку в программу.
67. HAMMER_59 255 27.04.21 19:43 Сейчас в теме
Спасибо за статью.

Для себя сделал несколько изменений.
1. Параметр ДополнительнаяОбработкаСсылка отметил как ключевой, ИдентификаторКоманды так и не понял зачем нужен. Событие ПриСозданииНаСервере убрал.
2. Не понял зачем сначала создавать структуру ВыполняемаяКоманда, передавать её на сервер. С таким же успехом можно прямо в серверной функции получить все то же самое. С ИдентификаторомКоманды совсем ничего не понял, у меня заполняется в зависимости от того какую кнопку на форме нажму.
68. a_inves 27.09.21 20:33 Сейчас в теме
"Запуск непосредственно на сервере можно сделать по расписанию."
------------------
А мне программа говорит, что Расписание Непременимо для команд с вариантом запуска "Открытие формы"
(
69. rozer 313 27.09.21 21:57 Сейчас в теме
(68) да, расписание только если не "открытие формы" )
70. JammShoot 20 01.11.22 15:16 Сейчас в теме
в версии 3.0 БСП убрали метод
ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ВладелецФормы, РезультатВыполнения);

чем его можно заменить?
71. rozer 313 13.12.22 15:07 Сейчас в теме
(70) в форме обработки смотрите в обработчик этого оповещения
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
72. Sem4cnt 03.07.23 14:05 Сейчас в теме
Кто-нибудь может подсказать как (нормально и без гемора) отлаживать процедуры, когда ты запускаешь внешнюю обработку из справочника?
73. Xershi 1538 13.02.25 11:43 Сейчас в теме
(72) переопределить вызов обработки из файла. Т.е. обработка в базе вызывает обработку из файла. Далее отладка ловится в файле. Ключевая особенность после добавления обработки в базу отредактировать файл иначе зациклился. Например поставить пробел и удалить и сохранить обработку в файле.
75. maksa2005 374 17.02.25 15:09 Сейчас в теме
что делаю не так. запускаю бсп.3
фонового отображения нет
76. rjkzy333 06.05.25 16:03 Сейчас в теме
Друзья, дайте пожалуйста совет. В комании на самописке установлена старая БСП 2.3. Согласно данной инструкции запустил фоновое задание и мне нужно получить результат (в сеанс родитель - это открытая из доп. обработок обработка) его выполнения такие как лог (строка) и массив неких ссылок (все это заполняется в процедуре модуля обработки).
1. Не понятно по коду приведенному здесь, что значит переменная "ВладелецФормы"?
2. В интернетах прочитал следующее, там советуют создать реквизит формы с типом строка и поместить в него адрес временного хранилища в которое помещается пустое значение. Делаю данное действие, когда на форме внешней доп. обработки запускаю команду выполнения фоном и всё это дело передаю в параметры фон. задания. На сервере в модуле обработки (в режиме фонового выполнения) выполняются необходимые действия и В САМОМ КОНЦЕ все логи и массив с ссылками помещаются в структуру, которая в свою очередь помещается во врем. хран - ПоместитьВоВременноеХранилище(Данные, РанееПереданныйПутьВременногоХранилища).
Где я только не отслеживал эти параметры и пытался получить из временного хранилища - всегда получаю неопределено. Что я не так делаю? В сп написано:

Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.


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

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

Показать


Модуль обработки:
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт
	
	ДатаДокумента = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.ДатаДокумента;	
	Склад = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.Склад;	
	АдресРезультата = ПараметрыВыполнения.ПараметрыВыполненияПроцедуры.АдресРезультата;
	
	*** Выполнение необходимых действий ***

	ТМЦНаСкладе = Запрос.Выполнить().Выгрузить();
	
	КомплектацииПоПереводу = Новый Массив;
	Лог = "";
	
	Для каждого ТекСтрТМЦ Из ТМЦКПереводу Цикл
		
	*** опять какие то действия **

	КонецЦикла;
	
	Результат = Новый Структура("КомплектацииПоПереводу, Лог", КомплектацииПоПереводу, Лог);
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
	Попытка
		СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
		ПараметрыВыполнения.РезультатВыполнения,
		НСтр("ru = 'Выполнена длит. операция!'"),,
		БиблиотекаКартинок.Успешно32);
	Исключение
		СтандартныеПодсистемыКлиентСервер.ВывестиИнформациюОбОшибке(
		ПараметрыВыполнения.РезультатВыполнения,
		СтрШаблон(НСтр("ru = 'Ошибка выполнения команды ""%1""'"), ИмяКоманды),
		ИнформацияОбОшибке());
		Возврат;
	КонецПопытки;
	
КонецПроцедуры
Показать

Заранее спасибо за помощь.
Прикрепленные файлы:
77. rjkzy333 07.05.25 10:42 Сейчас в теме
(76) подключил обработчик ожидания. После выполнения определенных условий, отключил его.
Оставьте свое сообщение