Как принудительно завершить зависшее фоновое задание в 1С 8.3?

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

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

Понимание природы зависания фоновых заданий

Прежде чем приступать к принудительному завершению, важно понимать, почему задания могут зависать. Часто это происходит из-за:

  1. Ошибок в коде задания: бесконечные циклы, неверная логика, исключения, которые не обрабатываются должным образом.
  2. Блокировок данных: задание пытается получить доступ к ресурсам, которые заблокированы другими сеансами, и попадает в состояние ожидания.
  3. Нехватки ресурсов сервера: памяти, процессорного времени, дискового пространства или сетевых ресурсов.
  4. Проблем с внешними системами: если задание обменивается данными с внешними сервисами, их недоступность или медленная работа может привести к зависанию.
  5. Сбоев платформы или СУБД: редкие, но возможные ситуации.

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

Административные методы завершения фоновых заданий

Эти методы требуют доступа к системе 1С:Предприятие с административными правами и часто являются наиболее надежными для быстрого реагирования на проблему.

1. Завершение сеанса через Конфигуратор 1С

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

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

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

2. Использование Консоли кластера серверов 1С

Консоль кластера серверов 1С:Предприятия (или, как ее часто называют, "Администрирование серверов 1С:Предприятия") — это мощный инструмент для системного администратора, позволяющий управлять кластером серверов 1С, включая мониторинг и завершение сеансов и фоновых заданий. Этот метод является наиболее эффективным для глубокого анализа и принудительного завершения.

  1. Откроем Консоль кластера: Запустите приложение "Администрирование серверов 1С:Предприятия". Оно обычно находится в папке установки платформы 1С или доступно через меню "Пуск".
  2. Подключимся к кластеру: В дереве навигации найдите свой кластер серверов 1С и подключитесь к нему, если это еще не сделано. Затем выберите нужный рабочий сервер и информационную базу.
  3. Перейдем к сеансам: Разверните ветку с вашей информационной базой и выберите раздел Сеансы. Здесь мы увидим полный список всех активных сеансов, включая пользовательские и фоновые задания.
  4. Идентифицируем фоновое задание: В списке сеансов обратим внимание на колонку Приложение, где фоновые задания будут иметь тип "Фоновое задание" или "Сервер 1С:Предприятия". Также мы можем использовать колонки Идентификатор фонового задания, Пользователь или Время работы для точной идентификации зависшего процесса.
  5. Завершим сеанс: Выделим строку с зависшим фоновым заданием, кликнем правой кнопкой мыши и выберем пункт Завершить сеанс. Консоль кластера предоставляет более детальный контроль и часто более успешно справляется с "убийством" особо упорных зависших процессов, так как она взаимодействует напрямую с рабочим процессом сервера 1С. Для профессиональной работы также может быть использована расширенная консоль управления кластером 1С, которая значительно упрощает анализ блокировок и управление сеансами — для этого подойдёт расширенная консоль управления кластером и сеансами 1С.
  6. Проверим фоновые задания: Дополнительно можно перейти в раздел Фоновые задания в консоли кластера. Здесь мы увидим более подробную информацию о статусах всех фоновых заданий, сможем отфильтровать их и, при необходимости, также остановить или удалить из очереди.

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

Программный метод завершения фоновых заданий

В некоторых случаях нам может потребоваться программно завершить фоновое задание. Это актуально для сценариев, где мы хотим реализовать автоматический мониторинг и завершение зависших фоновых заданий в системе (поможет система мониторинга и прерывания сеансов 1С), например, через другое регламентное задание, которое будет проверять статусы и завершать проблемные процессы по таймауту. Для программного взаимодействия с сеансами 1С используется объект ИнформацияБазыДанных.

Использование объекта ИнформацияБазыДанных

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

  1. Получим список активных сеансов: Мы используем метод ИнформацияБазыДанных.ПолучитьСеансы(), который возвращает коллекцию объектов Сеанс. Каждый объект Сеанс содержит информацию о конкретном активном соединении с информационной базой.
  2. Идентифицируем целевой сеанс: В коллекции сеансов мы должны найти тот, который соответствует зависшему фоновому заданию. Для этого мы можем проверять свойства объекта Сеанс:
    • Сеанс.Приложение: Должно быть равно ТипПриложения.ФоновоеЗадание.
    • Сеанс.ИмяФоновогоЗадания: Если фоновому заданию было задано уникальное имя при его создании, это самый надежный способ идентификации.
    • Сеанс.Идентификатор: Уникальный идентификатор сеанса, если он нам известен.
    • Другие свойства, такие как Сеанс.Пользователь, Сеанс.НачалоСеанса, могут помочь уточнить выбор.
  3. Завершим сеанс: После того как мы нашли нужный объект Сеанс, вызываем метод ИнформацияБазыДанных.ЗавершитьСеанс(Сеанс.Идентификатор). Этот метод принимает в качестве параметра уникальный идентификатор сеанса, который мы получили из найденного объекта.

Рассмотрим пример кода на встроенном языке 1С:


