При разработке интеграционных решений на базе веб-сервисов в 1С:Предприятие часто возникают задачи, требующие идентификации сервера, на котором выполняется текущий код. Например, если ваша информационная база опубликована на нескольких узлах (веб-серверах), может возникнуть потребность понять, какой именно сервер обрабатывает запрос. Давайте разберем, как устроена работа веб-сервисов в 1С и какие методы мы можем использовать для получения технической информации.
Важно помнить, что когда мы обращаемся к веб-сервису 1С, процесс обработки запроса разделен на две части:
wsap.dll или аналогичным), который инициирует выполнение кода в рабочем процессе сервера 1С (rphost).Основная сложность заключается в том, что в момент исполнения процедуры веб-сервиса внутри 1С, контекст исходного HTTP-запроса от веб-сервера (такой как заголовки или HTTP_HOST) не всегда доступен напрямую. Платформа 1С абстрагирует нас от сетевого уровня. Поэтому классические методы получения URL, доступные в HTTPСервисЗапрос, в обычных SOAP веб-сервисах отсутствуют.
Если наша задача заключается в том, чтобы узнать, на каком именно физическом или виртуальном сервере в данный момент выполняется код 1С, мы можем воспользоваться средствами операционной системы через COM-объект WbemScripting.SWbemLocator. Этот метод позволяет нам запросить конфигурацию сетевых адаптеров.
Рассмотрим пример кода, который возвращает IP-адрес текущего сервера:
Функция ПолучитьIPАдресСервера() Экспорт
strComputer = ".";
SWBemlocator = Новый COMОбъект("WbemScripting.SWbemLocator");
objWMIService = SWBemlocator.ConnectServer(strComputer, "root\CIMV2");
IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where ipenabled = true");
Для Каждого Конфигурация Из IPConfigSet Цикл
Для Каждого СтрПараметр Из Конфигурация.IPAddress Цикл
Возврат СтрПараметр;
КонецЦикла;
КонецЦикла;
Возврат "";
КонецФункции
Обратите внимание: Данный код выполняется на стороне сервера 1С. Он вернет IP-адрес того сервера, на котором запущен рабочий процесс rphost. Если ваша база работает в кластере, этот метод покажет адрес сервера кластера, а не адрес веб-сервера, который принял запрос от клиента.
Поскольку сетевой уровень (веб-сервер) и прикладной уровень (1С) работают раздельно, лучшей практикой считается передача информации о сервере «извне». Разберем, как сделать архитектуру вашего приложения более гибкой:
ИдентификаторСервера./Service_Node1/ и /Service_Node2/). Внутри кода 1С можно считывать контекст обращения и понимать, через какой путь пришел запрос.Анализируя ситуацию, важно понимать ограничения платформы:
WbemScripting (который является технологией Windows) будет невозможно. В такой среде вам придется использовать системные вызовы через КомандаСистемы или ЗапуститьПриложение для выполнения shell-скриптов, возвращающих сетевые настройки.Подводя итог, если вам критически важно различать точки входа, проектируйте веб-сервисы так, чтобы клиент сам сообщал, через какой узел он работает. Это сделает вашу систему независимой от изменений настроек веб-серверов и позволит избежать сложной работы с WMI или системными вызовами.