Веб-сервисы и HTTP-сервисы 1С на Apache и IIS: от конфигуратора до первого ответа
Содержание
Чтобы опубликовать веб-сервис в 1С, нужны три вещи: сервис в конфигурации (Общие → Web-сервисы или Общие → HTTP-сервисы), установленный веб-сервер (Apache или IIS) с модулем расширения 1С и публикация базы через Администрирование → Публикация на веб-сервере в конфигураторе. После этого SOAP-сервис отвечает по адресу http://сервер/база/ws/..., а HTTP-сервис — по адресу http://сервер/база/hs/....
Обычно всё ломается не в коде, а на стыке: Apache не грузит модуль, пользователь с кириллическим логином получает 401, галочка у сервиса в окне публикации не стоит. Ниже порядок действий, при котором внешняя система получит ответ с первого раза, и разбор ошибок, если не получила.
1. Что выбрать и что подготовить до публикации
В 1С 8.3 есть два механизма, и путают их постоянно.
| Web-сервис (SOAP) | HTTP-сервис (REST) | |
|---|---|---|
| Протокол | SOAP поверх HTTP, описание в WSDL | Обычные HTTP-запросы GET, POST, PUT, DELETE |
| Формат данных | XML по схеме из пакета XDTO | Любой: JSON, XML, текст, файл |
| Адрес | /ws/имя_файла.1cws | /hs/корневой_URL/шаблон |
| Кому удобен | Старые корпоративные системы, госинформсистемы, обмены «1С — 1С» | Сайты, мобильные приложения, интернет-магазины, скрипты |
| Порог входа | Нужно описать типы в XDTO | Минимальный: один шаблон и одна функция |
Если внешняя сторона прислала WSDL — делайте web-сервис. Если интегратор говорит «дайте API на JSON» — HTTP-сервис.
Подготовка на сервере:
- 🧩 Модули расширения веб-сервера. При установке платформы отметьте компонент «Модули расширения веб-сервера». Без него в каталоге
binнет файловwsap24.dll(Apache 2.4) иwsisapi.dll(IIS). - 🖥️ Веб-сервер. Apache 2.4 или IIS с компонентом «Расширения ISAPI». На Linux — Apache, модуль лежит в
/opt/1cv8/x86_64/<версия>/wsap24.so. - ⚖️ Разрядность. Модуль 1С и веб-сервер должны быть одной разрядности: 64-битный Apache не загрузит 32-битный
wsap24.dll. - 🔢 Версия. Модуль берётся из той версии платформы, которой публикуете. После обновления платформы публикацию нужно обновить — путь к модулю в
httpd.confуказывает на старую папку.
Для сервисов не используйте пользователя с кириллическим именем. Базовая HTTP-аутентификация передаёт логин в кодировке, которую клиент и сервер понимают по-разному, и внешняя система получает 401 при верном пароле. Заведите служебного пользователя с латинским логином, например api_shop.
2. Создание HTTP-сервиса и веб-сервиса в конфигураторе
Работайте в копии конфигурации или в расширении. Для типовой конфигурации на поддержке удобнее расширение: основная конфигурация не снимается с поддержки, обновления ставятся без сравнения.
HTTP-сервис за пять шагов
- В дереве конфигурации откройте
Общие → HTTP-сервисыи добавьте новый объект, напримерAPI. - Заполните Корневой URL, например
api. Это часть адреса после/hs/. - На вкладке шаблонов добавьте шаблон URL
/v1/orders/{number}. Фигурные скобки — параметр. - Внутри шаблона добавьте метод
GETи создайте для него обработчик (кнопкой открытия у поля «Обработчик» — конфигуратор сам создаст функцию в модуле сервиса). - Выполните
Обновить конфигурацию базы данных(F7).
Обработчик получает объект HTTPСервисЗапрос и обязан вернуть HTTPСервисОтвет:
Функция OrdersGET(Запрос)
НомерЗаказа = Запрос.ПараметрыURL.Получить("number");
Если Не ЗначениеЗаполнено(НомерЗаказа) Тогда
Возврат Новый HTTPСервисОтвет(400);
КонецЕсли;
Данные = Новый Структура("number, status", НомерЗаказа, "found");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
Последний параметр УстановитьТелоИзСтроки убирает метку BOM в начале ответа. Многие JSON-парсеры на PHP и JavaScript спотыкаются о неё и сообщают о невалидном JSON, хотя глазами всё выглядит правильно.
Для POST тело запроса читают через Запрос.ПолучитьТелоКакСтроку(), а затем разбирают ЧтениеJSON и ПрочитатьJSON.
Web-сервис (SOAP)
- Сначала создайте пакет XDTO в
Общие → XDTO-пакеты, если операция возвращает сложный тип. Для простых значений (строка, число, булево) хватит стандартных типовxs:string,xs:decimal,xs:boolean. - В
Общие → Web-сервисыдобавьте сервис. Заполните URI пространства имён (например,http://example.local/stock), на вкладке «Прочее» укажите Имя файла публикации, напримерstock.1cws. - Добавьте операцию, задайте тип возвращаемого значения и параметры с их типами.
- Откройте процедуру операции и напишите код. Это обычная функция модуля сервиса, её параметры совпадают с параметрами операции.
Функция ПолучитьОстаток(Артикул)
// Здесь запрос к регистру остатков по артикулу
Возврат 0;
КонецФункции
После обновления базы WSDL будет доступен по адресу http://сервер/база/ws/stock.1cws?wsdl.
3. Права пользователя и роли для веб-сервисов 1С
Сервис выполняется от имени пользователя информационной базы, под которым внешняя система авторизовалась. Отсюда три правила.
Отдельный пользователь под интеграцию. Не отдавайте интегратору логин бухгалтера или администратора. Создайте служебного пользователя: в типовых конфигурациях это Администрирование → Настройки пользователей и прав → Пользователи.
Отдельная роль. Создайте в конфигурации или расширении роль ИспользованиеAPI и дайте ей права ровно на те объекты, которые читает и пишет обработчик: «Чтение» на справочник номенклатуры, «Чтение» на регистр остатков, «Добавление» и «Изменение» на документ заказа. Флаг «Устанавливать права для новых объектов» не ставьте.
Привилегированный режим — точечно. Если обработчику нужно прочитать данные, которые пользователю видеть нельзя (например, константу с настройками), оберните это место в УстановитьПривилегированныйРежим(Истина) и сразу верните Ложь. Выдавать сервисному пользователю «Полные права» ради одного запроса — плохая идея: при утечке пароля злоумышленник получит всю базу.
Способы аутентификации:
| Способ | Как работает | Когда подходит |
|---|---|---|
| Basic | Логин и пароль в заголовке Authorization | Почти всегда, но только по HTTPS |
| Аутентификация ОС | Учётная запись Windows через IIS | Внутренняя сеть с доменом |
| Учётные данные в публикации | Логин и пароль записаны в default.vrd, клиент не авторизуется | Только для закрытого контура, иначе сервис открыт всем |
Basic-аутентификация по голому HTTP передаёт пароль открытым текстом. Для сервисов, которые смотрят в интернет, настройте HTTPS на стороне веб-сервера: в Apache через mod_ssl, в IIS через привязку сайта к сертификату. Сама 1С сертификатами здесь не управляет.
4. Публикация веб-сервиса на веб-сервере: Apache, IIS и webinst
Через конфигуратор
- Запустите конфигуратор от имени администратора Windows — иначе он не сможет записать
httpd.confили настройки IIS. - Откройте
Администрирование → Публикация на веб-сервере. - Укажите Имя публикации (оно станет частью адреса, лучше латиницей:
trade), выберите веб-сервер и Каталог, где будет лежатьdefault.vrd. - На вкладке «Web-сервисы» отметьте «Публиковать Web-сервисы по умолчанию» или конкретные сервисы. На вкладке «HTTP сервисы» — «Публиковать HTTP сервисы по умолчанию». Для сервисов из расширения отдельно отметьте «Публиковать HTTP сервисы расширений по умолчанию».
- Нажмите «Опубликовать». Для Apache конфигуратор предложит перезапустить службу — соглашайтесь.
Проверка: откройте в браузере http://localhost/trade/hs/api/v1/orders/123. Браузер запросит логин и пароль служебного пользователя и покажет JSON.
Перезапуск Apache или пула приложений IIS обрывает текущие запросы ко всем публикациям на этом сервере, в том числе к веб-клиенту. Если на сервере работают пользователи через браузер, делайте это вне рабочего времени.
Через webinst без конфигуратора
На Linux и на серверах без графического сеанса публикуют утилитой webinst из каталога bin платформы:
sudo /opt/1cv8/x86_64/8.3.25.1374/webinst -publish -apache24 \
-wsdir trade \
-dir /var/www/trade \
-connstr "Srvr=srv1c;Ref=trade;" \
-confpath /etc/apache2/apache2.conf
Подставьте свою версию платформы. Параметр -connstr для файловой базы выглядит как File=/srv/bases/trade;. После публикации перезапустите Apache: sudo systemctl restart apache2.
Откройте созданный default.vrd и проверьте, что внутри элемента point есть строка разрешения HTTP-сервисов. Если её нет, а сервисы отвечают 404, добавьте:
<httpServices publishByDefault="true"/>
Тот же файл правят и после публикации из конфигуратора, когда нужно включить или выключить отдельный сервис без повторной публикации.
Файловая база и права каталогов
Для файловой базы веб-сервер работает с файлом 1Cv8.1CD напрямую. Учётной записи, от которой запущен Apache (www-data на Linux) или пул IIS (IIS_IUSRS), нужны права на чтение и запись каталога базы и на чтение каталога bin платформы. Без них — ошибка 500 при первом же запросе.
5. Диагностика ошибок публикации и журналы
Начинайте с кода ответа: он сразу сужает круг поиска.
Где смотреть подробности:
- 📒 Журнал регистрации базы. Ошибки выполнения кода сервиса попадают туда с именем служебного пользователя. Отфильтруйте журнал по этому пользователю.
- 📄 Лог веб-сервера. У Apache —
error.log(на Linux обычно/var/log/apache2/error.log), у IIS — каталогinetpub\logs\LogFiles. Там видно, дошёл ли запрос до модуля 1С. - 🔍 Технологический журнал. Для разбора медленных или «пропадающих» запросов включите его через
logcfg.xmlс событиямиEXCP(исключения) иVRSREQUEST,VRSRESPONSE(входящие запросы и ответы). Технологический журнал быстро растёт, отключайте его после разбора. - ✍️ Своё логирование. В начале обработчика пишите в журнал входящий URL и ключевые параметры через
ЗаписьЖурналаРегистрации("API.Заказы", УровеньЖурналаРегистрации.Информация, , , Запрос.ОтносительныйURL). Через месяц, когда интегратор скажет «мы отправляли, а вы не приняли», будет чем ответить.
Для ручной проверки удобен curl:
curl -i -u api_shop:пароль "http://srv/trade/hs/api/v1/orders/123"
Ключ -i показывает заголовки ответа: сразу видно код, Content-Type и кодировку. Для SOAP-сервисов используйте SoapUI: он загружает WSDL и сам строит шаблон запроса.
6. Производительность веб-сервисов: сеансы, ответы, нагрузка
Каждый вызов сервиса по умолчанию открывает сеанс 1С, выполняет код и закрывает сеанс. Открытие сеанса с запуском обработчиков ПриНачалеРаботыСистемы в типовой конфигурации занимает заметное время, поэтому при частых вызовах это становится узким местом.
Что помогает:
- Повторное использование сеансов. В свойствах HTTP-сервиса есть параметр «Повторное использование сеансов» и «Время жизни сеанса». Значение «Использовать» оставляет сеанс открытым между вызовами, клиент получает cookie и следующий запрос идёт в тот же сеанс. Клиенту нужно уметь хранить cookie — проверьте это у интегратора.
- Лёгкий обработчик. Не вызывайте внутри сервиса проведение длинных документов синхронно. Принимайте данные, записывайте их в регистр сведений или очередь и отвечайте
202 Accepted. Обработку делайте регламентным заданием. - Запросы вместо объектов. Чтение через
Запросс выборкой нужных полей быстрее, чемСправочники.Номенклатура.НайтиПоКоду(...).ПолучитьОбъект()с загрузкой всех реквизитов и табличных частей. - Пагинация. Список из 50 000 позиций одним ответом повесит и 1С, и клиента. Добавьте в шаблон параметры
limitиoffset(читаются черезЗапрос.ПараметрыЗапроса) и отдавайте порциями по 500–1000 записей. - Клиент-серверный режим. Файловая база под постоянной нагрузкой от сервисов начинает ловить блокировки при одновременной работе пользователей. Если вызовов больше нескольких в минуту — переходите на сервер 1С.
Перед запуском в работу прогоните сервис нагрузкой хотя бы в 10–20 параллельных запросов (подойдёт Apache JMeter или простой цикл с curl). Проблемы с блокировками и сеансами проявляются только при параллельных вызовах.
7. Частые вопросы о публикации сервисов 1С
Можно ли опубликовать HTTP-сервис без изменения типовой конфигурации?
Чем отличается публикация HTTP-сервисов от стандартного интерфейса OData?
Нужно ли заново публиковать базу после изменения кода сервиса?
Как опубликовать несколько баз на одном веб-сервере?
/trade/, /buh/. У каждой будет свой каталог и свой default.vrd, модуль 1С загружается один раз.