Как завершить сеансы HTTP-сервиса и снять блокировку с файловой базы 1С при обновлении конфигурации?

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

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

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

Выясним причину блокировки файловой базы

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

Существует две основные причины, почему база остается заблокированной:

  1. Пулинг (повторное использование) сеансов: Для ускорения обработки повторных запросов платформа по умолчанию сохраняет созданный сеанс HTTP-сервиса в специальном пуле. Сеанс не уничтожается сразу после ответа сайту, чтобы не тратить время на повторную инициализацию при следующем обращении. Из-за этого процесс веб-сервера продолжается и удерживает открытый файловый хэндл (file handle).
  2. Удерживание файловых дескрипторов процессом веб-сервера: Даже если время жизни сеанса истекло, сам процесс веб-сервера (например, w3wp.exe для IIS или httpd.exe для Apache) может удерживать файл базы данных открытым до момента полной остановки или рециркуляции рабочего процесса.

Решение 1. Отключение повторного использования сеансов в файле default.vrd

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

В секции описания HTTP-сервисов httpServices мы можем явно запретить пулинг сеансов с помощью атрибута reuseSessions="dontuse". В этом случае на каждый входящий запрос платформа будет создавать и сразу же уничтожать сеанс после отправки ответа.

Посмотрим на пример настройки файла default.vrd:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/my_service"
       ib="File="C:\Bases\MyBase";">
    <httpService name="МойСервис"
                 reuseSessions="dontuse" />
</point>

Если необходимо сохранить повторное использование сеансов для высокого быстродействия, но ограничить время их нахождения в памяти, настроим параметры пула и время жизни сеанса с помощью атрибутов sessionMaxAge, poolTimeout и poolSize:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/my_service"
       ib="File="C:\Bases\MyBase";">
    <httpService name="МойСервис"
                 reuseSessions="use"
                 sessionMaxAge="60"
                 poolTimeout="10"
                 poolSize="5" />
</point>

Здесь параметр sessionMaxAge="60" определяет максимальное время жизни неактивного сеанса в секундах, по истечении которого сеанс будет завершен автоматически.

Решение 2. Настройка времени жизни соединения при публикации

Выясним, как настроить время жизни соединения средствами самой платформы через Конфигуратор:

  1. Откроем Конфигуратор и перейдем в меню Администрирование — Публикация на веб-сервере....
  2. Перейдем на вкладку Прочее.
  3. Найдем поле Время жизни соединения (параметр maxAge) и установим требуемое значение в секундах (например, 60 или 300).
  4. Нажмем кнопку Опубликовать и перезапустим веб-сервер.

Также обратите внимание на свойства самого объекта HTTP-сервис в дереве конфигурации: в его свойствах можно ограничить время жизни сеанса на уровне платформы.

Решение 3. Перезапуск пула приложений или процесса веб-сервера

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

  1. Для IIS: Откроем Диспетчер служб IIS, перейдем в раздел Пулы приложений, найдем пул, в котором опубликована база 1С, и выполним команду Рециркуляция (Recycle) или Остановить / Запустить. Чтобы не задевать другие сайты, рекомендуется выделять публикацию файловой 1С в отдельный персональный пул приложений.
  2. Для Apache: Выполним перезапуск службы Apache через консоль служб Windows или с помощью команды httpd -k restart.
  3. Принудительное завершение процессов: В крайнем случае перед обновлением конфигурации можно завершить рабочие процессы веб-сервера (w3wp.exe для IIS или httpd.exe для Apache) через Диспетчер задач или командную строку.

Рекомендации по организации работы с HTTP-сервисами

Проанализировав особенности работы файлового режима, сделаем важные выводы для дальнейшей разработки и эксплуатации системы:

  1. Файловый режим базы данных 1С физически не предназначен для высокой нагрузки веб-сервисов и проведения монопольных операций «на лету» без остановки веб-сервера.
  2. При частой доработке кода HTTP-сервиса веб-сервер может кэшировать исполняемые модули в оперативной памяти. Если изменения в коде не отображаются при отладке, обязательно выполняйте перезапуск пула приложений IIS или службы Apache.
  3. Для рабочей среды с высокой интенсивностью запросов рекомендуется рассмотреть переход на клиент-серверный вариант (Сервер 1С + СУБД) либо использовать промежуточную файловую базу-буфер, которая принимает HTTP-запросы и передает их в основную базу в фоновом режиме.
← На главную