В процессе эксплуатации информационных систем на платформе 1С:Предприятие часто возникает проблема «тяжелых» операций, инициируемых пользователями. Когда бухгалтеры или менеджеры одновременно запускают десятки ресурсоемких отчетов, производительность системы падает, возникают блокировки и ошибки. Рассмотрим, как программно отслеживать такие процессы и ограничить их бесконтрольный запуск.
При использовании стандартного метода ФоновыеЗадания.ПолучитьФоновыеЗадания() мы получаем список активных процессов, однако объект ФоновоеЗадание не содержит прямого свойства, указывающего на пользователя, запустившего этот процесс. Это создает трудности для администраторов, желающих применить ограничительные политики к конкретным учетным записям.
Если возникла необходимость оперативно узнать, какие фоновые задания запущены конкретным сотрудником, мы можем обратиться к ЖурналРегистрации. Этот метод позволяет отследить событие запуска задания и проверить наличие записи о его завершении.
Разберем логику работы:
Этот способ позволяет получить точную информацию, однако он требует определенных затрат ресурсов сервера при частом обращении к ЖурналРегистрации.
Для предотвращения «параллельного запуска» тяжелых отчетов одним и тем же пользователем, рассмотрим более архитектурно правильный подход — создание специализированного РегистрСведений. Этот инструмент будет выступать в роли «светофора» для системы.
Рассмотрим по шагам, как это реализовать:
Пользователь, ТипЗадания (например, ОСВ) и ИдентификаторЗадания.ДлительныеОперации.Завершить) мы очищаем запись в регистре.Такой подход избавляет нас от необходимости постоянного перебора всех фоновых заданий сервера, что значительно экономит ресурсы системы.
Если ваша конфигурация использует библиотеку стандартных подсистем (БСП), разберем использование механизмов длительных операций. Система уже имеет встроенные методы для управления такими процессами. Вместо того чтобы пытаться насильственно «убивать» фоновые задания, мы можем управлять очередью на уровне прикладного кода:
// Пример проверки перед запуском отчета
Если ДлительныеОперации.ЕстьАктивныеЗадания(ИмяЗадания, Параметры) Тогда
ВызватьИсключение "Отчет уже формируется в другом сеансе. Пожалуйста, дождитесь окончания текущего задания.";
КонецЕсли;
Это решение позволяет организовать «мягкую» блокировку, которая информирует пользователя о причинах отказа, а не просто завершает его сеанс или задание.
Проанализируем ситуацию: если пользователи массово запускают отчеты, возможно, причина кроется не в их поведении, а в производительности самих отчетов. Разберем основные советы:
Применение любого из предложенных методов поможет вам навести порядок в работе фоновых процессов. Мы рекомендуем начать с внедрения РегистрСведений для контроля «один пользователь — один отчет», так как это наиболее стабильное и легко поддерживаемое решение в условиях типовых конфигураций 1С.