Публикация 1С на веб-сервере подключает информационную базу к Apache или IIS через модуль расширения платформы. После неё база открывается в браузере, тонкий клиент ходит по http(s) без открытых портов кластера, а сайт и CRM вызывают HTTP-сервисы, web-сервисы и OData. Ниже — установка, публикация из конфигуратора и через webinst, default.vrd, HTTPS через nginx, проверка кодом и ошибки 403, 404, 500.
| Что нужно | Что отметить при публикации | Адрес |
|---|---|---|
| Веб-клиент, тонкий и мобильный клиент | «Публиковать доступ для клиентских приложений» | http://srv/trade/ |
| HTTP-сервисы | закладка «HTTP-сервисы» | http://srv/trade/hs/<корневой URL>/… |
| Web-сервисы | закладка «Web-сервисы» | http://srv/trade/ws/<имя файла публикации>?wsdl |
| OData | «Публиковать стандартный интерфейс OData» | http://srv/trade/odata/standard.odata/ |
Как выбрать способ интеграции — в статье «API 1С: как подключиться к базе извне».
Веб-сервер передаёт запросы к каталогу публикации модулю расширения 1С: для Apache 2.4 это wsap24.dll (на Linux — wsap24.so), для IIS — wsisapi.dll. Модуль читает default.vrd и подключается к базе по строке соединения из него:
1Cv8.1CD в процессе веб-сервера, и учётной записи веб-сервера нужны права на запись в каталог базы.Разрядность платформы и веб-сервера должна совпадать. После обновления платформы публикацию обновляют: в настройках веб-сервера прописан путь к модулю конкретной версии.
| Apache 2.4 | IIS | |
|---|---|---|
| ОС | Windows и Linux | только Windows |
| Настройки | текстовый httpd.conf, удобно для скриптов | диспетчер IIS и web.config |
| Флажок аутентификации ОС при публикации | нет | есть, у webinst — ключ -osauth |
| Версии платформы | одна на экземпляр Apache | у каждой публикации свой обработчик |
| Коды ответа HTTP-сервисов | только стандартные | произвольные |
На Linux выбора нет — Apache. На Windows Apache проще переносить и автоматизировать, а IIS берут, когда нужен вход по доменной учётной записи или разные версии платформы на одном сервере.
Пошаговая настройка IIS — компоненты, разрядность пула, права IIS_IUSRS и разбор ошибок 500, 404 и 405 — в отдельной статье «Публикация 1С на IIS».
Платформа — с компонентом «Модули расширения веб-сервера». Без него публикация остановится на сообщении «Не установлены модули расширения веб-сервера…».
Apache 2.4 на Windows обычно берут 64-битной сборкой с Apache Lounge и регистрируют службой (httpd -k install), на Linux ставят пакет apache2 или httpd. При разной разрядности Apache и платформы конфигуратор откажет: «Невозможна публикация… при различной разрядности платформы…».
IIS — в компонентах Windows включите «Расширения ISAPI» и «Фильтры ISAPI». Публикация создаёт приложение в Default Web Site, обработчик «1C Web-service Extension» с wsisapi.dll и разрешение в «Ограничениях ISAPI и CGI». Сам %SystemDrive%\Inetpub\wwwroot каталогом публикации быть не может.
| Веб-сервер | Учётная запись | Права |
|---|---|---|
| Apache на Windows | служба, «Локальная система» | хватает для локального диска; для сетевой папки — доменная учётная запись |
| Apache на Linux | www-data или apache | чтение каталога публикации, запись в каталог файловой базы |
| IIS | IUSR и группа IIS_IUSRS | чтение каталога публикации и bin платформы, «Изменение» на каталог файловой базы |
Для файловой базы в IIS конфигуратор сам проверит права анонимного пользователя. Предупреждение «У пользователя (группы) "…" отсутствуют права на доступ к каталогу информационной базы…» не пропускайте.
Конфигуратор публикует только на веб-сервер своего компьютера.
Флажок «Публиковать дистрибутив тонкого клиента» позволит пользователю с другой версией клиента установить нужную прямо с публикации. Кнопки «Сохранить» и «Загрузить» пишут и читают vrd-файл. В httpd.conf появляются строки:
# httpd.conf, Apache 2.4 на Windows. Эти строки добавляют конфигуратор и webinst;
# на Linux модуль лежит в /opt/1cv8/x86_64/<версия>/wsap24.so
LoadModule _1cws_module "C:/Program Files/1cv8/8.3.27.1786/bin/wsap24.dll"
# 1c publication
Alias "/trade" "C:/www/trade/"
<Directory "C:/www/trade/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "C:/www/trade/default.vrd"
</Directory>
# Проверка конфигурации и перезапуск службы (командная строка администратора):
# httpd -t
# httpd -k restart
Для Linux, удалённого сервера и скриптов есть утилита webinst из каталога платформы; запуск — от администратора или через sudo. Ключи по справке 8.3.27:
-publish (по умолчанию) или -delete; веб-сервер — -apache24, -apache22 или -iis;-wsdir — имя публикации, -dir — каталог (при публикации обязателен), -connstr — строка соединения;-confPath — путь к конфигурации Apache, -osauth — Windows-аутентификация в IIS;-descriptor — готовый vrd: целиком заменяет default.vrd, а -wsdir и -connstr перекрывают его base и ib.# Windows: командная строка от имени администратора, каталог платформы нужной версии
cd "C:\Program Files\1cv8\8.3.27.1786\bin"
webinst -publish -apache24 -wsdir trade -dir "C:\www\trade" -connstr "Srvr=srv01;Ref=trade;" -confPath "C:\Apache24\conf\httpd.conf"
# Та же база в IIS (сайт Default Web Site), вход по учётной записи Windows
webinst -publish -iis -wsdir trade -dir "C:\inetpub\trade" -connstr "Srvr=srv01;Ref=trade;" -osauth
# Linux (Debian, Ubuntu): файловая база, Apache 2.4 из пакета apache2
cd /opt/1cv8/x86_64/8.3.27.1786
sudo ./webinst -publish -apache24 -wsdir trade -dir /var/www/trade \
-connstr "File=/srv/1c/trade;" -confPath /etc/apache2/apache2.conf
sudo chown -R www-data:www-data /srv/1c/trade # файловой базе нужны права веб-сервера
sudo apachectl -t && sudo systemctl restart apache2
# Переопубликовать по готовому vrd: после обновления платформы или ручной правки default.vrd
sudo ./webinst -publish -apache24 -dir /var/www/trade \
-descriptor /var/www/trade/default.vrd -confPath /etc/apache2/apache2.conf
# Удалить публикацию
sudo ./webinst -delete -apache24 -wsdir trade -confPath /etc/apache2/apache2.conf
default.vrd — XML-описание публикации. Руками его правят, чтобы включить сервисы расширений, пул сеансов или отладку:
<?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="/trade"
ib="Srvr="srv01";Ref="trade";">
<ws enable="true"
pointEnableCommon="true"
publishExtensionsByDefault="true"/>
<httpServices publishByDefault="true"
publishExtensionsByDefault="true">
<service name="ОбменССайтом"
rootUrl="site"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
</httpServices>
<standardOdata enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<debug enable="true"
protocol="http"
url="http://srv01:1550"/>
</point>
| Элемент | Что задаёт |
|---|---|
point: base, ib | имя публикации в адресе и строку соединения File=… или Srvr=…;Ref=… |
ws | web-сервисы: enable — публиковать ли их, pointEnableCommon — сервисы без явной настройки, publishExtensionsByDefault — из расширений |
httpServices | publishByDefault — все HTTP-сервисы конфигурации, publishExtensionsByDefault — из расширений, service — настройки одного сервиса |
standardOdata | стандартный интерфейс OData |
reuseSessions, sessionMaxAge, poolSize, poolTimeout | повторное использование сеансов: вызов берёт сеанс из пула, а не открывает новый |
debug | отладка клиентов, работающих через публикацию (см. «Отладка на сервере 1С»); на рабочей базе выключайте |
После правки перезапустите Apache или пул приложений IIS. Имя и пароль 1С в строке ib (Usr, Pwd) лучше не хранить: файл прочитает любой, у кого есть доступ к каталогу.
Файловая база публикуется так же, но работает внутри процесса веб-сервера: держите её на локальном диске и помните, что частые запросы интеграций упрутся в табличные блокировки. Для постоянного обмена с сайтом нужен сервер 1С.
Публикация сервера 1С гибче: веб-сервер работает как клиент кластера и может стоять на отдельной машине, например в DMZ, с доступом к портам кластера. Проверьте и лицензирование: при работе через веб-сервер клиентская лицензия ищется не на компьютере пользователя.
Сертификат удобнее держать не в Apache (mod_ssl) или IIS, а на nginx перед ними: Let's Encrypt продлевается сам, наружу открыт только 443, а Apache слушает внутренний адрес (Listen 127.0.0.1:8080). Правила:
/trade), иначе сломаются адреса веб-клиента;Host и X-Forwarded-Proto: по ним код 1С соберёт внешний адрес;# /etc/nginx/conf.d/1c.conf: HTTPS снаружи, Apache с публикацией /trade на 127.0.0.1:8080
server {
listen 80;
server_name 1c.example.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name 1c.example.ru;
ssl_certificate /etc/letsencrypt/live/1c.example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/1c.example.ru/privkey.pem;
client_max_body_size 200m; # файлы из веб-клиента, большие POST в сервисы
location /trade/ {
proxy_pass http://127.0.0.1:8080; # без URI: путь /trade/... уходит как есть
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http://$host/ https://$host/;
proxy_read_timeout 600s; # длинные отчёты и обмены
proxy_send_timeout 600s;
}
}
http://srv/trade/ открывается веб-клиент с окном входа.http://srv/trade. В списке баз это строка Connect=ws="http://srv/trade";, из командной строки — ключ /WS: 1cv8c.exe /WS "https://1c.example.ru/trade".// Обработка или общий модуль с флагом «Сервер». Сервер 1С сам обращается к публикации
// и расшифровывает коды ответа. Пример вызова:
// Таблица = ПроверитьПубликацию("https://1c.example.ru/trade", "diag/whoami", ИмяПользователя, Пароль);
Функция ПроверитьПубликацию(Знач АдресПубликации, Знач ПутьHTTPСервиса = "",
Знач Пользователь = "", Знач Пароль = "") Экспорт
Адрес = РазобратьАдресПубликации(АдресПубликации);
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Назначение", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("КодСостояния", Новый ОписаниеТипов("Число"));
Результат.Колонки.Добавить("Вывод", Новый ОписаниеТипов("Строка"));
ДобавитьТочку(Результат, "Веб-клиент и тонкий клиент", Адрес.Путь + "/");
ДобавитьТочку(Результат, "Стандартный интерфейс OData", Адрес.Путь + "/odata/standard.odata/");
Если ЗначениеЗаполнено(ПутьHTTPСервиса) Тогда
ДобавитьТочку(Результат, "HTTP-сервис", Адрес.Путь + "/hs/" + ПутьHTTPСервиса);
КонецЕсли;
Для Каждого Сервис Из Метаданные.WebСервисы Цикл
ДобавитьТочку(Результат, "Web-сервис " + Сервис.Имя,
Адрес.Путь + "/ws/" + Сервис.ИмяФайлаПубликации + "?wsdl");
КонецЦикла;
// Сертификат сервера не проверяем: задача — найти, где ломается публикация.
// Для рабочего обмена передайте Новый СертификатыУдостоверяющихЦентровОС()
ЗащищенноеСоединение = ?(Адрес.HTTPS, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
Соединение = Новый HTTPСоединение(Адрес.Хост, Адрес.Порт, Пользователь, Пароль, , 30, ЗащищенноеСоединение);
Для Каждого Точка Из Результат Цикл
Попытка
Ответ = Соединение.Получить(Новый HTTPЗапрос(Точка.Адрес));
Точка.КодСостояния = Ответ.КодСостояния;
Точка.Вывод = РасшифровкаКодаОтвета(Ответ.КодСостояния);
Исключение
// DNS, закрытый порт, TLS: запрос не дошёл даже до веб-сервера
Точка.Вывод = "Нет ответа: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура ДобавитьТочку(Таблица, Назначение, Адрес)
Точка = Таблица.Добавить();
Точка.Назначение = Назначение;
Точка.Адрес = Адрес;
КонецПроцедуры
// "https://1c.example.ru:8443/trade/" -> HTTPS = Истина, Хост, Порт = 8443, Путь = "/trade"
Функция РазобратьАдресПубликации(Знач АдресПубликации)
Результат = Новый Структура("HTTPS, Хост, Порт, Путь", Ложь, "", 0, "");
Адрес = СокрЛП(АдресПубликации);
Если СтрНачинаетсяС(НРег(Адрес), "https://") Тогда
Результат.HTTPS = Истина;
Адрес = Сред(Адрес, 9);
ИначеЕсли СтрНачинаетсяС(НРег(Адрес), "http://") Тогда
Адрес = Сред(Адрес, 8);
КонецЕсли;
Позиция = СтрНайти(Адрес, "/");
ХостИПорт = ?(Позиция = 0, Адрес, Лев(Адрес, Позиция - 1));
Путь = ?(Позиция = 0, "", Сред(Адрес, Позиция));
Пока СтрЗаканчиваетсяНа(Путь, "/") Цикл
Путь = Лев(Путь, СтрДлина(Путь) - 1);
КонецЦикла;
Результат.Путь = Путь;
Позиция = СтрНайти(ХостИПорт, ":");
Если Позиция = 0 Тогда
Результат.Хост = ХостИПорт;
Результат.Порт = ?(Результат.HTTPS, 443, 80);
Иначе
Результат.Хост = Лев(ХостИПорт, Позиция - 1);
Результат.Порт = Число(Сред(ХостИПорт, Позиция + 1));
КонецЕсли;
Возврат Результат;
КонецФункции
// Подсказка по коду ответа: куда смотреть в первую очередь
Функция РасшифровкаКодаОтвета(КодСостояния)
Если КодСостояния >= 200 И КодСостояния < 400 Тогда
Возврат "Отвечает";
ИначеЕсли КодСостояния = 401 Тогда
Возврат "Публикация работает: 1С просит пользователя или пароль неверный";
ИначеЕсли КодСостояния = 403 Тогда
Возврат "Запрет веб-сервера: Require all granted, права на каталог публикации";
ИначеЕсли КодСостояния = 404 Тогда
Возврат "Не опубликовано: имя публикации, default.vrd, корневой URL или шаблон";
ИначеЕсли КодСостояния = 405 Тогда
Возврат "Адрес есть, но метод GET для него не описан";
ИначеЕсли КодСостояния >= 500 Тогда
Возврат "Ошибка модуля веб-сервера или кода 1С: текст в теле ответа";
КонецЕсли;
Возврат "Код " + Формат(КодСостояния, "ЧГ=0");
КонецФункции
Каким адресом запрос дошёл до 1С, особенно за прокси, покажет диагностический метод HTTP-сервиса. Как создать сервис — в статье «HTTP-сервис 1С: создание с нуля».
// Модуль HTTP-сервиса «Диагностика»: корневой URL diag, шаблон /whoami,
// метод GET с обработчиком WhoAmIGET. Показывает, каким адресом запрос дошёл до 1С.
Функция WhoAmIGET(Запрос)
Данные = Новый Структура;
Данные.Вставить("baseUrl", Запрос.БазовыйURL);
Данные.Вставить("relativeUrl", Запрос.ОтносительныйURL);
Данные.Вставить("externalUrl", ВнешнийБазовыйURL(Запрос));
Данные.Вставить("forwardedFor", ЗначениеЗаголовка(Запрос.Заголовки, "X-Forwarded-For"));
Данные.Вставить("user", ИмяПользователя());
Данные.Вставить("configuration", Метаданные.Имя + " " + Метаданные.Версия);
Данные.Вставить("serverTime", XMLСтрока(ТекущаяДатаСеанса()));
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
// Адрес сервиса глазами клиента. За nginx с HTTPS БазовыйURL начинается с http://:
// до Apache запрос шёл по http, настоящую схему передаёт заголовок X-Forwarded-Proto.
Функция ВнешнийБазовыйURL(Запрос)
Адрес = Запрос.БазовыйURL;
Схема = НРег(ЗначениеЗаголовка(Запрос.Заголовки, "X-Forwarded-Proto"));
Если Схема = "https" И СтрНачинаетсяС(НРег(Адрес), "http://") Тогда
Адрес = "https://" + Сред(Адрес, 8);
КонецЕсли;
Возврат Адрес;
КонецФункции
// Имена HTTP-заголовков не зависят от регистра, а ключи соответствия — зависят
Функция ЗначениеЗаголовка(Заголовки, Имя)
Для Каждого Заголовок Из Заголовки Цикл
Если НРег(Заголовок.Ключ) = НРег(Имя) Тогда
Возврат Заголовок.Значение;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
После публикации обычно просят ссылку на документ для письма или мессенджера, которая откроется в браузере. Её собирают из адреса базы и навигационной ссылки объекта через #:
// Модуль формы документа или справочника. Ссылка, по которой объект откроется
// в браузере или в тонком клиенте, подключённом через ту же публикацию.
&НаКлиенте
Процедура ПоказатьСсылкуДляБраузера(Ссылка)
АдресПубликации = АдресПубликацииКлиента();
Если ПустаяСтрока(АдресПубликации) Тогда
ПоказатьПредупреждение(, "База открыта без веб-сервера: адрес публикации неизвестен");
Возврат;
КонецЕсли;
Сообщить(ВнешняяСсылка(Ссылка, АдресПубликации));
КонецПроцедуры
// Адрес публикации, через которую работает текущий сеанс, или пустая строка.
// Без веб-сервера платформа вернёт e1c://filev/... (файловая база) или e1c://server/...
&НаКлиенте
Функция АдресПубликацииКлиента()
Адрес = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
Если СтрНачинаетсяС(НРег(Адрес), "http://") Или СтрНачинаетсяС(НРег(Адрес), "https://") Тогда
Возврат Адрес;
КонецЕсли;
Возврат "";
КонецФункции
// Такую функцию удобно держать в общем модуле с флагами «Клиент» и «Сервер». В регламентном
// задании ПолучитьНавигационнуюСсылкуИнформационнойБазы() пустая, адрес передают параметром
// (в конфигурациях на БСП он хранится в константе АдресПубликацииИнформационнойБазыВИнтернете).
&НаКлиентеНаСервереБезКонтекста
Функция ВнешняяСсылка(Ссылка, Знач АдресПубликации)
Если Не СтрЗаканчиваетсяНа(АдресПубликации, "/") Тогда
АдресПубликации = АдресПубликации + "/";
КонецЕсли;
Возврат АдресПубликации + "#" + ПолучитьНавигационнуюСсылку(Ссылка);
КонецФункции
В конфигурациях на БСП адрес хранят в настройках: в УТ 11.4 это панель «Общие настройки», группа «Публикация информационной базы», поле «Адрес в Интернете». Из кода его читает ОбщегоНазначения.АдресПубликацииИнформационнойБазыВИнтернете().
Новый HTTPСоединение(Адрес.Хост, …) — хост без протокола, HTTPS включает ЗащищенноеСоединениеOpenSSL; без списка удостоверяющих центров сертификат сервера не проверяется.Сервис.ИмяФайлаПубликации — из него собирается адрес WSDL.Запрос.БазовыйURL за nginx начинается с http://; внешний адрес восстанавливают по X-Forwarded-Proto, а имена заголовков сравнивают без учёта регистра.ПолучитьНавигационнуюСсылкуИнформационнойБазы() даёт http(s)://… только через веб-сервер, при прямом подключении — e1c://…, в фоновых заданиях — пустую строку.httpd -t. «Cannot load …/wsap24.dll into server: %1 не является приложением Win32» — разная разрядность Apache и модуля; «Не найден указанный модуль» — LoadModule ссылается на удалённую версию платформы. Переопубликуйте базу из конфигуратора нужной версии; на Linux сообщение с именем .so-библиотеки означает нехватку зависимостей.-confPath.Require all granted или путь Directory не совпадает с Alias. «search permissions are missing» — у www-data нет прав на каталог (на RHEL проверьте и SELinux). В IIS не хватает прав IUSR или IIS_IUSRS.wsisapi.dll не разрешён в «Ограничениях ISAPI и CGI». Ответ 404 на /hs/… или /ws/… — сервис не опубликован, для расширения нет publishExtensionsByDefault, не совпал корневой URL или шаблон, не обновлена конфигурация базы данных.wsisapi.dll в 64-битном пуле: поставьте 64-битную платформу или включите у пула «Разрешить 32-разрядные приложения». Если в ответе текст 1С: «Несоответствие версий клиента и сервера 1С:Предприятия» — модуль веб-сервера другой версии, чем кластер; «Информационная база не обнаружена!» — неверный Ref в ib. У HTTP-сервиса 500 — необработанное исключение в обработчике, смотрите журнал регистрации.Для разработки и тестов — да: автономный сервер ibsrv сам принимает HTTP-запросы. Для рабочей публикации с HTTPS и ограничением доступа привычнее веб-сервер.
Веб-клиенту не нужна установка, но для файлов, внешних компонент и оборудования нужно расширение браузера. Тонкий клиент работает почти как при прямом подключении, но требует платформу версии сервера.
Снаружи — только HTTPS. Пути интеграций (/trade/hs/, /trade/odata/) ограничьте по IP в nginx, для сервисов заведите пользователя 1С с минимальной ролью — см. настройку прав доступа в 1С.
Если базу нужно открыть через интернет по HTTPS или поднять HTTP-сервисы для сайта, а своего администратора 1С нет, отдайте задачу исполнителю. Разместите задачу на площадке — оценка бесплатная, ответ в течение рабочего дня. Для интеграции с сайтом посмотрите услугу обмена 1С с сайтом.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.