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

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

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

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

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

ФоновыеЗадания.Выполнить("ФоновоеВыполнение.ФоноваяПроцедура",ПараметрыВыполнения,УникальныйИдентификатор);
Возврат УникальныйИдентификатор;
КонецФункции

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

И готово!

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

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

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

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

 

21 Comments

  1. sapervodichka

    интересно, спасибо

    Reply
  2. jONES1979

    …А как узнать-то что всё завершилось?

    Reply
  3. nikita0832

    Я разбирал эту задачу здесь Произвольный код в фоновом режиме. Работает на БСП без изменения конфигурации, хотя и немного через пень — колоду (с сохранением файла обработки на сервере). Ваш метод более произовдительный, мой — работает без изменений почти везде. Касательно Вашего метода, то тут надо добавить обработчик ожидания, который будет проверять статус его выполнения и считывать прогресс через ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторФоновогоЗадания) и в самом коде делать ДлительныеОперации.СообщитьПрогресс(Прогресс). Ибо фоновое задание, которое завершится быстро, не критично и без фона сделать, а то, которое длится долго надо контролировать и видеть прогресс.

    Reply
  4. skv_79

    (2)Там есть процедура проверяющая результат выполнения, которая подключается через обработчик ожидания.

    Reply
  5. Идальго

    Вроде вагон подобных идей на ИС уже реализован в обработках и подсистемах по распараллеливанию через фоновые задания. Ну и про выполнение(формирование) например отчетов в фоне тоже вагон информации (особенно много появилось информации когда управляемые формы появились). Плохо гуглили мне кажется)))

    Reply
  6. DJDUH

    А для многопоточности можно ещё завернуть в цикл.

    Пример: Изменение / Удаление чего-то делать в потоках быстрее.

    Reply
  7. iliabvf

    А как насчет отладки? Или получение результата выполнения?

    Давайте завернем все что можно «Выполнить», это же 1С, можно делать все что хочешь…

    Или все-же стоит пробовать реализовать лучшие мировые практики программирования?

    Reply
  8. avalakh

    (5) возможно, не закапывался сильно, т.к. искал не для использования, просто просмотрел насколько тема актуальная и что про нее написано.

    Reply
  9. avalakh

    (7) Для получения результатов выполнения мы возвращаем Уникальный идентификатор, который можем использовать для тестирования. В комментариях даже есть способ как это сделать. С отладкой все так же, запускаем процедуру, ставим точку останова и автоматическое подключение фоновых заданий

    Reply
  10. ids79

    Я за использование БСП и запуск фонового задания из модуля внешней обработки, без модификации основной конфигурации.

    Reply
  11. avalakh

    (10) Это правильно, я сам против модификации стандартных конфигураций, тут скорее идея, которая может быть использована при работе. В любом случае реализация будет зависеть от задачи.

    Reply
  12. dsdred

    (2) например так:

    Функция НайтиЗадание(Идентификатор) Экспорт
    // Считывает состояние фонового задания по переданному идентификатору.
    //
    // Параметры:
    //   Идентификатор — УникальныйИдентификатор — Идентификатор фонового задания.
    //
    // Возвращаемое значение:
    //   Неопределено — Задание не найдено.
    //   Структура — Сведения о задании.
    //       * Выполняется — Булево — Истина когда фоновое задание еще выполняется.
    //       * Успешно     — Булево — Истина когда сеанс фонового задания завершился без ошибок.
    //       * Ошибка      — Строка, ИнформацияОбОшибке, Неопределено — Описание ошибки.
    //
    УстановитьПривилегированныйРежим(Истина);
    
    Результат = Новый Структура(«Выполняется, Успех, Ошибка», Ложь, Ложь, Неопределено);
    Если Идентификатор = Неопределено Тогда
    Возврат Результат;
    КонецЕсли;
    
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
    Если Задание = Неопределено Тогда
    Возврат Результат;
    КонецЕсли;
    
    Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
    Результат.Выполняется = Истина;
    Иначе
    Результат.Выполняется = Ложь;
    Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
    Результат.Успех = Истина;
    Иначе
    Результат.Успех = Ложь;
    Результат.Ошибка = Задание.ИнформацияОбОшибке;
    КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
    КонецФункции
    

    Показать

    А вообще примеров с ФЗ в интернете много, странно, что не нашли ничего…

    Reply
  13. bulpi

    Лениво проверять, но ИМХО в процедуре

    ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения)

    есть ошибка.

    Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл

    ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+»=ПараметрыВыполнения.»+ТекПараметр.Ключ+»;»+Символы.ПС;

    КонецЦикла;

    Первый параметр — это текст процедуры, откуда возьмется ТекПараметр.Ключ ?

    Reply
  14. PerlAmutor

    Плохо, что до сих пор разработчики 1С не добавили возможность запускать фоновые задания прямо из внешних обработок, открываемых интерактивно через меню Файл. Могли бы добавить возможность передавать в качестве параметра фоновому заданию — сам объект обработки, для копирования его в сеанс фонового задания и исполнения в нем скомпилированного кода.

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

    Reply
  15. avalakh

    (13) ТекПараметр.Ключ берется из ПараметрыВыполнения, это второй параметр

    Reply
  16. Vincitore

    Что полезного даёт эта статья? Знание того что в 1с есть фоновые задания и есть метод выполнить. Надоело тратить время на чтение статей описывающих синтаксис-помощник.

    Reply
  17. dsdred

    (16)Согласен с Вами. Меня очень удивило, что автор не нашел статей по данному вопросу…

    Вот отличная статья на инфостарте про ФЗ и БСП:

    https://infostart.ru/public/341698/

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

    Не понимаю в чем проблема? Может когда искал интернет не работал…

    Reply
  18. 7OH

    (14) для получения информации со стороны сервера — реализована система взаимодействия. Оповещение вызывает СЕРВЕР.

    А вот запуск в фоне без доработки — дааа — давно пора убирать костыли со стороны 1С

    Reply
  19. avalakh

    (17) Отличная статья, спасибо за ссылку! Повторюсь, что искал я поверхностно, и у меня тут только практическая часть для использования «здесь и сейчас», это для тех кому срочно нужно, и у кого нет времени плотно погрузится и изучить тему всесторонне.

    Reply
  20. DonAlPatino

    (18)Которая с сентября только в корпоративной версии платформы за кучу денег…

    Reply
  21. Cyberhawk

    (9) Возвращать-то надо УИД ФЗ, а не его ключ, в который положен произвольный УИД.

    Потому как в общем случае кому-то может захотеться запускать ФЗ с произвольным (задаваемым извне) ключом.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *