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

02.08.19

Разработка - Механизмы платформы 1С

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

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

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

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

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

И готово!

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

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

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

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

 

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

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8451    bayselonarrend    20    

156

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6458    dsdred    18    

80

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

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

24.01.2024    19899    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24400    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15472    YA_418728146    7    

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


А вообще примеров с ФЗ в интернете много, странно, что не нашли ничего...
DoctorRoot; Емельянов Алексей; yurazyuraz; Cthulhu; Lacoste4life; Mechanik21; user1069994; jONES1979; avalakh; +9 Ответить
3. zarankony 311 02.08.19 14:03 Сейчас в теме
Я разбирал эту задачу здесь Произвольный код в фоновом режиме. Работает на БСП без изменения конфигурации, хотя и немного через пень - колоду (с сохранением файла обработки на сервере). Ваш метод более произовдительный, мой - работает без изменений почти везде. Касательно Вашего метода, то тут надо добавить обработчик ожидания, который будет проверять статус его выполнения и считывать прогресс через ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторФоновогоЗадания) и в самом коде делать ДлительныеОперации.СообщитьПрогресс(Прогресс). Ибо фоновое задание, которое завершится быстро, не критично и без фона сделать, а то, которое длится долго надо контролировать и видеть прогресс.
ong1990; TreeDogNight; u_n_k_n_o_w_n; Summer_13; ids79; avalakh; +6 Ответить
5. Идальго 235 02.08.19 14:45 Сейчас в теме
Вроде вагон подобных идей на ИС уже реализован в обработках и подсистемах по распараллеливанию через фоновые задания. Ну и про выполнение(формирование) например отчетов в фоне тоже вагон информации (особенно много появилось информации когда управляемые формы появились). Плохо гуглили мне кажется)))
krava_vlad; +1 Ответить
8. avalakh 571 02.08.19 16:22 Сейчас в теме
(5) возможно, не закапывался сильно, т.к. искал не для использования, просто просмотрел насколько тема актуальная и что про нее написано.
TreeDogNight; +1 Ответить
6. DJDUH 17 02.08.19 15:10 Сейчас в теме
А для многопоточности можно ещё завернуть в цикл.
Пример: Изменение / Удаление чего-то делать в потоках быстрее.
sulfur17; avalakh; +2 Ответить
7. iliabvf 02.08.19 16:13 Сейчас в теме
А как насчет отладки? Или получение результата выполнения?
Давайте завернем все что можно "Выполнить", это же 1С, можно делать все что хочешь...
Или все-же стоит пробовать реализовать лучшие мировые практики программирования?
collider; Bassgood; sashapere; +3 Ответить
9. avalakh 571 02.08.19 17:32 Сейчас в теме
(7) Для получения результатов выполнения мы возвращаем Уникальный идентификатор, который можем использовать для тестирования. В комментариях даже есть способ как это сделать. С отладкой все так же, запускаем процедуру, ставим точку останова и автоматическое подключение фоновых заданий
pbahushevichG; +1 Ответить
21. Cyberhawk 135 30.09.19 15:50 Сейчас в теме
(9) Возвращать-то надо УИД ФЗ, а не его ключ, в который положен произвольный УИД.
Потому как в общем случае кому-то может захотеться запускать ФЗ с произвольным (задаваемым извне) ключом.
10. ids79 8561 02.08.19 18:09 Сейчас в теме
Я за использование БСП и запуск фонового задания из модуля внешней обработки, без модификации основной конфигурации.
Alien_RS_Forever; Evg-Lylyk; dsdred; avalakh; +4 Ответить
11. avalakh 571 02.08.19 18:16 Сейчас в теме
(10) Это правильно, я сам против модификации стандартных конфигураций, тут скорее идея, которая может быть использована при работе. В любом случае реализация будет зависеть от задачи.
TreeDogNight; +1 Ответить
13. bulpi 217 02.08.19 23:04 Сейчас в теме
Лениво проверять, но ИМХО в процедуре
ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения)

есть ошибка.

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

