При разработке современных веб-решений часто возникает задача интеграции интернет-магазина или личного кабинета с учетной системой 1С. Типичный сценарий: сайт крутится на одном хостинге (например, с IP-адресом 77.88.99.222 и доменным именем mysite.ru), а база 1С развернута на сервере компании или в облаке с внешним статическим IP-адресом (например, 22.33.44.111).
Нам необходимо сделать так, чтобы внешние клиенты или скрипты сайта могли обращаться по понятному адресу, например https://mysite.ru/WEB_API/GetOrders, и получать данные напрямую из 1С в режиме реального времени. В этой статье мы подробно разберем, как решить эту задачу, рассмотрим различные архитектурные подходы, их достоинства, недостатки и пошаговую настройку.
Связать доменное имя сайта с базой данных 1С, работающей на другом сервере, можно двумя принципиально разными путями:
1c.mysite.ru и силами DNS перенаправляем весь его трафик на IP-адрес сервера 1С. В этом случае запросы будут идти напрямую к 1С, минуя сервер сайта.mysite.ru/WEB_API/. Специальный модуль на веб-сервере сайта (Nginx или Apache) перехватывает эти запросы и незаметно для клиента пересылает их на сервер 1С, возвращая обратно полученный ответ.Давайте подробно разберем по шагам реализацию каждого из этих вариантов.
---
Этот вариант является самым простым в реализации, производительным и надежным. Он избавляет сервер сайта от лишней транзитной нагрузки и исключает задержки при передаче трафика.
Шаг 1. Создание поддомена в DNS.
Для начала нам нужно зайти в панель управления того регистратора или хостинга, где делегирован ваш домен mysite.ru. Нам необходимо добавить новую DNS-запись типа A для поддомена. Проанализируем настройки:
1c (или любое другое, например api, service)A22.33.44.111 (внешний статический IP вашего сервера 1С)После сохранения настроек должно пройти некоторое время (обычно от 15 минут до нескольких часов), чтобы DNS-серверы по всему миру обновили информацию. В результате поддомен 1c.mysite.ru начнет ссылаться на ваш сервер 1С.
Шаг 2. Развертывание и настройка веб-сервера на стороне 1С.
Сам по себе сервер 1С не умеет принимать HTTP-запросы на стандартных веб-портах (80 и 443). Для этого нам нужно развернуть полноценный веб-сервер на машине 22.33.44.111. Рассмотрим два популярных варианта:
При установке платформы 1С на этот сервер обязательно убедитесь, что в списке компонентов выбран пункт «Модули расширения веб-сервера». Без этих модулей веб-сервер не сможет взаимодействовать с платформой 1С.
Шаг 3. Публикация HTTP- или Web-сервиса.
Запустим конфигуратор 1С от имени администратора. Перейдем в меню Администрирование — Публикация на веб-сервере.... В открывшемся окне укажем:
BaseName).На вкладках «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="1CServer";Ref="BaseName";">
<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:
WACS (Windows ACME Simple). Она в автоматическом режиме создаст сертификат для поддомена 1c.mysite.ru, привяжет его к сайту в IIS и настроит планировщик на автоматическое продление каждые 3 месяца.Certbot, выполнив команду получения сертификата для нашего домена.После этого ссылка для обращения к базе примет окончательный вид: https://1c.mysite.ru/BaseName/hs/WEB_API/GetOrders.
---
Если создание поддомена по каким-то причинам нежелательно, или вам строго необходимо сохранить единый 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;
?>
---
Проанализируем частую ошибку: вы настроили поддомен 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С в глобальной сети сопряжена с рисками несанкционированного доступа. Разберем ключевые правила защиты информации при организации API:
WebAPI_User.1c.mysite.ru через JS-код браузера, учетные данные (логин и пароль в формате Base64) станут видны любому пользователю через панель разработчика. В таких случаях безопаснее использовать схему с проксированием (через PHP-прокладку или бэкенд сайта), где логин и пароль 1С хранятся в закрытых конфигурационных файлах сервера сайта и подставляются в запрос скрытно от конечного пользователя.---
Выясним ситуацию, когда у сервера 1С нет выделенного белого IP-адреса, он находится за NAT провайдера или внутри закрытой корпоративной сети, а открыть порты наружу системные администраторы категорически отказываются из соображений безопасности. В этом случае идеальным выходом станет использование технологии Cloudflare Tunnel (Zero Trust).
Схема работы выглядит следующим образом:
cloudflared.1c.mysite.ru к созданному туннелю.1c.mysite.ru, автоматически и безопасно заворачивается внутрь туннеля и передается на локальный порт вашего веб-сервера 1С.Помимо решения проблемы отсутствия белого IP, вы совершенно бесплатно получаете профессиональную защиту от DDoS-атак, автоматическое кэширование статики и SSL-сертификат «из коробки».
---
В платформе 1С существуют два механизма публикации веб-интерфейсов: классические Web-сервисы (SOAP/WSDL) и современные HTTP-сервисы (REST/JSON).
Мы настоятельно рекомендуем использовать для связи с сайтами именно HTTP-сервисы. Они обладают рядом неоспоримых преимуществ:
Мы подробно проанализировали варианты подключения веб-сервисов 1С к домену вашего сайта. Выбирайте вариант с поддоменом для достижения максимальной скорости и независимости систем или вариант с обратным проксированием для обеспечения повышенной безопасности и сокрытия архитектуры вашей корпоративной сети от посторонних глаз.