Оптимизация регламентных заданий 1С: параллелизм и расписание
- Регламентные задания не успевают выполниться за ночь и блокируют работу пользователей днем.
- Наложение расписаний нескольких тяжелых заданий приводит к 100% утилизации CPU и дедлокам в СУБД.
- Фоновые задания зависают в состоянии
Выполняетсябесконечно.
1. Организация параллельного выполнения в несколько потоков
Разбивайте массив обрабатываемых данных на независимые порции (чанги) и запускайте фоновые задания асинхронно через ФоновыеЗадания.Выполнить():
// Запуск пула параллельных потоков обработки
МассивЗаданий = Новый Массив;
КоличествоПотоков = 4;
Для НомерПотока = 1 По КоличествоПотоков Цикл
ПараметрыПотока = Новый Массив;
ПараметрыПотока.Добавить(НомерПотока);
ПараметрыПотока.Добавить(КоличествоПотоков);
Задание = ФоновыеЗадания.Выполнить("МойМодуль.ОбработатьПорциюДанных", ПараметрыПотока, , "Поток_" + НомерПотока);
МассивЗаданий.Добавить(Задание);
КонецЦикла;
// Ожидание завершения всех потоков
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);2. Фильтрация данных по остатку от деления (Чанкинг)
Внутри процедуры потока выбирайте только свои записи:
// Выборка строк для конкретного потока
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ НомерСтроки % &ВсегоПотоков = &НомерПотока";3. Разнесение расписаний в консоли администрирования
Никогда не запускайте тяжелые фоновые задания (расчет себестоимости, закрытие месяца, обмен с сайтом, обновление полнотекстового поиска) в одну и ту же минуту.
Частые вопросы (FAQ)
Сколько параллельных фоновых потоков безопасно запускать в 1С?
Количество потоков не должно превышать число свободных физических ядер процессора на сервере 1С / СУБД (обычно от 4 до 8 потоков на операцию).
Что произойдет, если регламентное задание не завершилось, а подошло время нового запуска?
По умолчанию платформа 1С не запускает второй экземпляр того же регламентного задания, если предыдущий еще выполняется (происходит пропуск запуска).
Как принудительно прервать зависшее фоновое задание?
Через консоль администрирования кластера 1С (раздел 'Сеансы' / 'Фоновые задания') или программно командой ФоновоеЗадание.Отменить().
Почему параллельные фоновые задания вызывают дедлоки?
Если потоки обрабатывают пересекающиеся данные или пишут в одну таблицу итогов без разделения итогов, возникает конкуренция за строки индексов.