Компоненты разработаны по технологии создания внешних компонент COM. Тестировались на платформе 1С релиза 7.70.027 под управлением Windows 10.
Компонента HttpSrv7
Позволяет запускать HTTP или HTTPS сервер на любом порту.
Протокол HTTPS работает с библиотекой OpenSSL версии 1.0.2 и поддерживает TLS v1.2.
Каждый входящий HTTP-запрос обрабатывается в отдельном потоке. Все запросы регистрируются в общем массиве, размер которого можно устанавливать программно. Каждому запросу для обработки в 1С присваивается числовой идентификатор (ИД). По окончании обработки запрос удаляется из массива.
В зависимости от программных настроек сервера часть запросов может обрабатываться компонентой без участия 1С.
При регистрации запроса (обрабатываемого в 1С) в глобальном модуле 1С вызывается процедура «ОбработкаВнешнегоСобытия», в которую передается ИД нового запроса. Для обработки запросы можно выбирать по конкретному ИД или последовательно перебирая все.
Можно передавать обработку запросов другим экземплярам 1С, созданным как OLE-объекты. Для этого серверу передается имя файла, в который будет выгружен ответ, и время его ожидания. В OLE-экземпляр 1С передается также имя файла-результата и все необходимые параметры запроса. OLE- экземпляр формирует ответ и выгружает его в указанный файл. Как только файл ответа появляется, сервер передает его HTTP-клиенту и удаляет запрос из массива.
Методы объекта «AddIn.HTTPSrv7»:
Старт(<Порт>, <HTTPS> ) – запускает работу сервера
Стоп() – прекращает работу сервера.
Запрос (<ИД>) – устанавливает запрос с указанным ИД в качестве «текущего». Все команды работы с запросом, чтение и изменение его свойств, работа с ответом выполняются по отношению к «текущему» запросу.
ЗапросВФайл (<ИмяФайла>) – сохраняет содержание (тело) запроса в файл.
УстановитьЗаголовок (<ИмяЗаголовка>,<Содержание>) – устанавливает HTTP-заголовок ответа на текущий запрос.
ДобавитьКуки (<Имя>,<Значение>) – добавляет в ответ HTTP-заголовок «Set-Cookie» с содержанием Имя=Значение.
Передать (<Ответ>, <Код>) – передает ответ с установленными ранее заголовками.
ПередатьФайл (<ИмяФайла>, <Таймаут>) – передает в качестве тела ответа содержимое файла.
Utf8ToAnsi (<Стр>) – конвертирует строку из кодировки Utf8 в ANSI.
AnsiToUtf8 (<Стр>) – конвертирует строку из кодировки ANSI в Utf8.
Свойства объекта «AddIn.HTTPSrv7» (доступ: чтение+запись):
ДлинаОчереди – максимальное количество одновременно обрабатываемых запросов.
ФайлСерт – имя файла сертификата HTTPS-сервера.
ФайлКлюча – имя файла секретного ключа HTTPS-сервера
ФайлИндекс – имя файла, который будет передаваться компонентой (без обработки в 1С) в ответ на запрос без дополнительных атрибутов (URL = «\»).
КаталогОтправки – корневой каталог для передачи запрашиваемых файлов компонентой без обработки в 1С.
ФайлТипов – имя файла Mime – типов. Файл служит для автоматического формирования заголовков «Content-Type» при автоматической передаче файлов.
ЛогФайл – имя лог-файла..
ТелоОтвета – содержание ответа на текущий запрос
Свойства объекта «AddIn.HTTPSrv7» (доступ: чтение):
Активен – число, 1 – сервер активен (запущен), 0 – сервер не активен
HTTPS – протокол сервера: 1 - HTTPS, 0 – HTTP
Порт – порт сервера
ИД – ИД текущего запроса
HTTP – версия HTTP запроса
Метод – метод запроса (GET, POST и т.п.)
Хост – часть строки запроса формата «Адрес:Порт».
.URL – url запроса
Путь – левая часть url, путь к запрашиваемому ресурсу
Параметры – правая часть url, параметры и их значения
АдресКлиента – IP-адрес HTTP-клиента, от которого поступил запрос
ЗаголовкиЗапроса – названия и содержания всех заголовков запроса
КукиЗапроса – имена и значения всех Cookie запроса
ПоляФормыЗапроса – имена и значения данных формы клиента, переданных в теле запроса
ЗагруженныеФайлы –информация о файлах (файле), прикрепленных к полям (полю) формы клиента
ДлинаЗапроса – размер тела текущего запроса в байтах
ТелоЗапроса – тело текущего запроса
Ошибка – последняя ошибка
Компонента HTTP_Async
Позволяет асинхронно работать с веб-сервисами по протоколу HTTP или HTTPS и использовать любые методы передачи: GET, POST, PUT, DELETE, OPTIONS.
Протокол HTTPS работает с библиотекой OpenSSL версии 1.0.2 и поддерживает TLS v1.2.
Поддерживается автоматическая распаковка данных сжатых в формате «gzip».
Имеется функция перевода строк JSON во вложенные объекты 1С 7.7 типа «СписокЗначений».
Все переданные запросы получают уникальные идентификаторы и сохраняются в массиве. В любой момент времени можно проконтролировать состояние любого запроса, время его работы, получить в случае готовности его результаты, а также завершить его работу, после чего запрос из массива удаляется.
Методы объекта «AddIn. HTTP_Async»:
Новый (<URL>, <Метод>, <ФайлПриемник>) – новый запрос.
УстановитьЗаголовокЗапроса (<ИмяЗаголовка>,<Содержание>) – устанавливает HTTP-заголовок нового запроса.
Обработать (<Строка>) – отправка нового запроса и помещение его в массив, тело запроса -строка. Возвращает ИД запроса.
ОбработатьФайл (<ИмяФайла>) – отправка нового запроса и помещение его в массив, тело запроса –содержимое файла. Возвращает ИД запроса.
Запрос (<ИД>) – ищет в массиве и устанавливает в качестве текущего запрос с указанным ИД, если нет то ищет следующий по величине ИД, если нет то возвращает 0.
КоличествоЗаголовковОтвета () – количество заголовков в ответе сервера.
ПолучитьЗаголовокОтвета(<НомерЗаголовка>) – получает один из заголовков ответа.
ОтветВФайл (<ИмяФайла>) – сохраняет «тело» ответа в указанный фай.
Завершить (<ИД1>,<ИД2> ) – завершает работу и удаляет из массива запросы с величиной ИД от ИД1 до ИД2. Если ИД2 не указан, то завершает только ИД1. Если не указаны оба значения то завершает все запросы. Возвращает количество завершенных запросов.
СтартЛог (<ИмяФайла >) – старт вывода сообщений в лог-файл.
СтопЛог () – прекращение вывода сообщений в лог-файл.
Utf8ToAnsi (<Стр>) – конвертирует строку из кодировки Utf8 в ANSI.
AnsiToUtf8 (<Стр>) – конвертирует строку из кодировки ANSI в Utf8.
FromJson (<Стр>) – «парсит» строку JSON, преобразуя структуру объектов и массивов JSON в структуру из вложенных «СписковЗначений» - объектов 1С 7.7. Конечные значения 2-х типов: строка и число.
Свойства объекта «AddIn. HTTP_Async» (свойства клиента):
ПоследняяОшибка – строка, текст ошибки после выполнения синхронных методов.
КоличествоЗапросов– число запросов в массиве.
Свойства объекта «AddIn. HTTP_Async» ( текущего запроса):
ИД – ИД запроса. Если 0, то текущий запрос не выбран.
ФайлПриемник – имя файла, указанное ранее в методе Новый().
Состояние– число: 1 – отправка запроса, 2- получение ответа, 3- разархивирование, 4-ответ получен, -1 - ошибка.
Принято – общее количество принятых байт, можно отслеживать и в процессе получения ответа.
ВремяМСек – количество миллисекунд с начала передачи запроса.
СтрокаСостоянияОтвета– код и текст ответа сервера по HTTP-протоколу.
ДлинаОтвета– размер «тела» ответа в байтах.
Ответ– строка, «тело» ответа.
Ошибка – строка, текст ошибки в случае состояния запроса -1.
Бесплатные демо-версии
Демо-конфигурация с демо-обработками и демо-компонентами доступны для бесплатного скачивания в разделе «Бесплатные файлы». Ограничения работы демо-компонент: только в пределах хоста «localhost».
Вид демо-обработки после запуска HTTP-сервера кнопкой «Старт» - «HTTP порт 3000»:

