При интеграции 1С с внешними системами часто возникает необходимость опубликовать веб-сервисы (SOAP или HTTP) для нескольких информационных баз на одном физическом сервере. На практике администраторы часто сталкиваются со следующими проблемами: одна публикация затирает другую, веб-сервисы работают «по очереди» (активен только тот, к которому обратились первым), или сервер выдает пустые страницы вместо wsdl-описания. В этой статье мы подробно разберем, как правильно настроить веб-серверы Apache и IIS для одновременной и стабильной работы нескольких публикаций 1С. Для автоматизации регулярной передачи пакетов через настроенные веб-сервисы можно использовать программу регулярного обмена данными между базами 1С по расписанию.
Основная ошибка при публикации нескольких баз на Apache — использование одной и той же директории на диске или перезапись конфигурационного файла. Давайте разберем правильный алгоритм действий по шагам.
Шаг 1. Создание раздельных каталогов на диске
Для каждой информационной базы необходимо создать свою собственную физическую папку на сервере. Нельзя публиковать несколько баз в корень веб-сервера или в одну общую папку. Например, создадим следующую структуру каталогов:
C:\inetpub\wwwroot\base_prod — для рабочей базы;C:\inetpub\wwwroot\base_test — для тестовой базы.Шаг 2. Публикация баз с уникальными именами (алиасами)
При публикации через конфигуратор 1С (Администрирование -> Публикация на веб-сервере) или через утилиту командной строки webinst обязательно указывайте разные имена публикаций и разные каталоги:
base_prod, Каталог = C:\inetpub\wwwroot\base_prodbase_test, Каталог = C:\inetpub\wwwroot\base_testШаг 3. Анализ конфигурационного файла httpd.conf
После публикации конфигуратор автоматически вносит изменения в файл конфигурации Apache httpd.conf. Проанализируем, как должна выглядеть правильная структура описания баз в этом файле. Для каждой базы должен быть создан свой блок Alias и соответствующие директивы доступа:
# Настройки для первой базы (Рабочая)
Alias "/base_prod" "C:/inetpub/wwwroot/base_prod/"
<Directory "C:/inetpub/wwwroot/base_prod/">
AllowOverride None
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "C:/inetpub/wwwroot/base_prod/default.vrd"
</Directory>
# Настройки для второй базы (Тестовая)
Alias "/base_test" "C:/inetpub/wwwroot/base_test/"
<Directory "C:/inetpub/wwwroot/base_test/">
AllowOverride None
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "C:/inetpub/wwwroot/base_test/default.vrd"
</Directory>
Обратите внимание: каждая директория ссылается на свой собственный файл дескриптора публикации default.vrd. Если пути настроены верно, веб-сервисы обеих баз будут успешно запущены и доступны по адресам:
http://имя_сервера/base_prod/ws/ИмяСервиса?wsdlhttp://имя_сервера/base_test/ws/ИмяСервиса?wsdl---
При работе с IIS администраторы часто сталкиваются со специфической проблемой: если опубликовать две базы (например, рабочую и тестовую) с одинаковыми именами веб-сервисов и одинаковыми пространствами имен, то работать будет только та база, к которой обратились первой. Второй запрос вернет пустую страницу или ошибку соединения.
Выясним причину проблемы
По умолчанию IIS запускает все веб-приложения 1С в рамках одного общего пула приложений (обычно это DefaultAppPool), который использует один и тот же рабочий процесс w3wp.exe. Из-за этого библиотеки расширения 1С смешивают кэш веб-сервисов разных баз в оперативной памяти одного процесса.
Решение: Изоляция пулов приложений IIS
Для стабильной работы необходимо разнести приложения 1С по разным пулам. Выполним настройку по шагам:
Pool_Base_Prod и Pool_Base_Test. Укажите версию .NET CLR (обычно "Без управляемого кода").base_prod и base_test).base_prod, выберите Управление приложением (Manage Application) -> Дополнительные параметры (Advanced Settings).Pool_Base_Prod.base_test, назначив ему пул Pool_Base_Test.После этой настройки для каждого веб-сервиса IIS будет запускать свой собственный изолированный рабочий процесс w3wp.exe. Это полностью исключит конфликты кэширования в памяти, повысит общую отказоустойчивость системы и позволит веб-сервисам работать параллельно.
---
Если ваши базы работают на разных версиях платформы 1С (например, одна на 8.3.21, а другая на 8.3.23), возникает аппаратное ограничение веб-серверов. Один экземпляр веб-сервера (Apache или IIS) может загрузить в свою память только один модуль расширения веб-сервера (wsap24.dll для Apache или wsisapi.dll для IIS).
Как решить эту проблему на Apache:
Рекомендуется установить два независимых экземпляра службы Apache на одном физическом сервере. Например, первый Apache будет слушать стандартный порт 80 и использовать модуль расширения от платформы 8.3.21. Второй Apache настраивается на порт 8080 и загружает модуль платформы 8.3.23. В файле конфигурации каждого экземпляра прописывается путь к соответствующей библиотеке:
# Для первого экземпляра Apache (Платформа 8.3.21):
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.21.1607/bin/wsap24.dll"
# Для второго экземпляра Apache (Платформа 8.3.23):
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.23.1865/bin/wsap24.dll"
Как решить эту проблему на IIS:
В IIS данная задача решается через сопоставление обработчиков (Handler Mappings). Вы можете настроить привязку обработчика к конкретной библиотеке wsisapi.dll не на уровне всего сервера, а индивидуально для каждого приложения (базы) внутри своего пула. Это позволяет запускать приложения разных версий 1С в рамках одного IIS без установки дополнительных служб.
Иногда требуется решить обратную задачу — опубликовать одну и ту же информационную базу на двух разных веб-серверах. Это стандартная практика для построения отказоустойчивых систем и балансировки нагрузки.
При такой схеме работы важно соблюдать три правила:
default.vrd должны быть жестко привязаны к одному и тому же кластеру серверов 1С и одной базе данных. Строка подключения ib должна быть идентичной:
ib="Srvr="1c-cluster-main";Ref="production_db";"
default.vrd на всех веб-серверах.Важное предупреждение безопасности: Публикация одной базы на нескольких веб-серверах абсолютно безопасна, так как веб-серверы выполняют роль лишь "транспортных узлов". Однако категорически запрещено подключать к одной СУБД (MS SQL, PostgreSQL) два разных независимых кластера серверов 1С одновременно. Это гарантированно приведет к разрушению структуры базы данных и потере информации из-за рассинхронизации системных кэшей и транзакционных блокировок.