Застосування паралельних алгоритмів серед 1С Підприємства
Напевно, кожен із нас стикався із ситуацією, коли потрібно виконати великий обсяг обчислень або передати/отримати великий обсяг інформації за обмежений проміжок часу. А скільки з нас зупинилося на послідовному алгоритмі та заплющили очі на тривалість виконання? Ну і що, що 20 годин ведеться розрахунок/надсилання/отримання (підкреслити необхідне) якихось даних? Ну, я «вичавив» із системи все, що можна, швидше не вийде… При цьому серверне залізо завантажене на мінімум.
Насправді, майже завжди доступна альтернатива у вигляді розпаралелювання виконуваного завдання. Звичайно, паралельні алгоритми дещо складніші — балансування навантаження, синхронізації між потоками, а також, у разі ресурсів, що розділяються, боротьба з очікуванням на блокуваннях і уникнення deadlock'ів. Але, як правило, воно того варте.
Про це ми сьогодні й поговоримо... у контексті 1С Підприємства. Практично у всіх сучасних мовах є необхідний інструментарій для реалізації паралелізму. Але не всюди цей інструментарій зручний для використання. Хтось скаже: Ну і що тут складного і не зручного? Платформенний механізм фонових завдань до рук і вперед!». Насправді виявилося негаразд усе просто. А якщо завдання бізнес-критичне? Тоді потрібно забезпечити, по-перше, гарантоване виконання завдань та, по-друге, моніторинг роботи підсистеми виконання завдань.
Нічого з цього механізму фонових завдань не надає. Фонове може "впасти" будь-якої миті. Ось лише невеликий список можливих ситуацій:
- адміністратор для проведення регламентних робіт завершив усі сесії;
- зовнішній ресурс, необхідний момент виконання завдання, був недоступний протягом якогось часу;
- у частині завдань після чергового оновлення можутьз'явиться помилка в коді, фонове буде зупинено за ексепшеном і, крім запису в журнал реєстрації, нікому нічого не повідомить.
Хочеться мати можливість гнучкого управління завданнями із зворотним зв'язком, з урахуванням помилок, з гарантованим запуском, і все це приблизно з тією ж легкістю, яка існує в інших мовах і фреймворках для паралельних завдань.
Для полегшення свого життя було розроблено універсальна бібліотека, що дозволяє легко створювати паралельні алгоритми з гарантованим виконанням серед 1С Підприємства з урахуванням фонових завдань.
Галузь застосування
Основний принцип роботи

Додається завдання дуже просто — потрібно вказати точку входу (шлях до експортного методу із серверним контекстом у загальному модулі чи модулі менеджера) та кортеж із параметрами у вигляді структури:
При цьому відбувається запис у регістр відомостей з завдання. Спочатку завдання має станЧекає. Метод повертає ключ завдання для можливого відстеження прогресу в основному клієнтському потоці. Кортеж з параметрами так само розширюється властивістю КлючЗавдання, щоб під час виконання завдання був контекст, іноді може бути корисний.
Далі, раз на хвилину прокидається Менеджер, який насамперед перевіряє виконавців та звільняє завдання, виконавці яких «померли». Перевірка полягає у наступному. Якщо завдання у станіВиконуєтьсяі прописане як виконавець фонове не активне (видалено адміністратором,виникла виняткова ситуація у коді тощо), то завдання повертається в чергу. Для цього у завдання виставляється стан Очікує.
Наступним кроком запитуються із черги завдання відповідно до налаштувань балансування навантаження (зараз це лише обмеження кількості одночасно працюючих виконавців).
Після цього Менеджер під кожне завдання запускає Виконавця. Як виконавці виступають ті ж фонові завдання платформи 1С.
При запуску Виконавець робить відмітку, що взяв завдання в роботу - прописує свій унікальний ідентифікатор у завдання у властивості КлючВиконавця і виставляє стан завданняВиконується.
Коли завдання виконано, Виконавець так само робить відповідну позначку в завданні станВиконано.
Для використання підсистеми в оперативному режимі є метод Додати Завдання Позачергом. При цьому відразу запускається Виконавець, минаючи Менеджера, та забирає нове завдання. Сигнатура така сама, як у основного методу ДодатиЗавдання. На такі завдання обмеження на кількість виконавців не поширюється, але квота використовується.
Також є можливість скасовувати завдання в черзі методом Скасувати Завдання. При цьому скасовувати можна лише завдання, що перебувають у стані <Очікує . Вже запущені завдання не скасовуються, оскільки:
- У фонових завдань ніби є метод скасування, але він працює для мене не прозоро. Дуже часто спостерігав картину, коли тривале фонове завдання доопрацьовував до кінця незважаючи на відправлену команду скасування;
- Не хочеться залишати систему у неконсистентному стані. Хто знає, як написаний код завдання і що він робить у базі даних?
- Дочекатися Виконання (Ключі Задань, Таймаут = 5) - присипляє поточний потік до виконання зазначеного списку завдань, або до закінчення зазначеного часу;
- ОчікуватиСтан Завдання (КлючЗавдання, ОчікуванийСтан, Таймаут = 5) - присипляє поточний потік до встановлення зазначеного стану завдання, або до закінчення зазначеного часу;
- Очікувати ЗміниСтани (КлючЗавдання, ПоточнийСтан, Таймаут = 5) — присипляє поточний потік до зміни стану завдання із зазначеного на будь-яке інше, або до закінчення зазначеного часу.

Для налаштування є спеціальне оброблення «Управління менеджером завдань»:
Доступні параметри:
- Обмеження кількості виконавців — для балансування навантаження на сервері 1С. Приймає значення від 0 до 9999. При значенні 0 завдання працювати не будуть.
- Глибина збереження історії (дні) — якщо вказано значення, відмінне від 0, тоді підсистема сама буде чистити інформацію за старими виконаними завданнями залишаючи останні N днів зазначених у налаштуванні.
Тут є поверхневий моніторинг, який може показати, наскільки система справляється із завданнями. Показники:
- Кількість активних виконавців;
- Кількість завдань у черзі (у станіЧекає);
- Усього активних завдань (п.1 + п.2).
Розширений моніторинг сильно залежить від сфери застосування і залишений на відкуп споживачам підсистеми.
Приклади використання
Використання паралельних обчислень в автоматизації бізнес-процесів
Наприклад, розрахунок зарплати можна розпаралелити по співробітникам, оскільки розрахунок зарплати одного співробітника, зазвичай, залежить від розрахунку зарплати іншого співробітника. (Наведений код всього лише ілюструє можливості підсистеми, і ніяк не пов'язаний із типовими конфігураціями 1С.)
Паралельне виконання запитів у довгих звітах/обробках
Процеси завантаження/вивантаження даних
Організація навантажувального тестування
Вихідники та інше
Підсистема доступна на github/TaskManagerFor1C. CF файл відкритий, тому можна ознайомитися з вихідними кодами.
Підсистема розроблялася через тестування (TDD), тести доступні у зовнішній обробці /Тести/Тести_МенеджерЗаданий.epf. Для запуску тестів потрібний інструментарій xUnitFor1C.
Зворотній зв'язок вітається. Із задоволенням відповім на всі питання, що виникли по інструменту.
Хардкорна конфа за С++. Ми запрошуємо лише профі.