Пример обработки запроса компонентой (без обработки в 1С):
Набираем в браузере http://localhost:3000/, компонента передает в браузер файл demo.html

Пример обработки запроса в 1С:
Кликаем в браузере по кнопке «Подтверждение», обработка формирует ответ из элементов запроса и передает его в браузер:

Пример обработки запроса в OLE- экземпляре 1С:
Подключаем OLE-экземпляр текущей конфигурации. Нажимаем кнопку «Подключить» - «Демо»

Нажимаем в браузере «Обновить»

Пример «ручной» обработки запроса в 1С:
Нажимаем кнопку «Отключить» - отключаем OLE-экземпляр 1С.
Устанавливаем в обработке флажок «Ручная обработка запросов».
Нажимаем в браузере «Обновить».
В обработке кликаем по ИД запроса, появившегося в списке «Запросы в очереди».
В окне «Ввод значения» набираем «Привет!»:

Нажимаем «ОК».
Видим в браузере результат:

Демо-обработка HTTP_Async
Проверим работу асинхронного клиента, а заодно и производительность HTTP-сервера 1С. Для этого отправим сразу 50 запросов и проверим время получения ответов.
Запускаем 2 демо-конфигурации. В одной запускаем обработку-сервер в другой – обработку-клиент:

В клиенте нажимаем кнопку «Старт запросов», дожидаемся окончания обработки запросов. Результат в таблице клиента:

Итоги:
1) 50 запросов отправлено в течении 24 миллисекунд;
2) Все запросы обработаны в течении менее 5 секунд;
3) 3 запроса завершены с ошибкой;
4) 47 запросов завершены успешно, время выполнения каждого запроса от 0.466 до 4.108 сек.
История изменения версий
HttpSrv7
Версия 0.1.0.0
- Отменена блокировка файла при передаче его клиенту. Возможна передача файла параллельно нескольким клиентам.
- Устранен сбой сервера при получении запроса с неправильным заголовком "Content-length".
Версия 0.2.0.0
- Добавлен метод "ДобавитьКуки" и свойство "КукиЗапроса".
Версия 0.2.1.0
- Добавлено свойство "ПоляФормыЗапроса".
Версия 0.2.2.0
- Добавлено свойство "ЗагруженныеФайлы".