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

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

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

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

Причина 1. Контекст безопасности Windows и права доступа NTFS

Проанализируем, как именно веб-сервер взаимодействует с файловой базой данных 1С. Когда база работает в клиент-серверном режиме, веб-сервер обращается к кластеру серверов 1С, который сам управляет правами и доступом к СУБД. Но в случае с файловой базой данных всё устроено иначе.

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

Здесь и кроется главное препятствие:

  1. По умолчанию служба веб-сервера Apache регистрируется в операционной системе Windows и запускается от имени системной учетной записи SYSTEM (Локальная система), Local Service или специально созданного ограниченного пользователя.
  2. Эти системные учетные записи, как правило, имеют крайне ограниченные права доступа к пользовательским каталогам и дискам, на которых программисты обычно хранят базы данных 1С.

Почему же всё работает при открытом Конфигураторе? Когда вы запускаете Конфигуратор или сеанс «1С:Предприятие» под своей обычной учетной записью администратора компьютера, операционная система уже инициализировала доступ к файлу базы. В каталоге базы уже созданы файлы блокировок, и запущенные процессы имеют к ним разделяемый доступ. Веб-сервер в этот момент может успешно «пристроиться» к уже инициализированной среде разделяемого доступа.

Как только Конфигуратор закрывается, веб-сервер вынужден осуществлять «холодный старт» — пытаться монопольно или первично открыть базу данных от имени своей урезанной системной учетной записи. Не имея прав на создание и изменение файлов в этой папке, процесс ОС аварийно завершается, и мы получаем ошибку доступа.

Решение проблемы с правами NTFS

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

  1. Выясним, от имени какого пользователя запущен ваш веб-сервер. Для этого откроем оснастку «Службы» (services.msc), найдем службу вашего Apache (например, Apache2.4) и перейдем на вкладку «Вход в систему». Обычно там указана учетная запись «С локальной системной учетной записью» (SYSTEM) или NETWORK SERVICE.
  2. Перейдем в проводнике к каталогу, где физически расположена файловая база данных «1С». Обратите внимание, что права нужно давать не на сам файл 1Cv8.1CD, а на всю родительскую папку, так как 1С требуется создавать временные файлы в этом каталоге.
  3. Нажмем правой кнопкой мыши по папке базы, выберем «Свойства» и перейдем на вкладку «Безопасность».
  4. Нажмем кнопку «Изменить», а затем «Добавить».
  5. Введем имя пользователя, под которым работает веб-сервер (например, SYSTEM или NETWORK SERVICE) и нажмем «ОК».
  6. В списке разрешений для добавленного пользователя установим галочку напротив пункта «Изменение» (Modify) и «Запись» (Write). Полный контроль давать не обязательно, но права на чтение, запись и изменение структуры файлов внутри папки должны быть полными.
  7. Нажмем «Применить» и закроем свойства папки. После этого перезапустим службу Apache.

Причина 2. Ограничения доступа к лицензиям (Изоляция сессии Session 0)

Любое обращение к веб-сервису 1С требует выделения клиентской лицензии. Даже простое получение структуры WSDL-описания через браузер инициализирует сеанс, под который должна выделиться лицензия.

Службы Windows (включая Apache и IIS) выполняются в изолированном пространстве окружения, известном как Session 0. Это специальная неинтерактивная сессия, которая физически изолирована от сеанса пользователя, работающего за монитором.

Если ваши программные лицензии 1С (файлы с расширением .lic) установлены в профиль конкретного локального пользователя (например, в каталог C:\Users\ИмяПользователя\AppData\Local\1C\1Cv8\conf), то служба веб-сервера из своей изолированной «Сессии 0» их просто не увидит!

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

Решение проблемы с лицензированием

Чтобы служба веб-сервера имела постоянный беспрепятственный доступ к лицензиям 1С, выполним перенос файлов лицензий в публичный каталог:

  1. Найдем файлы программных лицензий (файлы *.lic). Обычно они располагаются в папке профиля пользователя, активировавшего их: C:\Users\ИмяПользователя\AppData\Local\1C\1Cv8\conf\.
  2. Скопируем все найденные файлы лицензий в общедоступный каталог конфигурации 1С, к которому имеют доступ абсолютно все службы: C:\ProgramData\1C\licenses\ (если папки licenses нет, создадим ее вручную).
  3. Убедимся, что права доступа NTFS на папку C:\ProgramData\1C\licenses позволяют системной службе веб-сервера (SYSTEM или NETWORK SERVICE) беспрепятственно читать файлы из нее.
  4. Если используются аппаратные многопользовательские USB-ключи защиты, убедимся, что на сервере запущен и настроен HASP License Manager, а в файле конфигурации nnhasp.ini на стороне веб-сервера жестко прописан IP-адрес менеджера лицензий.

Причина 3. Таймаут при «холодном старте» тяжелой конфигурации

Давайте проанализируем конфигурацию, с которой работает автор темы. Это «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>

Разберем подробнее, за что отвечают эти важные параметры:

Такая настройка позволяет первому запросу отработать медленно, но все последующие запросы от мобильного приложения будут обрабатываться мгновенно, так как они попадут на уже запущенные и готовые к работе сеансы 1С в оперативной памяти.

Причина 4. Архитектурные нюансы 64-битной платформы 1С и Apache

Автор темы отметил, что переход на 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 независимо от запущенного Конфигуратора, обязательно выполните следующие действия:

  1. Предоставьте пользователю, от имени которого работает служба веб-сервера Apache/IIS, полные права (или права на изменение) на папку с файловой базой 1С.
  2. Перенесите файлы лицензий *.lic в общую папку C:\ProgramData\1C\licenses.
  3. Настройте параметры пула соединений (reuseSessions) в файле публикации default.vrd для минимизации задержек «холодного старта».
  4. Убедитесь, что разрядность установленного веб-сервера Apache совпадает с разрядностью установленной платформы «1С:Предприятие» и ее модуля расширения веб-сервера.

Выполнив эти шаги, вы гарантированно обеспечите бесперебойный и быстрый доступ к веб-сервисам 1С из мобильных приложений и внешних систем!

← На главную