Как подключить веб-сервис или HTTP-сервис 1С к домену вашего сайта?

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

При разработке современных веб-решений часто возникает задача интеграции интернет-магазина или личного кабинета с учетной системой 1С. Типичный сценарий: сайт крутится на одном хостинге (например, с IP-адресом 77.88.99.222 и доменным именем mysite.ru), а база 1С развернута на сервере компании или в облаке с внешним статическим IP-адресом (например, 22.33.44.111).

Нам необходимо сделать так, чтобы внешние клиенты или скрипты сайта могли обращаться по понятному адресу, например https://mysite.ru/WEB_API/GetOrders, и получать данные напрямую из 1С в режиме реального времени. В этой статье мы подробно разберем, как решить эту задачу, рассмотрим различные архитектурные подходы, их достоинства, недостатки и пошаговую настройку.

Два основных подхода к интеграции домена и 1С

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

  1. Использование выделенного поддомена (Рекомендуемый способ). Мы создаем поддомен вида 1c.mysite.ru и силами DNS перенаправляем весь его трафик на IP-адрес сервера 1С. В этом случае запросы будут идти напрямую к 1С, минуя сервер сайта.
  2. Настройка обратного прокси (Reverse Proxy). Запросы продолжают поступать на основной домен mysite.ru/WEB_API/. Специальный модуль на веб-сервере сайта (Nginx или Apache) перехватывает эти запросы и незаметно для клиента пересылает их на сервер 1С, возвращая обратно полученный ответ.

Давайте подробно разберем по шагам реализацию каждого из этих вариантов.

---

Вариант 1. Настройка интеграции через поддомен (DNS + публикация)

Этот вариант является самым простым в реализации, производительным и надежным. Он избавляет сервер сайта от лишней транзитной нагрузки и исключает задержки при передаче трафика.

Шаг 1. Создание поддомена в DNS.

Для начала нам нужно зайти в панель управления того регистратора или хостинга, где делегирован ваш домен mysite.ru. Нам необходимо добавить новую DNS-запись типа A для поддомена. Проанализируем настройки:

После сохранения настроек должно пройти некоторое время (обычно от 15 минут до нескольких часов), чтобы DNS-серверы по всему миру обновили информацию. В результате поддомен 1c.mysite.ru начнет ссылаться на ваш сервер 1С.

Шаг 2. Развертывание и настройка веб-сервера на стороне 1С.

Сам по себе сервер 1С не умеет принимать HTTP-запросы на стандартных веб-портах (80 и 443). Для этого нам нужно развернуть полноценный веб-сервер на машине 22.33.44.111. Рассмотрим два популярных варианта:

При установке платформы 1С на этот сервер обязательно убедитесь, что в списке компонентов выбран пункт «Модули расширения веб-сервера». Без этих модулей веб-сервер не сможет взаимодействовать с платформой 1С.

Шаг 3. Публикация HTTP- или Web-сервиса.

Запустим конфигуратор 1С от имени администратора. Перейдем в меню Администрирование — Публикация на веб-сервере.... В открывшемся окне укажем:

На вкладках «Web-сервисы» или «HTTP-сервисы» отметим флажками те сервисы, которые мы хотим сделать доступными для сайта (в нашем случае это WEB_API). После нажатия кнопки «Опубликовать» в целевом каталоге создастся файл конфигурации default.vrd. Разберем его примерную структуру:


<?xml version="1.0" encoding="UTF-8"?>
<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="/BaseName"
       ib="Srvr=&quot;1CServer&quot;;Ref=&quot;BaseName&quot;;">
    <httpServices>
        <service name="WEB_API" rootUrl="WEB_API" enable="true"/>
    </httpServices>
</point>

Теперь наш сервис станет доступен локально по адресу http://localhost/BaseName/hs/WEB_API/GetOrders.

Шаг 4. Настройка SSL-шифрования (HTTPS).

Поскольку ваш основной сайт работает по защищенному протоколу https://mysite.ru, браузеры заблокируют любые попытки отправить запросы к незащищенному поддомену http://1c.mysite.ru из-за политики безопасности смешанного контента (Mixed Content). Нам необходимо обязательно настроить HTTPS на стороне веб-сервера 1С.

Для бесплатного получения качественного SSL-сертификата воспользуемся некоммерческим центром сертификации Let's Encrypt:

После этого ссылка для обращения к базе примет окончательный вид: https://1c.mysite.ru/BaseName/hs/WEB_API/GetOrders.

---

Вариант 2. Настройка обратного прокси (Reverse Proxy) на сервере сайта

Если создание поддомена по каким-то причинам нежелательно, или вам строго необходимо сохранить единый URL вида https://mysite.ru/WEB_API/..., настроим проксирование на сервере сайта 77.88.99.222.

Подход А. Настройка проксирования в Nginx.

Если сайт работает под управлением Nginx, откроем конфигурационный файл виртуального хоста сайта и добавим блок location, который будет перенаправлять запросы на физический адрес сервера 1С:


server {
    listen 443 ssl;
    server_name mysite.ru;

    # Конфигурация основного сайта
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Проксирование запросов к API 1С
    location /WEB_API/ {
        # Адрес публикации 1С на сервере 22.33.44.111
        proxy_pass https://22.33.44.111/BaseName/hs/WEB_API/;
        
        # Передаем оригинальные заголовки хоста и IP-адрес клиента
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Настройки таймаутов на случай тяжелых запросов к 1С
        proxy_connect_timeout 60s;
        proxy_send_timeout 90s;
        proxy_read_timeout 90s;
    }
}

После изменения конфигурации не забудем выполнить перезапуск службы командой nginx -s reload.

