Как настроить приоритет выполнения фоновых заданий, чтобы они не мешали работе пользователей

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

В процессе эксплуатации систем на платформе 1С:Предприятие 8 часто возникает классическая проблема: тяжелые регламентные задания (например, выгрузка прайс-листов, расчет себестоимости или синхронизация данных) начинают выполняться в моменты пиковой активности пользователей. Это приводит к замедлению работы интерфейса, долгому проведению документов и общему дискомфорту сотрудников, особенно кассиров или операторов, работающих в реальном времени. В этой статье мы разберем, как грамотно распределить ресурсы системы и настроить запуск фоновых процессов так, чтобы они использовали только свободные мощности.

Метод 1. Настройка требований назначения функциональности

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

Рассмотрим порядок действий:

  1. Откроем консоль администрирования кластеров 1С.
  2. В свойствах рабочего сервера выберем раздел Требования назначения функциональности.
  3. Создадим новое правило, где укажем тип объекта — Фоновое задание или конкретный вид задания.
  4. Установим значение Назначать для выделенного рабочего процесса и Не назначать для процессов, на которых работают активные пользователи.

Таким образом, тяжелая выгрузка будет выполняться в своем «песочнице», не отбирая процессорное время и память у процессов, обслуживающих сеансы пользователей.

Метод 2. Программный мониторинг активности системы

Разберем ситуацию, когда нам нужно, чтобы задание само понимало, пора ли ему работать. Мы можем внедрить в код регламентного задания проверку текущей нагрузки. Самый простой способ — это анализ количества активных сеансов. Посмотрим на пример кода, который можно разместить в начале процедуры регламентного задания:


Процедура ВыполнитьВыгрузкуПрайсЛистов()
    
    // Получаем текущее количество сеансов
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("AppID", "1CV8"); // Учитываем только тонкие и толстые клиенты
    
    Сеансы = ПолучитьСеансыИнформационнойБазы();
    
    // Если активных пользователей больше 30, откладываем выполнение
    Если Сеансы.Количество() > 30 Тогда
        ЗаписьЖурналаРегистрации("ФоновыеЗадания", УровеньЖурналаРегистрации.Информация, , , 
            "Выгрузка отменена из-за высокой активности пользователей. Сеансов: " + Сеансы.Количество());
        Возврат;
    КонецЕсли;

    // Основная логика выгрузки
    ЛогикаВыгрузкиДанных();
    
КонецПроцедуры

Такой подход позволяет динамически реагировать на «простой» системы. Если кассиры ушли на перерыв и количество сессий упало, задание начнет работу.

Метод 3. Дробление задачи на порции (Chunking)

Выясним причину, по которой фоновые задания мешают больше всего. Обычно это длительная блокировка таблиц или стопроцентная загрузка одного ядра процессора в течение долгого времени. Чтобы избежать этого, мы рекомендуем использовать метод дробления задачи. Вместо того чтобы выгружать 50 000 товаров за один раз, разделим процесс на итерации.

Рассмотрим алгоритм реализации:

  1. Регламентное задание запускается раз в 5 минут.
  2. Оно выбирает из базы только небольшую порцию данных (например, 200 позиций), которые еще не были выгружены.
  3. После обработки порции задание фиксирует прогресс и завершается.
  4. В следующую итерацию обрабатываются следующие 200 позиций.

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

Метод 4. Управление ресурсами на уровне СУБД

Проанализируем ситуацию, когда основной «тормоз» возникает на уровне SQL-сервера. Если у вас используется Microsoft SQL Server Enterprise, мы можем воспользоваться инструментом Resource Governor. Это позволяет ограничить ресурсы для конкретной учетной записи SQL, под которой подключаются фоновые задания 1С (если вы настроили раздельные подключения).

Мы можем создать пул ресурсов, в котором ограничим MAX_CPU_PERCENT до 15-20%. Даже если регламентное задание запустит крайне тяжелый запрос к базе, SQL-сервер не позволит ему занять более пятой части мощности процессора, оставив остальное для транзакций пользователей.

Метод 5. Использование очередей заданий БСП

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

Использование этого механизма позволяет избежать ситуации «шторма» фоновых заданий, когда несколько тяжелых процессов запускаются одновременно и парализуют систему.

Метод 6. Чтение данных из копий базы (Read-only Replica)

Посмотрим на современный подход, доступный в платформе 1С начиная с версии 8.3.14. Если основная нагрузка при выгрузке прайс-листов связана с чтением огромных объемов данных, мы можем настроить регламентное задание так, чтобы оно обращалось к копии базы данных. Это может быть как встроенный механизм дата-акселератора, так и технология AlwaysOn в MS SQL Server.

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

Рекомендации по оптимизации кода

В завершение проанализируем несколько советов по написанию кода для фоновых заданий:

Применяя эти методы в комплексе, мы сможем добиться ситуации, когда фоновые процессы будут работать незаметно для пользователей, эффективно используя периоды «затишья» в работе системы.

← На главную