Как вынести фоновые и регламентные задания на отдельный сервер в 1С:Предприятии 8.2?

Системный администратор IT и автоматизация бизнеса
← На главную

В процессе эксплуатации высоконагруженных систем на платформе 1С:Предприятие 8.2 администраторы часто сталкиваются с проблемой «прожорливости» фоновых заданий. Роботы могут потреблять десятки гигабайт оперативной памяти, что приводит к деградации производительности всей системы, даже если физически свободная память еще остается. В отличие от версии 8.3, в 8.2 отсутствуют штатные «Требования назначения функциональности», которые позволяют одной кнопкой запретить выполнение фоновых заданий на определенных рабочих серверах. Однако существуют проверенные технические методы, позволяющие добиться изоляции нагрузки. Рассмотрим их подробно.

Проблема распределения нагрузки в 1С 8.2

Разберем ситуацию: когда рабочий процесс rphost накапливает значительный объем кэша и данных (30–40 Гб), менеджер памяти платформы 8.2 начинает работать неэффективно. Это часто связано с фрагментацией памяти или особенностями работы 32-битных компонентов внутри 64-битной службы. Поскольку фоновые задания и сессии пользователей в 8.2 могут перемешиваться внутри одних и тех же рабочих процессов, «тяжелый» робот неизбежно замедляет работу обычных пользователей. Выясним, как мы можем принудительно развести эти потоки.

Метод 1: Ручной перенос сервиса заданий (JobService)

В платформе 8.2 существует возможность управления сервисами кластера через консоль администрирования. Проанализируем, как это работает:

  1. В консоли администрирования серверов 1С откройте ветку «Центральные серверы».
  2. Перейдите в раздел «Менеджеры кластера».
  3. В свойствах менеджеров можно увидеть список запущенных сервисов. Среди них есть Сервис заданий (JobService).

Важное ограничение: Перенос самого сервиса заданий на другой менеджер (на другой физический сервер или другой инстанс) лишь переносит «планировщик», который следит за расписанием. К сожалению, это не дает 100% гарантии, что код задания не запустится на «пользовательском» сервере, так как выполнение инициируется в рамках доступных рабочих процессов rphost. Тем не менее, это первый шаг к распределению управляющей логики.

Метод 2: Создание второго кластера (инстанса) на одной машине

Это самый надежный способ физической изоляции ресурсов в версии 8.2. Мы запустим вторую службу сервера 1С, которая будет иметь свои собственные рабочие процессы rphost, независимые от основной службы. Рассмотрим пошагово, как это реализовать:

  1. Создаем новую службу Windows для 1С с помощью команды sc create. Для этого нужно указать другое имя службы и другие порты (например, основной кластер на 1540, второй на 1640).
  2. В новом кластере регистрируем ту же самую базу данных SQL, но под другим именем в списке баз 1С (например, Бухгалтерия_Фоновые).
  3. В основном кластере (где работают пользователи) отключаем регламентные задания для этой базы.
  4. Во втором кластере (где порты 1640) регламентные задания оставляем включенными, но запрещаем вход пользователям (устанавливаем блокировку соединений).

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


sc create "1C:Enterprise 8.2.19.130 Server_Background" binPath= "C:\Program Files\1cv82\8.2.19.130\bin\ragent.exe -srvc -agent -regport 1641 -port 1640 -range 1660:1691 -d \"C:\Program Files\1cv82\srvinfo_bg\""

Обратите внимание, что каталог данных -d также должен быть отдельным, чтобы настройки кластеров не пересекались.

Метод 3: Тонкая настройка рабочих процессов (rphost)

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

  1. Установите параметр «Количество сеансов на рабочий процесс» в небольшое значение (например, от 5 до 15).
  2. В платформе 8.2 это заставит систему создать множество процессов rphost.
  3. Если фоновое задание начнет утечку памяти, оно «убьет» или затормозит только тот процесс, в котором выполняется, затронув лишь минимальное количество пользовательских сессий.
  4. Настройте «Допустимый объем памяти» и «Интервал превышения допустимого объема памяти». В 8.2 эти механизмы работают грубо (перезапуская процесс целиком), но это поможет автоматически очищать память после завершения тяжелых задач роботов.

Метод 4: Программная изоляция в коде

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


// В начале процедуры регламентного задания
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если Найти(СтрокаСоединения, "SRV-WORKER") > 0 Тогда
    // Мы на пользовательском сервере, прерываем выполнение
    ЗаписьЖурналаРегистрации("ФоновыеЗадания", УровеньЖурналаРегистрации.Предупреждение, , , "Попытка запуска на основном сервере подавлена.");
    Возврат;
КонецЕсли;

Однако помните, что СтрокаСоединенияИнформационнойБазы() часто возвращает адрес менеджера кластера, а не конкретного рабочего сервера. Для более точной идентификации в 8.2 иногда используют внешние компоненты или обращение к WScript.Network для получения имени хоста, на котором исполняется rphost.

Метод 5: Использование COM-соединения для выноса нагрузки

Выясним еще один способ: выполнение тяжелого кода через COMConnector. Основная база может инициировать соединение сама с собой, но подключаться при этом к другому кластеру (см. Метод 2).

Проанализируем пример кода:


V82Connector = Новый COMОбъект("V82.COMConnector");
// Подключаемся к той же базе, но через порт 1641 (второй инстанс)
Соединение = V82Connector.Connect("Srvr=""Localhost:1641"";Ref=""Base_Background"";Usr=""Robot"";Pwd=""123"";");
Соединение.ИмяПроцедурыМодуля();

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

Мониторинг через Технологический журнал

Чтобы понять, какое именно задание «отъедает» память, настройте Технологический журнал (файл logcfg.xml). В версии 8.2 важно отслеживать событие SDBL и свойство Memory. Хотя оно менее детализировано, чем в 8.3, вы сможете увидеть скачки потребления ресурсов в моменты выполнения конкретных серверных вызовов (CALL).

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

← На главную