Фоновое выполнение кода в 1С - это просто

Публикация № 1102674

Программирование - Практика программирования

Обработка фоновые задания фоновое выполнение ФоновыеЗадания

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

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

Перво-наперво создаем общий модуль с именем например "ФоновоеВыполнение" с галкой "Сервер". Добавим туда пару процедур:

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

Процедура ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения) Экспорт
    ПолныйТекстМодуля = "";
    Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
        ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
    КонецЦикла;
    ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
    Выполнить(ПолныйТекстМодуля);
КонецПроцедуры

И готово!

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

ТекстФоновойПроцедуры = "
|//Тут передаем текст фоновой процедуры, это может быть вызов каких то процедур или полноценный код
|//вызов процедур проще, т.к. тупо легче отлаживать, т.к. код в этой процедуре обычной отладке не поддастся,
|//а при вызове процедуры или функции мы ставим там точку останова и включаем в отладке автоматическое
|//подключение  фоновых заданий. Запускать можно любые методы для выполнения на сервере.
|
|ОбщийМодульСервер.ВыполнитьНужнуюЗадачу(Парметр1,Парметр2);"

И вызывать ее выполнение:

 ФоновоеВыполнение.ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,Новый Структура("Параметр1,Параметр2",Параметр1,Параметр2));

 

114

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. sapervodichka 1407 02.08.19 13:13 Сейчас в теме
интересно, спасибо
gubanoff; avalakh; +2 Ответить
2. jONES1979 02.08.19 14:02 Сейчас в теме
...А как узнать-то что всё завершилось?
4. skv_79 156 02.08.19 14:44 Сейчас в теме
(2)Там есть процедура проверяющая результат выполнения, которая подключается через обработчик ожидания.
jONES1979; +1 Ответить
12. dsdred 1129 02.08.19 21:35 Сейчас в теме
(2) например так:
Функция НайтиЗадание(Идентификатор) Экспорт
	// Считывает состояние фонового задания по переданному идентификатору.
	//
	// Параметры:
	//   Идентификатор - УникальныйИдентификатор - Идентификатор фонового задания.
	//
	// Возвращаемое значение:
	//   Неопределено - Задание не найдено.
	//   Структура - Сведения о задании.
	//       * Выполняется - Булево - Истина когда фоновое задание еще выполняется.
	//       * Успешно     - Булево - Истина когда сеанс фонового задания завершился без ошибок.
	//       * Ошибка      - Строка, ИнформацияОбОшибке, Неопределено - Описание ошибки.
	//
	УстановитьПривилегированныйРежим(Истина);
	
	Результат = Новый Структура("Выполняется, Успех, Ошибка", Ложь, Ложь, Неопределено);
	Если Идентификатор = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
		
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
	Если Задание = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
		Результат.Выполняется = Истина;
	Иначе
		Результат.Выполняется = Ложь;
		Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
			Результат.Успех = Истина;
		Иначе
			Результат.Успех = Ложь;
			Результат.Ошибка = Задание.ИнформацияОбОшибке;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции
Показать


