Как программно завершить зависшие веб-сессии в файловой базе 1С при работе через Apache

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

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

Анализ причин зависания сессий в файловом режиме

Разберем ситуацию: в файловом варианте работы веб-сервер Apache выступает посредником между клиентом и библиотеками 1С. Когда мы останавливаем службу Apache, мы ожидаем, что все соединения будут разорваны. Однако на практике процессы Apache (httpd.exe) могут завершаться некорректно или удерживать дескрипторы файлов базы данных (1Cv8.1CD), из-за чего 1С продолжает считать сессию активной.

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

Способ 1. Использование COM-соединения для принудительного завершения

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


// Создаем объект для управления базой
КомКоннектор = Новый COMОбъект("v83.COMConnector");

// Указываем строку подключения к файловой базе
СтрокаПодключения = "File=""C:\Bases\Retail"";Usr=""Admin"";Pwd=""Password"";";
Соединение = КомКоннектор.Connect(СтрокаПодключения);

// Получаем массив активных сеансов
Сеансы = Соединение.GetInfoBaseSessions();

Для Каждого Сеанс Из Сеансы Цикл
    // Проверяем, что это не наше текущее соединение
    Если Сеанс.SessionID <> Соединение.GetCurrentInfoBaseSession().SessionID Тогда
        // Принудительно завершаем сеанс
        Соединение.TerminateSession(Сеанс);
    КонецЕсли;
КонецЦикла;

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

Способ 2. Тонкая настройка веб-сервера Apache

Выясним причину, по которой сессии могут долго оставаться активными после закрытия браузера пользователем. Часто это связано с настройками Keep-Alive в Apache. Если таймауты слишком велики, сервер держит сокет открытым, ожидая новых запросов.

Рассмотрим шаги по оптимизации файла httpd.conf:

  1. Найдем директиву KeepAliveTimeout и установим её значение в пределах 2-3 секунд (вместо стандартных 5 или 15).
  2. Проверим параметр Timeout, который определяет время ожидания передачи данных. Его также стоит сократить до разумных пределов (например, 60 секунд).
  3. После внесения изменений обязательно перезапустим службу командой httpd.exe -k restart.

Способ 3. Пакетное завершение через параметры командной строки

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


"C:\Program Files\1cv8\common\1cv8.exe" ENTERPRISE /F "C:\Bases\Retail" /N "Admin" /P "Pass" /C ЗавершитьРаботуПользователей /Out "C:\Logs\log.txt"

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

Способ 4. «Радикальная» очистка через PowerShell

Когда стандартные средства net stop Apache2.2 не справляются, проанализируем ситуацию на уровне процессов ОС. Иногда процессы httpd.exe или дочерние процессы dbeng8.exe продолжают работать в фоновом режиме. Напишем скрипт, который гарантированно «стерилизует» окружение перед обновлением:


# 1. Останавливаем службу Apache
Stop-Service -Name "Apache2.2" -Force

# 2. Даем время на завершение операций
Start-Sleep -Seconds 5

# 3. Принудительно убиваем все оставшиеся процессы веб-сервера и 1С
Get-Process httpd -ErrorAction SilentlyContinue | Stop-Process -Force
Get-Process 1cv8 -ErrorAction SilentlyContinue | Stop-Process -Force

# 4. Удаляем файлы блокировок файловой базы, если они остались
$BasePath = "C:\Bases\Retail"
Remove-Item "$BasePath\*.1cl" -ErrorAction SilentlyContinue
Remove-Item "$BasePath\*.1ck" -ErrorAction SilentlyContinue

Важный момент: Удаление файлов *.1cl и *.1ck вручную — это крайняя мера. К ней стоит прибегать только после того, как все процессы 1С и Apache гарантированно завершены, иначе это может привести к повреждению структуры базы данных.

Алгоритм автоматизированного обновления

Подведем итог и составим оптимальную последовательность действий для вашего скрипта обновления:

  1. Установка блокировки новых соединений (через /UC или программно).
  2. Остановка службы веб-сервера (net stop Apache...).
  3. Проверка наличия активных процессов httpd.exe и их принудительное завершение.
  4. Кратковременная пауза (5–10 секунд) для освобождения файловых дескрипторов операционной системой.
  5. Запуск обновления конфигурации из хранилища или файла в пакетном режиме (/UpdateCfg или /UpdateDBCfg).
  6. Запуск службы Apache и снятие блокировки соединений.

Использование комплексного подхода — сочетание системных команд остановки процессов и программных методов 1С — позволит вам полностью автоматизировать обновление в розничных точках и избежать ручного вмешательства в работу конфигуратора.

← На главную