Как найти и ограничить фоновые задания конкретного пользователя в 1С?

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

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

Почему стандартных средств недостаточно?

При использовании стандартного метода ФоновыеЗадания.ПолучитьФоновыеЗадания() мы получаем список активных процессов, однако объект ФоновоеЗадание не содержит прямого свойства, указывающего на пользователя, запустившего этот процесс. Это создает трудности для администраторов, желающих применить ограничительные политики к конкретным учетным записям.

Решение 1: Анализ Журнала регистрации

Если возникла необходимость оперативно узнать, какие фоновые задания запущены конкретным сотрудником, мы можем обратиться к ЖурналРегистрации. Этот метод позволяет отследить событие запуска задания и проверить наличие записи о его завершении.

Разберем логику работы:

  1. Мы ищем события, связанные с запуском фонового задания, отфильтрованные по конкретному пользователю.
  2. Проверяем, зафиксировано ли для найденного идентификатора событие «Завершение» или «Ошибка».
  3. Если событие завершения отсутствует, значит, задание все еще выполняется в системе.

Этот способ позволяет получить точную информацию, однако он требует определенных затрат ресурсов сервера при частом обращении к ЖурналРегистрации.

Решение 2: Использование регистра сведений для контроля активности

Для предотвращения «параллельного запуска» тяжелых отчетов одним и тем же пользователем, рассмотрим более архитектурно правильный подход — создание специализированного РегистрСведений. Этот инструмент будет выступать в роли «светофора» для системы.

Рассмотрим по шагам, как это реализовать:

  1. Создадим регистр сведений «АктивныеФоновыеЗадания» с измерениями Пользователь, ТипЗадания (например, ОСВ) и ИдентификаторЗадания.
  2. Перед запуском тяжелого отчета в коде формы, который инициирует длительную операцию, мы проверяем записи в этом регистре для текущего пользователя.
  3. Если по типу задания уже существует активная запись, мы выводим предупреждение пользователю и блокируем повторный запуск.
  4. При успешном завершении или ошибке фонового задания (через обработчик ожидания или метод ДлительныеОперации.Завершить) мы очищаем запись в регистре.

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

Решение 3: Логическая блокировка через БСП

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


// Пример проверки перед запуском отчета
Если ДлительныеОперации.ЕстьАктивныеЗадания(ИмяЗадания, Параметры) Тогда
    ВызватьИсключение "Отчет уже формируется в другом сеансе. Пожалуйста, дождитесь окончания текущего задания.";
КонецЕсли;

Это решение позволяет организовать «мягкую» блокировку, которая информирует пользователя о причинах отказа, а не просто завершает его сеанс или задание.

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

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

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

← На главную