Подход Б. Настройка проксирования в Apache.

Если на хостинге сайта установлен веб-сервер Apache, включим модули mod_proxy и mod_proxy_http. В конфигурационном файле виртуального хоста (или в файле .htaccess, если это разрешено настройками хостинга) пропишем директивы:


<VirtualHost *:443>
    ServerName mysite.ru

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/mysite.crt
    SSLCertificateKeyFile /etc/ssl/private/mysite.key

    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy *>
        Require all granted
    </Proxy>

    # Правила перенаправления запросов
    ProxyPass /WEB_API/ https://22.33.44.111/BaseName/hs/WEB_API/
    ProxyPassReverse /WEB_API/ https://22.33.44.111/BaseName/hs/WEB_API/
</VirtualHost>

Подход В. Создание PHP-прокладки (скрипта-посредника).

В условиях жестких ограничений виртуального хостинга, когда у вас нет доступа к конфигурационным файлам веб-серверов Nginx/Apache, решением может стать написание простого скрипта-посредника на языке PHP. Скрипт принимает запрос от фронтенда сайта, с помощью библиотеки cURL отправляет запрос в 1С и возвращает полученный ответ обратно на фронтенд:


<?php
// Адрес публикации вашего HTTP-сервиса в 1С
$url1C = 'https://22.33.44.111/BaseName/hs/WEB_API/GetOrders';

// Получаем тело запроса от клиента сайта
$requestData = file_get_contents('php://input');
$headers = getallheaders();

$ch = curl_init($url1C);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestData);

// Добавляем авторизацию 1С (Basic Auth) в скрытом режиме
$username = 'WebUser';
$password = 'SecretPass123';
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

// Копируем заголовки запроса
$curlHeaders = [];
foreach ($headers as $key => $value) {
    if (strcasecmp($key, 'Host') !== 0) {
        $curlHeaders[] = "$key: $value";
    }
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Возвращаем ответ клиенту
http_response_code($httpCode);
header('Content-Type: application/json; charset=utf-8');
echo $response;
?>

---

Решение проблемы CORS (Cross-Origin Resource Sharing)

Проанализируем частую ошибку: вы настроили поддомен 1c.mysite.ru, но при попытке отправить к нему запрос из браузера с адреса https://mysite.ru с помощью JavaScript (технологии fetch или axios), консоль браузера взрывается ошибками CORS.

Это происходит потому, что в целях безопасности браузеры запрещают веб-страницам делать запросы к доменам, отличным от того, с которого была загружена сама страница. Чтобы разрешить такие запросы, наш HTTP-сервис в 1С обязан возвращать специальные разрешающие заголовки, а также уметь обрабатывать предварительные запросы браузера с методом OPTIONS (так называемые preflight-запросы).

Рассмотрим пример реализации метода-обработчика запроса в HTTP-сервисе 1С с поддержкой CORS:


Функция GetOrders(Запрос)
    
    // 1. Обработка предварительного запроса OPTIONS
    Если Запрос.Метод = "OPTIONS" Тогда
        Ответ = Новый HTTPСервисОтвет(200);
        ДобавитьЗаголовкиCORS(Ответ);
        Возврат Ответ;
    КонецЕсли;
    
    // 2. Основная бизнес-логика получения списка заказов
    СписокЗаказов = ПолучитьСписокЗаказовИзБазы(Запрос);
    
    // Сериализуем данные в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, СписокЗаказов);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Формируем HTTP-ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    // Обязательно добавляем заголовки CORS к основному ответу
    ДобавитьЗаголовкиCORS(Ответ);
    
    Возврат Ответ;
КонецФункции

Процедура ДобавитьЗаголовкиCORS(Ответ)
    // Разрешаем запросы только с вашего доверенного домена сайта
    Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "https://mysite.ru");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Credentials", "true");
КонецПроцедуры

---

Обеспечение безопасности данных 1С

Публикация базы данных 1С в глобальной сети сопряжена с рисками несанкционированного доступа. Разберем ключевые правила защиты информации при организации API:

---

Альтернативное решение: Использование Cloudflare Tunnel

Выясним ситуацию, когда у сервера 1С нет выделенного белого IP-адреса, он находится за NAT провайдера или внутри закрытой корпоративной сети, а открыть порты наружу системные администраторы категорически отказываются из соображений безопасности. В этом случае идеальным выходом станет использование технологии Cloudflare Tunnel (Zero Trust).

Схема работы выглядит следующим образом:

  1. На сервере 1С устанавливается и запускается небольшая официальная утилита-демон cloudflared.
  2. Она устанавливает зашифрованное исходящее соединение с ближайшим сервером Cloudflare. Порты на вашем роутере наружу открывать не требуется!
  3. В панели управления Cloudflare вы привязываете поддомен 1c.mysite.ru к созданному туннелю.
  4. Весь внешний трафик, поступающий на 1c.mysite.ru, автоматически и безопасно заворачивается внутрь туннеля и передается на локальный порт вашего веб-сервера 1С.

Помимо решения проблемы отсутствия белого IP, вы совершенно бесплатно получаете профессиональную защиту от DDoS-атак, автоматическое кэширование статики и SSL-сертификат «из коробки».

---

Что выбрать для интеграции с сайтом: SOAP или REST (HTTP-сервисы)?

В платформе 1С существуют два механизма публикации веб-интерфейсов: классические Web-сервисы (SOAP/WSDL) и современные HTTP-сервисы (REST/JSON).

Мы настоятельно рекомендуем использовать для связи с сайтами именно HTTP-сервисы. Они обладают рядом неоспоримых преимуществ:

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

← На главную