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

02.08.19

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

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

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

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

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

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

И готово!

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

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

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

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

 

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

См. также

Сервисы интеграции без Шины и интеграции

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

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

13.03.2024    3401    dsdred    16    

65

Как готовить и есть массивы

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

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

24.01.2024    7933    YA_418728146    25    

69

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    8165    dsdred    44    

119

1С-ная магия

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

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

06.10.2023    20380    SeiOkami    46    

125

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14321    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    10716    YA_418728146    7    

149

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    7140    sebekerga    54    

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


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

есть ошибка.

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

Первый параметр - это текст процедуры, откуда возьмется ТекПараметр.Ключ ?
15. avalakh 566 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 129 03.08.19 08:54 Сейчас в теме
Плохо, что до сих пор разработчики 1С не добавили возможность запускать фоновые задания прямо из внешних обработок, открываемых интерактивно через меню Файл. Могли бы добавить возможность передавать в качестве параметра фоновому заданию - сам объект обработки, для копирования его в сеанс фонового задания и исполнения в нем скомпилированного кода.

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

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

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

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

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


ВыполнитьНужнуюЗадачу - это не ошибка? Вроде бы автор в начале общий модуль называет: "ФоновоеВыполнение"
31. avalakh 566 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 Ответить
Оставьте свое сообщение