Первый параметр - это текст процедуры, откуда возьмется ТекПараметр.Ключ ?
15. avalakh 571 03.08.19 09:24 Сейчас в теме
(13) ТекПараметр.Ключ берется из ПараметрыВыполнения, это второй параметр
oneman@yandex.ru; +1 Ответить
22. chuff 08.07.20 05:48 Сейчас в теме
(15) Наткнулся на статью, и мне тоже непонятен этот момент.
ПараметрыВыполнения - это массив. Первое его значение - это текст процедуры, а второе - структура параметров.
И ПараметрыВыполнения[0].Ключ (первая выборка ТекПараметр) даст ошибку - ведь там находится строка. И переменная ТекстМодуля там точно не определена
Думаю, что примерно так должно быть:
    Для Каждого ТекПараметр Из ПараметрыВыполнения[1] Цикл
        ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
    КонецЦикла;
    ПолныйТекстМодуля = ПолныйТекстМодуля + ПараметрыВыполнения[0];


23. oneman@yandex.ru 05.11.20 18:05 Сейчас в теме
(22) Повнимательней, пожалуйста, ПараметрыВыполнения - это НЕ массив в "ФоноваяПроцедура(...)", там это уже структура, т.к. передан туда параметр "СтруктураПараметров" из "ЗапуститьФоновоеВыполнение(...)".
24. chuff 06.11.20 07:42 Сейчас в теме
(23)Да, я уже и сам понял свой косяк, но к этому времени редактирование поста уже было недоступно)
14. PerlAmutor 155 03.08.19 08:54 Сейчас в теме
Плохо, что до сих пор разработчики 1С не добавили возможность запускать фоновые задания прямо из внешних обработок, открываемых интерактивно через меню Файл. Могли бы добавить возможность передавать в качестве параметра фоновому заданию - сам объект обработки, для копирования его в сеанс фонового задания и исполнения в нем скомпилированного кода.

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

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

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

Не понимаю в чем проблема? Может когда искал интернет не работал...
native-api; sulfur17; triviumfan; +3 Ответить
19. avalakh 571 06.08.19 11:26 Сейчас в теме
(17) Отличная статья, спасибо за ссылку! Повторюсь, что искал я поверхностно, и у меня тут только практическая часть для использования "здесь и сейчас", это для тех кому срочно нужно, и у кого нет времени плотно погрузится и изучить тему всесторонне.
plevakin; oneman@yandex.ru; TreeDogNight; for-elenak; +4 Ответить
25. nedle 13.11.20 07:24 Сейчас в теме
оффтоп, но...
МЫСЬЮ по ДРЕВУ же!
26. Lubocka 36 29.12.20 11:28 Сейчас в теме
ФЗ во внешних отчетах, обработках не работают?
27. Lacoste4life 22.11.21 20:47 Сейчас в теме
Огромное спасибо! Работает с первого раза! У меня вопрос назрел - как отправить выполнение запроса в фон?
28. Sergoninfostarru 2 08.02.22 18:03 Сейчас в теме
Как будет все это работать, если запустят фоновое задание разные пользователи и будет проведение документов одного вида? Не будет ли блокировки работы одного пользователя другим?
29. avalakh 571 10.02.22 11:30 Сейчас в теме
зависит от кода, но в целом все произойдет как обычно - блокировка, постановка в очередь ожидания и вылет, если ожидание будет слишком долгим
30. UPKA 20.08.22 21:40 Сейчас в теме
Подскажите, в методе вызова кода написано:

ОбщийМодульСервер.ВыполнитьНужнуюЗадачу(Парметр1,Парметр2);


ВыполнитьНужнуюЗадачу - это не ошибка? Вроде бы автор в начале общий модуль называет: "ФоновоеВыполнение"
31. avalakh 571 24.08.22 11:39 Сейчас в теме
(30) Это пример кода текста процедуры. Вместо "ОбщийМодульСервер.ВыполнитьНужнуюЗадачу(Парметр1,Парметр2);" пишите ваш текст.
Сам запуск чуть ниже.
33. UPKA 05.06.23 16:59 Сейчас в теме
(31) Я так понял, что можно запустить процедуру. Но результат мы данным методом получить не сможем?
Допустим, формирование отчета.
32. user1475907 27.12.22 08:58 Сейчас в теме
Автор Конечно молодец. Но текст Нужно Всегда правильно писать. Тут и новички Есть Они сразу не разберутся.
Правильный текст такой.

	
ТекстФоновойПроцедуры = "
	|ОбщийМодульСервер.ВыполнитьНужнуюЗадачу(Параметр1,Параметр2);";
Serega-77; +1 Ответить
34. user1236877 05.12.24 06:50 Сейчас в теме
Подскажите, этим возможно пользоваться из внешней обработки? и если да, то как?
Оставьте свое сообщение