Приветствуем вас! Сегодня мы подробно разберем одну из самых коварных и распространенных проблем, с которой сталкиваются разработчики при публикации веб-сервисов «1С:Предприятия» на веб-серверах Apache или IIS. Представьте ситуацию: вы разработали мобильное приложение, настроили интеграцию, опубликовали веб-сервис файловой базы (например, тяжелой конфигурации «1С:Комплексная автоматизация 2»), проверили работу — всё отлично функционирует. Но стоит вам закрыть Конфигуратор 1С, как мобильный клиент или обычный браузер мгновенно теряют доступ к публикации, выдавая ошибки авторизации или сообщая о недоступности ресурса. Стоит снова открыть Конфигуратор — и магия возвращается: WSDL-структура отдается, обмен идет.
Давайте вместе разберемся в технических тонкостях этого поведения, выясним истинные причины происходящего и найдем надежные способы решения этой проблемы без сомнительных компромиссов вроде постоянного удержания Конфигуратора открытым.
Проанализируем, как именно веб-сервер взаимодействует с файловой базой данных 1С. Когда база работает в клиент-серверном режиме, веб-сервер обращается к кластеру серверов 1С, который сам управляет правами и доступом к СУБД. Но в случае с файловой базой данных всё устроено иначе.
Веб-сервер (в нашем случае Apache) при поступлении запроса к веб-сервису пытается самостоятельно инициализировать движок «1С:Предприятия» в фоновом режиме внутри своего рабочего процесса. Для этого ему необходимо напрямую открыть файл базы данных 1Cv8.1CD, а также создать в каталоге базы временные служебные файлы и файлы блокировок (такие как 1Cv8.1CL и 1Cv8tmp.1CD).
Здесь и кроется главное препятствие:
SYSTEM (Локальная система), Local Service или специально созданного ограниченного пользователя.Почему же всё работает при открытом Конфигураторе? Когда вы запускаете Конфигуратор или сеанс «1С:Предприятие» под своей обычной учетной записью администратора компьютера, операционная система уже инициализировала доступ к файлу базы. В каталоге базы уже созданы файлы блокировок, и запущенные процессы имеют к ним разделяемый доступ. Веб-сервер в этот момент может успешно «пристроиться» к уже инициализированной среде разделяемого доступа.
Как только Конфигуратор закрывается, веб-сервер вынужден осуществлять «холодный старт» — пытаться монопольно или первично открыть базу данных от имени своей урезанной системной учетной записи. Не имея прав на создание и изменение файлов в этой папке, процесс ОС аварийно завершается, и мы получаем ошибку доступа.
Для исправления этой ситуации нам необходимо явно предоставить права учетной записи веб-сервера на каталог с базой данных. Рассмотрим этот процесс по шагам:
services.msc), найдем службу вашего Apache (например, Apache2.4) и перейдем на вкладку «Вход в систему». Обычно там указана учетная запись «С локальной системной учетной записью» (SYSTEM) или NETWORK SERVICE.1Cv8.1CD, а на всю родительскую папку, так как 1С требуется создавать временные файлы в этом каталоге.SYSTEM или NETWORK SERVICE) и нажмем «ОК».Любое обращение к веб-сервису 1С требует выделения клиентской лицензии. Даже простое получение структуры WSDL-описания через браузер инициализирует сеанс, под который должна выделиться лицензия.
Службы Windows (включая Apache и IIS) выполняются в изолированном пространстве окружения, известном как Session 0. Это специальная неинтерактивная сессия, которая физически изолирована от сеанса пользователя, работающего за монитором.
Если ваши программные лицензии 1С (файлы с расширением .lic) установлены в профиль конкретного локального пользователя (например, в каталог C:\Users\ИмяПользователя\AppData\Local\1C\1Cv8\conf), то служба веб-сервера из своей изолированной «Сессии 0» их просто не увидит!
Когда вы запускаете Конфигуратор, он успешно активирует лицензию из вашего профиля пользователя Windows. Как только вы закрываете Конфигуратор, лицензия освобождается, а фоновый процесс Apache при очередном входящем веб-запросе не может обнаружить доступную лицензию и аварийно завершает свою работу без вывода внятных ошибок пользователю.
Чтобы служба веб-сервера имела постоянный беспрепятственный доступ к лицензиям 1С, выполним перенос файлов лицензий в публичный каталог:
*.lic). Обычно они располагаются в папке профиля пользователя, активировавшего их: C:\Users\ИмяПользователя\AppData\Local\1C\1Cv8\conf\.C:\ProgramData\1C\licenses\ (если папки licenses нет, создадим ее вручную).C:\ProgramData\1C\licenses позволяют системной службе веб-сервера (SYSTEM или NETWORK SERVICE) беспрепятственно читать файлы из нее.nnhasp.ini на стороне веб-сервера жестко прописан IP-адрес менеджера лицензий.Давайте проанализируем конфигурацию, с которой работает автор темы. Это «1С:Комплексная автоматизация 2» (КА 2). Данное прикладное решение является чрезвычайно «тяжелым», содержит огромное количество метаданных и сложный программный код инициализации системы.
Когда Конфигуратор закрыт, при первом обращении к веб-сервису происходит так называемый «холодный старт»:
В это же время клиентское приложение (мобильный клиент или интернет-браузер) отправляет запрос и ждет ответа. Обычно таймаут ожидания ответа веб-сервера на стороне клиента составляет не более 15–30 секунд. Не дождавшись ответа из-за длительного запуска «тяжелой» конфигурации, клиент принудительно разрывает соединение по таймауту. Пользователю кажется, что веб-сервис «лежит».
Когда же Конфигуратор открыт, база данных уже полностью прочитана операционной системой, кэширована в оперативной памяти компьютера и дисковом кэше. Повторный запуск фонового сеанса происходит в разы быстрее («горячий старт»), укладываясь в лимиты таймаута.
Чтобы избежать постоянного холодного старта при каждом запросе, мы должны настроить пул соединений в файле публикации веб-сервиса default.vrd. Этот файл располагается в каталоге публикации вашей базы на веб-сервере.
Отредактируем файл default.vrd, добавив параметры повторного использования сеансов. Откроем файл в текстовом редакторе и найдем описание точки подключения. Нам нужно прописать параметры пула соединений:
<point name="KA2"
alias="KA2"
enable="true"
reuseSessions="use"
sessionMaxAge="20"
poolSize="5"
poolTimeout="10">
<ws>
<service name="ИмяВашегоВебСервиса" enable="true"/>
</ws>
</point>
Разберем подробнее, за что отвечают эти важные параметры:
reuseSessions="use" — предписывает веб-серверу повторно использовать уже созданные ранее сеансы 1С вместо того, чтобы закрывать их после каждого запроса и создавать заново.poolSize="5" — определяет максимальное количество удерживаемых в памяти готовых («горячих») сеансов 1С.poolTimeout="10" — время (в секундах), в течение которого свободный сеанс будет удерживаться в пуле в ожидании нового запроса.Такая настройка позволяет первому запросу отработать медленно, но все последующие запросы от мобильного приложения будут обрабатываться мгновенно, так как они попадут на уже запущенные и готовые к работе сеансы 1С в оперативной памяти.
Автор темы отметил, что переход на 32-битные версии Apache и платформы 1С мгновенно решил его проблему. Почему это произошло?
Дело в том, что 64-битные процессы в Windows (особенно службы) подчиняются гораздо более строгим правилам изоляции безопасности. Директория C:\Program Files защищена операционной системой намного сильнее, чем C:\Program Files (x86). При установке 32-битного веб-сервера и платформы ограничения прав доступа NTFS часто оказываются мягче, что позволяет службе получить доступ к базе данных «из коробки» без ручной настройки разрешений.
Кроме того, для корректной работы 64-битного модуля расширения веб-сервера (файла wsap24.dll из каталога 64-битной 1С) требуются соответствующие 64-битные системные библиотеки распространяемого пакета Microsoft Visual C++ Redistributable. Если в системе установлены только 32-битные библиотеки, 64-битный модуль расширения веб-сервера будет аварийно завершать работу службы Apache при попытке загрузить библиотеки 1С, в то время как при запущенном Конфигураторе эти системные вызовы могли временно перенаправляться операционной системой.
Для того чтобы ваш веб-сервис работал стабильно 24/7 независимо от запущенного Конфигуратора, обязательно выполните следующие действия:
*.lic в общую папку C:\ProgramData\1C\licenses.reuseSessions) в файле публикации default.vrd для минимизации задержек «холодного старта».Выполнив эти шаги, вы гарантированно обеспечите бесперебойный и быстрый доступ к веб-сервисам 1С из мобильных приложений и внешних систем!