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

02.08.19

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

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

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

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

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

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

И готово!

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

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

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

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

 

ТОП-5 ИНСТРУМЕНТОВ ДЛЯ РАЗРАБОТЧИКА 1С

Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard
со скидкой 20% при покупке от 2х решений!


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

См. также

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

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    6283    bayselonarrend    126    

59

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

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    8176    dsdred    58    

104

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

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

23.06.2024    11972    bayselonarrend    21    

162

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

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

13.03.2024    8026    dsdred    18    

82

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

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

24.01.2024    28079    YA_418728146    33    

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


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

есть ошибка.

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

Первый параметр - это текст процедуры, откуда возьмется ТекПараметр.Ключ ?
15. avalakh 574 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 158 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 169 06.08.19 12:47 Сейчас в теме
(18)Которая с сентября только в корпоративной версии платформы за кучу денег...
16. Vincitore 04.08.19 07:53 Сейчас в теме
Что полезного даёт эта статья? Знание того что в 1с есть фоновые задания и есть метод выполнить. Надоело тратить время на чтение статей описывающих синтаксис-помощник.
Soloist; dsdred; +2 Ответить
17. dsdred 3804 04.08.19 10:31 Сейчас в теме
(16)Согласен с Вами. Меня очень удивило, что автор не нашел статей по данному вопросу...

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

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

Не понимаю в чем проблема? Может когда искал интернет не работал...
native-api; sulfur17; triviumfan; +3 Ответить
19. avalakh 574 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 574 10.02.22 11:30 Сейчас в теме
зависит от кода, но в целом все произойдет как обычно - блокировка, постановка в очередь ожидания и вылет, если ожидание будет слишком долгим
30. UPKA 20.08.22 21:40 Сейчас в теме
Подскажите, в методе вызова кода написано:

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


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

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