А вообще примеров с ФЗ в интернете много, странно, что не нашли ничего...
jONES1979; avalakh; +2 Ответить
3. nikita0832 183 02.08.19 14:03 Сейчас в теме
Я разбирал эту задачу здесь Произвольный код в фоновом режиме. Работает на БСП без изменения конфигурации, хотя и немного через пень - колоду (с сохранением файла обработки на сервере). Ваш метод более произовдительный, мой - работает без изменений почти везде. Касательно Вашего метода, то тут надо добавить обработчик ожидания, который будет проверять статус его выполнения и считывать прогресс через ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторФоновогоЗадания) и в самом коде делать ДлительныеОперации.СообщитьПрогресс(Прогресс). Ибо фоновое задание, которое завершится быстро, не критично и без фона сделать, а то, которое длится долго надо контролировать и видеть прогресс.
u_n_k_n_o_w_n; Summer_13; ids79; avalakh; +4 Ответить
5. Идальго 117 02.08.19 14:45 Сейчас в теме
Вроде вагон подобных идей на ИС уже реализован в обработках и подсистемах по распараллеливанию через фоновые задания. Ну и про выполнение(формирование) например отчетов в фоне тоже вагон информации (особенно много появилось информации когда управляемые формы появились). Плохо гуглили мне кажется)))
krava_vlad; +1 Ответить
8. avalakh 311 02.08.19 16:22 Сейчас в теме
(5) возможно, не закапывался сильно, т.к. искал не для использования, просто просмотрел насколько тема актуальная и что про нее написано.
6. DJDUH 17 02.08.19 15:10 Сейчас в теме
А для многопоточности можно ещё завернуть в цикл.
Пример: Изменение / Удаление чего-то делать в потоках быстрее.
7. iliabvf 02.08.19 16:13 Сейчас в теме
А как насчет отладки? Или получение результата выполнения?
Давайте завернем все что можно "Выполнить", это же 1С, можно делать все что хочешь...
Или все-же стоит пробовать реализовать лучшие мировые практики программирования?
sashapere; +1 Ответить
9. avalakh 311 02.08.19 17:32 Сейчас в теме
(7) Для получения результатов выполнения мы возвращаем Уникальный идентификатор, который можем использовать для тестирования. В комментариях даже есть способ как это сделать. С отладкой все так же, запускаем процедуру, ставим точку останова и автоматическое подключение фоновых заданий
10. ids79 3209 02.08.19 18:09 Сейчас в теме
Я за использование БСП и запуск фонового задания из модуля внешней обработки, без модификации основной конфигурации.
saroman; Evg-Lylyk; dsdred; avalakh; +4 Ответить
11. avalakh 311 02.08.19 18:16 Сейчас в теме
(10) Это правильно, я сам против модификации стандартных конфигураций, тут скорее идея, которая может быть использована при работе. В любом случае реализация будет зависеть от задачи.
13. bulpi 155 02.08.19 23:04 Сейчас в теме
Лениво проверять, но ИМХО в процедуре
ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения)

есть ошибка.

Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
КонецЦикла;

Первый параметр - это текст процедуры, откуда возьмется ТекПараметр.Ключ ?
15. avalakh 311 03.08.19 09:24 Сейчас в теме
(13) ТекПараметр.Ключ берется из ПараметрыВыполнения, это второй параметр
14. PerlAmutor 42 03.08.19 08:54 Сейчас в теме
Плохо, что до сих пор разработчики 1С не добавили возможность запускать фоновые задания прямо из внешних обработок, открываемых интерактивно через меню Файл. Могли бы добавить возможность передавать в качестве параметра фоновому заданию - сам объект обработки, для копирования его в сеанс фонового задания и исполнения в нем скомпилированного кода.

Кроме того контроль прогресса фонового задания на стороне клиента надо выносить в отдельный поток вызывающий сервер для получения прогресса, а то сейчас видно, как меняется иконка курсора мышки на иконку ожидания при каждом периодическом опросе прогресса и добавляет задержку в работе пользователя.
Evg-Lylyk; avalakh; +2 Ответить
18. 7OH 32 06.08.19 09:44 Сейчас в теме
(14) для получения информации со стороны сервера - реализована система взаимодействия. Оповещение вызывает СЕРВЕР.
А вот запуск в фоне без доработки - дааа - давно пора убирать костыли со стороны 1С
20. DonAlPatino 53 06.08.19 12:47 Сейчас в теме
(18)Которая с сентября только в корпоративной версии платформы за кучу денег...
16. Vincitore 04.08.19 07:53 Сейчас в теме
Что полезного даёт эта статья? Знание того что в 1с есть фоновые задания и есть метод выполнить. Надоело тратить время на чтение статей описывающих синтаксис-помощник.
Soloist; dsdred; +2 Ответить
17. dsdred 1129 04.08.19 10:31 Сейчас в теме
(16)Согласен с Вами. Меня очень удивило, что автор не нашел статей по данному вопросу...

Вот отличная статья на инфостарте про ФЗ и БСП:
https://infostart.ru/public/341698/

Ну, а про Выполнить и того статей больше...

Не понимаю в чем проблема? Может когда искал интернет не работал...
triviumfan; +1 Ответить
19. avalakh 311 06.08.19 11:26 Сейчас в теме
(17) Отличная статья, спасибо за ссылку! Повторюсь, что искал я поверхностно, и у меня тут только практическая часть для использования "здесь и сейчас", это для тех кому срочно нужно, и у кого нет времени плотно погрузится и изучить тему всесторонне.
for-elenak; +1 Ответить
Оставьте свое сообщение