// Функция для принудительного завершения зависшего фонового задания по его имени.
// Принимает ИмяЗадания - строка, уникальное имя фонового задания.
// Возвращает Истина, если задание успешно завершено, Ложь в противном случае.
Функция ЗавершитьЗависшееФоновоеЗадание(ИмяЗадания) Экспорт

    // Получаем коллекцию всех активных сеансов в информационной базе.
    Сеансы = ИнформацияБазыДанных.ПолучитьСеансы();
    
    // Перебираем каждый сеанс в коллекции.
    Для Каждого Сеанс Из Сеансы Цикл
        
        // Проверяем, является ли текущий сеанс фоновым заданием.
        // Идентификатор типа приложения "ФоновоеЗадание" позволяет отделить его от пользовательских сеансов, COM-соединений и т.д.
        Если Сеанс.Приложение = ТипПриложения.ФоновоеЗадание Тогда
            
            // Если фоновому заданию было присвоено имя при его создании (например, при вызове ФоновыеЗадания.Выполнить()).
            // Это наиболее надежный способ идентификации конкретного экземпляра задания.
            Если Не ПустаяСтрока(ИмяЗадания) И Сеанс.ИмяФоновогоЗадания = ИмяЗадания Тогда
                
                // Мы нашли нужный сеанс фоновым задания. Попытаемся его завершить.
                Попытка
                    // Вызываем метод ЗавершитьСеанс(), передавая ему уникальный идентификатор найденного сеанса.
                    // Этот метод инициирует принудительное завершение работы сеанса на сервере 1С.
                    ИнформацияБазыДанных.ЗавершитьСеанс(Сеанс.Идентификатор);
                    Сообщить("Сеанс фонового задания '" + ИмяЗадания + "' (ИД: " + Сеанс.Идентификатор + ") успешно завершен.");
                    Возврат Истина; // Задание успешно завершено.
                Исключение Как Исключение
                    // Если при завершении сеанса возникла ошибка (например, из-за недостаточных прав или проблем с сервером).
                    Сообщить("Ошибка завершения сеанса фонового задания '" + ИмяЗадания + "': " + Исключение.Описание);
                    Возврат Ложь; // Произошла ошибка.
                КонецПопытки;
                
            // Если имя задания не указано или мы ищем по другим признакам (менее надежно, но иногда необходимо).
            // Например, можно искать по Пользователь.Имя или по фрагменту ОписаниеФоновогоЗадания.
            // В данном примере мы строго ищем по ИмениЗадания.
            // Иначе (для демонстрации) можно было бы добавить условие, например:
            // ИначеЕсли Сеанс.ОписаниеФоновогоЗадания Содержит "МоеПроблемноеЗадание" Тогда
            //     // ... код завершения ...
            КонецЕсли;
            
        КонецЕсли;
    КонецЦикла;
    
    // Если мы дошли до сюда, значит, фоновое задание с указанным именем не было найдено или не было завершено.
    Сообщить("Фоновое задание с именем '" + ИмяЗадания + "' не найдено или не может быть завершено.");
    Возврат Ложь;
    
КонецФункции

// Пример использования функции:
// Если ЗавершитьЗависшееФоновоеЗадание("МоеДлительноеЗадание") Тогда
//     Сообщить("Попытка завершения завершилась успехом.");
// Иначе
//     Сообщить("Не удалось завершить задание.");
// КонецЕсли;

Требования к правам: Для выполнения операции ИнформацияБазыДанных.ЗавершитьСеанс() пользователь, под которым выполняется код, должен обладать полными административными правами или ролью, включающей право АдминистрированиеКластера или ЗавершениеСеансов.

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

Дополнительные инструменты и методы диагностики

Для предотвращения и более глубокой диагностики зависаний полезно использовать следующие инструменты:

  1. Технологический журнал 1С: Настройте технологический журнал на сервере 1С:Предприятия. Он позволяет записывать огромное количество событий, происходящих на сервере, включая ошибки, блокировки, длительные операции и информацию о работе фоновых заданий. Анализ логов часто дает четкое представление о том, в какой момент и почему возникла проблема, в чем существенно поможет диагностика длительных операций в 1С 8.3 с помощью Технологического журнала — для этого есть инструмент анализа техжурнала для поиска блокировок. Мы сможем увидеть, какие запросы выполнялись, какие были блокировки и какие ошибки предшествовали зависанию.
  2. Анализ блокировок: Используйте консоль кластера серверов 1С или специализированные обработки для анализа блокировок — для этого подойдёт обработка управления фоновыми заданиями и анализа блокировок. Если фоновое задание зависло из-за ожидания ресурса, анализ блокировок покажет, какой другой сеанс удерживает нужный ресурс и, возможно, сам является источником проблемы.
  3. Мониторинг ресурсов сервера: С помощью стандартных средств операционной системы (например, Диспетчера задач в Windows или утилит мониторинга в Linux) отслеживайте потребление ресурсов (процессор, память, диск) рабочими процессами 1С (rphost.exe). Ненормально высокое потребление ресурсов одним из процессов может указывать на зависшее или некорректно работающее задание.
  4. Рефакторинг кода заданий: Если зависания повторяются, крайне важно пересмотреть код фонового задания. Необходимо добавить обработку исключений, контрольные точки, периодическую фиксацию транзакций (если это возможно) и механизмы "тайм-аута" для внешних вызовов. Хорошо спроектированное фоновое задание должно уметь самостоятельно обнаруживать и корректно завершать проблемные ситуации.

Итоги

Зависание фоновых заданий в 1С 8.3 — это неприятная, но решаемая проблема. Мы рассмотрели три основных подхода к ее решению:

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

← На главную