При работе с опубликованными HTTP-сервисами в файловом режиме информационной базы разработчики часто сталкиваются с ситуацией, когда после выполнения HTTP-запросов со стороны внешних систем (например, сайта) невозможно обновить конфигурацию 1С. Платформа выдает ошибку разделенного доступа к файлу базы данных. При этом новые соединения могут не отображаться в списке активных пользователей, но висеть в доступных предметах отладки или блокировать файл 1Cv8.1CD на уровне операционной системы.
Разберем подробнее причины возникновения этой проблемы, проанализируем механику работы веб-сервера с файловой базой и рассмотрим проверенные способы завершения таких сеансов и освобождения файла информационной базы.
Проанализируем ситуацию изнутри. В файловом режиме работы платформа 1С не имеет полноценного кластера серверов и менеджера сеансов. Когда веб-сервер (IIS или Apache) принимает HTTP-запрос, адресованный 1С, его рабочий процесс загружает динамические библиотеки платформы и напрямую открывает файл базы данных.
Существует две основные причины, почему база остается заблокированной:
w3wp.exe для IIS или httpd.exe для Apache) может удерживать файл базы данных открытым до момента полной остановки или рециркуляции рабочего процесса.Рассмотрим наиболее надежный вариант, который позволяет избежать залипания сеансов в пуле. Для этого внесем изменения в файл публикации 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" определяет максимальное время жизни неактивного сеанса в секундах, по истечении которого сеанс будет завершен автоматически.
Выясним, как настроить время жизни соединения средствами самой платформы через Конфигуратор:
maxAge) и установим требуемое значение в секундах (например, 60 или 300).Также обратите внимание на свойства самого объекта HTTP-сервис в дереве конфигурации: в его свойствах можно ограничить время жизни сеанса на уровне платформы.
Если требуется срочно обновить конфигурацию информационной базы, а сеансы или файловые хэндлы все еще удерживают файл базы данных, необходимо принудительно освободить ресурсы со стороны веб-сервера.
httpd -k restart.w3wp.exe для IIS или httpd.exe для Apache) через Диспетчер задач или командную строку.Проанализировав особенности работы файлового режима, сделаем важные выводы для дальнейшей разработки и эксплуатации системы: