Виконання довільного коду у фонових завданнях

Чи потрапляли ви в ситуацію, коли необхідно за короткий термін якось обробити великий набір даних? Перепровести документи, перерахувати дані регістрів, заповнити допоміжні довідники - якщо у наборі немає складних залежностей (розрахунок проведення одного документа залежить від результату розрахунку іншого) - його можна розбити кілька порцій, і обробляти в тлі паралельно. Загвоздка полягає в тому, що фонове завдання можна запустити тільки через експортний спосіб неглобального загального модуля. Перепилювати конфу щоразу, коли виникає така потреба - вкрай незручно. Звідси виникає завдання організувати виконання коду в довільній кількості фонових завдань.

Нехай вихідно є якесь джерело даних їх подальшої обробки - Результат Запиту, чи ТаблицяЗначень. Тобто. зібрали запитом необхідні до проведення документи, або - помістили в таблицю значень (у разі якщо алгоритм вибірки занадто складний у тому, щоб обійтися лише запитом). Для демонстрації візьму зі стелі таке завдання: необхідно відібрати реалізацію, і для клієнта з ПІБ = "Іванов Іван Іванович" усі документи провести. Складемо запит:

. та реалізуємо код для обробки даних:

Це не дуже оптимальне рішення, виключно для демонстрації умова залишилася всередині циклу - хоча звичайно логічніше було б відразу відібрати у запиті. Тепер запускаємо цей код виконання у фоні. Розподілимо навантаження: припустимо, що в нашій вибірці 100`000 документів. Тоді розподіляючи цю кількість на 10 фонових завдань, отримуємо 10`000 документів на одне завдання. Розподіл виконується функцією"Таблиця фонових завдань":

Після того, як таблиця фонових завдань сформована – необхідно підготувати код до передачі параметром. Цикл набору даних буде виконаний автоматично, тому знадобиться лише тіло циклу. Цей шматок буде передано в метод ГК "Виконати", його потрібно перетворити на рядок. Після того, як параметри підготовлені, їх залишається передати у функцію "Виконати". У результаті поточний приклад набуде такого вигляду:

Моніторити результат можна за допомогою консолі інструментів розробника (скриншот). Зверніть увагу на колонку "Повідомлення": під час чергової ітерації циклу по порції набору виконується порожнє "Повідомлення користувачеві". За кількістю цих повідомлень можна судити про кількість минулих ітерацій, отримуємо своєрідний прогрес-бар: на скріншоті виділено рядок фонового завдання №5, і можна побачити, що з 10000 операції виконано 4160.

Код, розташований нижче, міститься в неглобальний загальний модуль. Зручно для цього використовувати "Фонові завдання Сервер".