Почему зависает сеанс 1С при программном завершении работы из пакетного файла и как это исправить?

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

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

Анализ причин зависания сеанса

Проанализируем ситуацию: визуально клиент 1cv8.exe или 1cv8c.exe закрыт, но сервер 1С считает сеанс активным. Выясним основные причины такого поведения:

  1. Работа обработчиков закрытия конфигурации. Вызов метода ЗавершитьРаботуСистемы(Ложь) отключает интерактивное подтверждение у пользователя, но не отменяет вызовы событий ПередЗавершениемРаботыСистемы и ПриЗавершенииРаботыСистемы. Если в типовой конфигурации (например, «Управление торговлей») или расширениях в этих событиях выполняются фоновые проверки, сбор статистики или обмен с сервисами, клиентский процесс задерживает фактический выход.
  2. Неосвобожденные COM-объекты и внешние библиотеки. Если алгоритм выгрузки взаимодействует с COM-объектами (например, работа с файлами Excel, сетевые утилиты) и ссылки на них не очищаются явно, процесс может оставаться в операционной системе в фоновом режиме, продолжая поддерживать связь с сервером 1С.
  3. Запуск через загрузчик 1cestart.exe. Использование единого стартера запускает дочерний процесс конкретной платформы, из-за чего при нестандартном завершении сессия может не получить корректный сигнал на уничтожение.
  4. Фоновые задания и обработчики ожидания. Если в сеансе был подключен обработчик ожидания или запущено асинхронное действие, сеанс будет слать ping-запросы на сервер, обновляя время последней активности.

Решение 1. Использование метода ПрекратитьРаботуСистемы()

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

Посмотрим на разницу: метод ПрекратитьРаботуСистемы() осуществляет немедленное и безусловное прекращение работы приложения. Он игнорирует события перед закрытием и принудительно обрывает связь с сервером, освобождая сеанс в кластере.

Посмотрим на пример вызова в коде внешней обработки:


// Завершение алгоритма выгрузки
ОчиститьСлужебныеРесурсы();

// Безусловное завершение работы клиентского приложения
ПрекратитьРаботуСистемы();

Решение 2. Корректировка параметров запуска в командной строке

Рассмотрим доработку пакетного скрипта. Вместо универсального загрузчика 1cestart.exe надежнее указывать прямой путь к тонкому или толстому клиенту требуемой версии платформы, а также контролировать процесс средствами операционной системы.

Разберем пример пакетного файла:


@echo off
"C:\Program Files (x86)\1cv8\8.3.9.2233\bin\1cv8c.exe" ENTERPRISE /S"svr2014\UT11" /N"ReglamentnoeZadanie" /P"Пароль" /Out"D:\ExchangeSite\log_vygruzka.txt" -NoTruncate /Execute"D:\ExchangeSite\VygruzkaTovarovNaFTP.epf" /C"AUTO"

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

Решение 3. Настройка параметров спящих сеансов в кластере

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

Настроим параметры кластера и базы данных:

  1. Откроем параметры информационной базы через меню «Администрирование» → «Параметры информационной базы» в Конфигураторе или через консоль кластера серверов 1С.
  2. Установим параметр «Время засыпания пассивного сеанса» на значение от 600 до 1200 секунд (10–20 минут).
  3. Установим параметр «Время завершения спящего сеанса» на значение от 1800 до 3600 секунд (30–60 минут).

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

Решение 4. Переход на штатные регламентные задания (рекомендуемый подход)

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

Разберем реализацию серверной обработки по шагам:

  1. В модуле объекта внешней обработки опишем экспортную функцию СведенияОВнешнейОбработке(), настроив команду с режимом выполнения ВызовСерверногоМетода:

Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ВстроитьОбработкуВСистему();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;

    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Выгрузка товаров на FTP (авто)";
    НоваяКоманда.Идентификатор = "ВыгрузитьТовары";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();

    Возврат ПараметрыРегистрации;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт

    Если ИдентификаторКоманды = "ВыгрузитьТовары" Тогда
        // Вызов основного алгоритма выгрузки на сервере
        ВыполнитьВыгрузкуТоваровНаСервере();
    КонецЕсли;

КонецПроцедуры
  1. Откроем базу в режиме «1С:Предприятие» под учетной записью с административными правами.
  2. Перейдем в раздел «НСИ и администрирование» → «Печатные формы, отчеты и обработки» → «Дополнительные отчеты и обработки».
  3. Добавим внешнюю обработку из файла.
  4. В карточке обработки настроим расписание регламентного задания и укажем пользователя, от имени которого будет производиться запуск.

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

← На главную