Как 1С взаимодействует с веб-сервисами (сведения из теории)


О протоколе HTTP

Перед тем как начать разбирать примеры работы с HTTP-запросами и HTTP-сервисами в 1С, разберем, как вообще происходит обмен информацией по протоколу HTTP (HyperText Transfer Protocol — протокол передачи гипертекста).

Рисунок 7

Программа-клиент посылает на сервер HTTP-запрос (Request), веб-сервер принимает запрос, обрабатывает его и возвращает клиентской программе HTTP-ответ (Response). И запрос, и ответ представляют собой обычный текст, состоящий из нескольких частей.

Структуру HTTP-запроса можно представить в следующем виде:

Строка запроса
Заголовки запроса
Строка-разделитель
Тело запроса

Строка запроса – указывает метод передачи, URL-адрес, к которому нужно обратиться, и версию протокола HTTP.

Заголовки запроса – описывают тело сообщений, передают различные параметры и др. сведения и информацию.

Строка-разделитель – пустая строка, отделяющая тело запроса от заголовков запроса.

Тело запроса – это сами данные, которые передаются в запросе. Тело сообщения – это необязательный параметр и может отсутствовать.

Ниже приведен пример HTTP-запроса:

POST HTTP://localhost:8080/Demo/hs/Jivo HTTP/1.1
User-Agent: Fiddler
Host:localhost:8080
Content-Type: application/json
Content-Length: 982
{"event_name":"chat_finished","chat_id":6575,"widget_id":"LyMbVeK4rl","visitor":{"number":277209},"chat":{"messages":[{"timestamp":1474714193,"type":"visitor","message":"добрый день!в крым ялту доставка есть?"},{"timestamp":1474714219,"type":"visitor","message":"Горшок 300мл с крышкой красный \"Chan Wave\" red"},{"timestamp":1474714229,"type":"visitor","message":"сколько ждать заказа.?"}],"invitation":"Здравствуйте! Могу чем-то Вам помочь с выбором оборудования?"}}

Строка запроса:

  • POST – метод HTTP-запроса
  • HTTP://localhost:8080/Demo/hs/Jivo – URL, к которому мы обращаемся
  • HTTP/1.1 – версия протокола HTTP


Заголовки запроса:

  • User-Agent: Fiddler – указывает наименование клиента, который послал HTTP-запрос
  • Host:localhost:8080 – указывает имя хоста, к которому отправлен запрос
  • Content-Type: application/json – указывает тип содержимого тела запроса
  • Content-Length: 982 – указывает длину тела запроса в байтах

Подробнее о заголовках можно прочитать здесь: https://ru.wikipedia.org/wiki/Список_заголовков_HTTP

Тело запроса

В данном примере в теле запроса содержатся данные в формате JSON.

Подробнее о формате JSON можно почитать здесь: https://ru.wikipedia.org/wiki/JSON

Наиболее часто применяются два вида методов запроса:

GET – используется для запроса содержимого указанного ресурса. Когда мы вводим URL в адресную строку браузера – это практически всегда запрос с методом GET. Такой запрос не содержит тела.

POST – для отправки данных на сервер. Такой запрос чаще всего применяется, когда мы заполняем какую-либо форму на сайте или закачиваем на сайт фотографии или другие файлы.

Ответ от сервера можно представить в следующем виде:

Статус-строка
Заголовки ответа
Строка-разделитель
Тело ответа

Формат статус-строки: ВерсияHTTP СтатусКод ФразаОбъяснение

Наиболее интересен для нас Статус-код, так как он применяется для определения результата выполнения запроса. Элемент Статус-Код представляет собой 3-значное число.

Первая цифра Статус-Кода предназначена для определения класса ответа. Программа-клиент может не знать всех возможных Статус-кодов, но по стандарту должна уметь отреагировать на ответ в соответствии с классом Статус-кода. В настоящее время существует 5 классов ответов. Вот как они описаны в Википедии (https://ru.wikipedia.org/wiki/HTTP):

Код Класс Назначение
1хх Информационный Информирование о процессе передачи.
В HTTP/1.0 — сообщения с такими кодами должны игнорироваться.

В HTTP/1.1 — клиент должен быть готов принять этот класс сообщений как обычный ответ, но ничего отправлять серверу не нужно.

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

2хх Успех Информирование о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса сервер может ещё передать заголовки и тело сообщения.
3хх Перенаправление Сообщает клиенту, что для успешного выполнения операции необходимо сделать другой запрос (как правило по другому URI). Из данного класса пять кодов: 301, 302, 303, 305 и 307 – относятся непосредственно к перенаправлениям (редирект).

Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location. При этом допускается использование фрагментов в целевом URI.

4хх Ошибка клиента Указание ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.
5хх Ошибка сервера Информирование о случаях неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.

Про стандартные Статус-коды ответов можно прочитать здесь: https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP

Пример HTTP-ответа приведен ниже:

HTTP/1.1 200 OK
Date: Sun, 05 Mar 2017 16:48:57 GMT
Server: Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/5.6.30
Content-Type: application/JSON; charset=utf-8
Content-Length: 209
[{"Code":"000000001","Name":"Иванов","Phone":
"22-15-23","Email":"ivanov@mail.ru"},
{"Code":"000000002","Name":"Петров","Phone":"33-33-33","Email":"petrov@mail.ru"}]

Разберем этот ответ.

Статус-строка:

  • HTTP/1.1 – версия протокола
  • 200 – код ответа (Успех)
  • OK – фраза объяснения.

Заголовки ответа:

  • Date: Sun, 05 Mar 2017 16:48:57 GMT – дата ответа с сервера
  • Server: Apache/2.4.25 (Win32) OpenSSL/1.0.2j PHP/5.6.30 – информация о веб-сервере
  • Content-Type: application/JSON; charset=utf-8 – информация о типе данных, содержащихся в теле ответа
  • Content-Length: 209 – длина тела в байтах.

Подробнее о заголовках можно прочитать здесь: https://ru.wikipedia.org/wiki/Список_заголовков_HTTP.

Тело ответа

В теле ответа содержатся данные в формате JSON.

Реализация обмена по протоколу HTTP средствами 1С

Теперь, когда мы понимаем, как происходит общение клиента и сервера по протоколу HTTP, рассмотрим, какие средства языка предоставляет нам для этого платформа 1С.

Для отправки любого HTTP-запроса к серверу необходимы объекты HTTPЗапрос и HTTPСоединение. Рассмотрим их подробнее.

HTTPЗапрос

HTTPЗапрос облегчает работу по формированию текста запроса. Нам не нужно вручную составлять строку текста запроса, мы работаем с запросом в привычном объектном стиле.

Адрес и заголовки можно установить двумя способами:

  • Через конструктор HTTPЗапрос(АдресРесурса, Заголовки)
  • Через свойства АдресРесурса и Заголовки.

АдресРесурса – это строка, представляющая собой относительный путь к ресурсу.

Заголовки – это переменная с типом Соответствие.

Тело запроса может быть установлено с помощью методов:

  • УстановитьИмяФайлаТела(ПутьКФайлу) – позволяет загрузить тело запроса из файла
  • УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные) – устанавливает тело запроса из двоичных данных
  • УстановитьТелоИзСтроки(Строка) – устанавливает тело запроса из строки.

НTTPСоединение

HTTPсоединение обеспечивает обмен данными с веб-сервером по протоколу HTTP. Поддерживаются следующие протоколы: HTTP 1.0 и HTTP 1.1.

Для защиты соединения может быть использован протокол TLS 1.2 (передаваемые данные будут шифроваться). HTTPсоединение позволяет подключаться к веб-серверу, отправлять запросы на сервер и получать ответы.

При создании соединения нужно обязательно передать имя хоста сервера (без указания протокола) и при необходимости – Порт, Логин/Пароль пользователя, от которого производится соединение, адрес прокси, таймаут и защищенное соединение.

Для отправки запросов у объекта имеется ряд методов, каждый из которых соответствует определенному HTTP-методу. Например, метод Получить соответствует HTTP-методу GET, а ОтправитьДляОбработки соответствует HTTP-методу POST. При вызове этих методов в качестве одного из аргументов передается описанный ранее объект HTTP-запрос.

Теперь посмотрим, как это работает, на примере.

Пример 1: загрузка картинки с сайта (GET запрос)

Рассмотрим, как средствами 1С скачать картинку с сайта и записать ее на диск. Для этого создадим в базе обработку, добавим форму обработки. Добавим команду формы Загрузить и добавим ее в форму.

Итоговая форма имеет вид:

Рисунок 8

В обработчике команды Скачать напишем код:

&НаКлиенте Процедура Скачать(Команда) //1. создаем HTTP-соединение HTTP = Новый HTTPСоединение("Курсы-по-1С.рф",,,,,,,Ложь); //2. создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки ЗаголовокЗапросаHTTP = Новый Соответствие(); ЗаголовокЗапросаHTTP.Вставить("Accept", "image/png"); ЗаголовокЗапросаHTTP.Вставить("User-Agent", "1C+Enterprise/8.3"); //3. создаем HTTP-запрос HTTPЗапрос = Новый HTTPЗапрос( "/wp-content/uploads/2016/11/kursy-po-1c.ru-logo-300wide-58high-2016-11-02-v2.png", ЗаголовокЗапросаHTTP); //4. отправляем HTTP-запрос Ответ = HTTP.Получить(HTTPЗапрос, "С:\Demo\logo.png"); //5. обрабатывает ответ на запрос Если Ответ.КодСостояния = 200 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Картинка получена"; Сообщение.Сообщить(); Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Картинка не получена. Статус-код " + Ответ.КодСостояния; Сообщение.Сообщить(); КонецЕсли КонецПроцедуры

Прокомментируем фрагменты кода.

1. Создаем HTTP-соединение

2. Создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки

3. Создаем HTTP-запрос

4. Отправляем HTTP-запрос

5. Обрабатываем ответ на запрос

В принципе, по той же схеме можно послать любой запрос на сервер. При этом возможно отправлять или получать не только файлы картинок, но и просто данные в различных форматах (XML, JSON и т.д.).

Таким образом мы можем, например, передавать из 1С в интернет-магазин данные о товарах, остатках и ценах и забирать данные о заказах покупателей из интернет-магазина. Примером реализации такого обмена может служить обработка Обмен с WEB-сайтом из типовых конфигураций 1С.

Чуть позже будет продемонстрировано еще несколько запросов, а пока перейдем к рассмотрению еще одного механизма для интеграции – HTTP-сервисам.

HTTP-сервисы в 1С

HTTP-сервисы предназначены для тех случаев интеграции, когда обмен данными инициируется сторонним приложением.

Например, есть некий интернет-сервис, предположим – облачная CRM, мы регистрируем в ней потенциальных покупателей. На определенном этапе работы кто-то из лидов переходит в разряд клиентов, и мы хотим автоматически перенести информацию о клиенте в нашу базу 1С.

Мы разрабатываем и публикуем на веб-сервере HTTP-сервис, который принимает запрос от CRM и заносит в базу 1С полученные данные в соответствии с логикой конфигурации 1С. При этом разработчику CRM не нужно разбираться во внутренней кухне 1С. Он просто передает с помощью HTTP-запроса к определенному URL данные в оговоренном формате, а HTTP-сервис принимает их и обрабатывает в соответствии со своей логикой.

HTTP-сервисы появились в платформе начиная с версии 8.3.5.1068. По сравнению с уже давно реализованными в платформе веб-сервисами HTTP-сервисы имеют ряд преимуществ:

  • Простота разработки клиентов таких сервисов
  • Меньший объем передаваемых данных
  • Меньшая вычислительная нагрузка.

Обращения к таким сервисам представляют собой обычные HTTP-запросы, которые зачастую без труда можно ввести даже вручную в браузере, например так: HTTP://localhost/hs/Customer/GetCustomerList или: HTTP://localhost/hs/Customer/GetCustomer/0003.

Для обмена данными при работе с HTTP-сервисами чаще используется более компактный формат JSON вместо многословного XML.

Пример 2: простой HTTP-сервис

Теперь создадим несколько простых сервисов, чтобы показать, как это работает. Для начала реализуем очень простой сервис, который будет обрабатывать GET запросы и возвращать список всех клиентов в формате JSON. Создадим пустую базу и добавим в нее справочник «Контрагенты».

Поле Тип Длина
Наименование Строка 50
Телефон Строка 12
ЭлектроннаяПочта Строка 50
JivoID Число 10

Перейдем в ветку Общие и создадим HTTP-сервис Customers.

Рисунок 9

Здесь особо следует обратить внимание на значение свойства Корневой URL, так как это свойство отвечает за формирование URL-адреса, по которому мы будем обращаться ко всем методам этого сервиса.

Далее переходим на закладку Шаблоны URL и добавляем шаблон GetCustomersList.

Рисунок 10

Здесь обращаем внимание на шаблон /List. Шаблоны тоже отвечают за формирование URL, по которому мы будем обращаться к конкретному методу сервиса. Это очень простой шаблон, который не содержит никаких параметров.

И наконец создаем метод обработчика GetCustomersList, который будет обрабатывать GET-запросы.

Рисунок 11

В коде обработчика пишем следующий код:

Функция GetCustomersListGetCustomersList(Запрос) //1. формируем массив клиентов для отправки Клиенты = Справочники.Контрагенты.Выбрать(); МассивКлиентов = Новый Массив; Пока Клиенты.Следующий() Цикл ДанныеКлиента = Новый Структура; ДанныеКлиента.Вставить("Code", Клиенты.Код); ДанныеКлиента.Вставить("Name", Клиенты.Наименование); ДанныеКлиента.Вставить("Phone", Клиенты.Телефон); ДанныеКлиента.Вставить("Email", Клиенты.ЭлектроннаяПочта); МассивКлиентов.Добавить(ДанныеКлиента); КонецЦикла; //2. сериализуем массив клиентов в JSON ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, МассивКлиентов); СтрокаДляОтвета = ЗаписьJSON.Закрыть(); //3. формируем ответ Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить("Content-type", "application/JSON; charset=utf-8"); Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Возврат Ответ; КонецФункции

1. Формируем массив клиентов для отправки

2. Сериализуем массив клиентов в JSON

3. Формируем ответ

Теперь посмотрим, что получилось в результате. Опубликуем разработанный сервис на веб-сервере. Для этого откроем меню Администрирование  Публикация на веб-сервере.

Рисунок 12

Вводим имя Demo, выбираем веб-сервер Apache 2.4 (если у Вас установлен другой, то выбирайте Ваш), указываем каталог, куда будет размещаться сервис.

Убираем все галки на форме, так как мы не будем использовать веб-интерфейс и прочие возможности. Нас интересует только публикация разработанного нами HTTP-сервиса. Поэтому оставляем только галку на нашем HTTP-сервисе Customers.
Жмем Опубликовать. После публикации 1С скажет, что нужно перезапустить Apache – соглашаемся.

Теперь определимся, по какому URL нам обратиться, чтобы протестировать сервис. Строка URL HTTP-сервиса формируется как:

HTTP://<ИмяСервера>:<порт>/<ИмяПриПубликации>/hs/<КорневойURL>/<Шаблон>

Вспоминаем, что у нас было:

ИмяСервера = localhost
Порт = 8080
ИмяБазыПриПубликации = Demo
hs – означает, что обращаемся к HTTP-сервисам
КорневойURL = Demo
Шаблон = /List
В результате получаем: HTTP://localhost:8080/Demo/hs/Demo/List

Запускаем информационную базу в режиме «1С:Предприятие». Открываем справочник «Контрагенты» и добавляем нескольких клиентов.

Рисунок 13

Запускаем браузер и вводим в адресную строку полученный URL:

Рисунок 14

В результате видим данные в формате JSON, чего и добивались.

Пример 3: HTTP-сервис с параметрами

Теперь реализуем сервис, который обрабатывает GET-запрос c параметрами. В этом сервисе мы будем выводить данные по клиенту, код которого передан в качестве параметра в запросе.

Добавим в HTTP-сервис Customers новый шаблон URL GetCustomerInfo и укажем шаблон /GetCustomerInfo/{CustomerCode}.

{CustomerCode}
 – это параметр, в который будет передаваться код клиента. Строка URL для запроса данных по клиенту будет иметь примерно такой вид: HTTP://localhost:8080/Demo/hs/Demo/GetCustomerInfo/000000001

Рисунок 15

Добавим метод обработчика GetCustomerInfo:

Рисунок 16

В обработчике события напишем:

Функция GetCustomerInfoGetCustomerInfo(Запрос) //1.получим из запроса параметр CustomerCode и найдем по коду контрагента КодКлиента = Запрос.ПараметрыURL["CustomerCode"]; Клиент = Справочники.Контрагенты.НайтиПоКоду(КодКлиента); Если НЕ ЗначениеЗаполнено(Клиент) Тогда //2. если клиент не найден, то будем возвращать Статус-код 204 No content Ответ = Новый HTTPСервисОтвет(204); //No content Иначе //3. заполним структуру данных о клиенте ДанныеКлиента = Новый Структура; ДанныеКлиента.Вставить("Code", Клиент.Код); ДанныеКлиента.Вставить("Name", Клиент.Наименование); ДанныеКлиента.Вставить("Phone", Клиент.Телефон); ДанныеКлиента.Вставить("Email", Клиент.ЭлектроннаяПочта); //4. сериализуем данные о клиенте в JSON ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, ДанныеКлиента); СтрокаДляОтвета = ЗаписьJSON.Закрыть(); //5. сформируем ответ Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить("Content-type", "application/JSON; charset=utf-8"); Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); КонецЕсли; Возврат Ответ; КонецФункции

1. Получим из запроса параметр CustomerCode и найдем по коду контрагента

Фрагменты кода под комментариями 2, 3 и 4 в особых пояснениях не нуждаются.

5. Сформируем ответ

Проверим, что получилось, набрав в браузере URL http://localhost:8080/Demo/hs/Demo/GetCustomerInfo/000000001:

Рисунок 17
Пример 4: HTTP-сервис, обрабатывающий POST-запрос

Этот сервис будет получать данные по контрагенту из POST-запроса. Если клиент с таким кодом уже есть в базе, то обновим по нему данные, иначе добавим нового и заполним полученными данными.

Создадим новый шаблон URL для сервиса Customers. Назовем его PostCustomerInfo. Шаблон /PostCustomerInfo:

Рисунок 18

Создадим для него обработчик PostCustomerInfo с HTTP-методом POST. В обработчике напишем:

Функция PostCustomerInfoPostCustomerInfo(Запрос) //1.получаем тело запроса Сообщение = Запрос.ПолучитьТелоКакСтроку("UTF-8"); //2.десериализуем данные о клиенте из JSON ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Сообщение); ДанныеКлиента = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); //3.ищем клиента КодКлиента = ""; Если ДанныеКлиента.Свойство("Код", КодКлиента) Тогда Клиент = Справочники.Контрагенты.НайтиПоКоду(КодКлиента); Если НЕ ЗначениеЗаполнено(Клиент) Тогда Клиент = Справочники.Контрагенты.СоздатьЭлемент(); Иначе Клиент = Клиент.ПолучитьОбъект(); КонецЕсли; ЗаполнитьЗначенияСвойств(Клиент, ДанныеКлиента); Клиент.Записать(); Ответ = Новый HTTPСервисОтвет(200); Иначе //4.если нет свойства Код, то что-то не то передали Ответ = Новый HTTPСервисОтвет(402); Возврат Ответ; КонецЕсли; Возврат Ответ; КонецФункции

Главное отличие этого сервиса от тех, что мы писали ранее, в том, что он получает запрос, в котором имеется тело в формате JSON.

POST-запрос не получится отправить из браузера без ухищрений (установки плагинов или написания HTML формы), как GET, поэтому для отправки POST-запроса сделаем обработку на 1С. Создадим новую обработку, назовем ее ТестированиеPost. Добавим реквизиты:

Реквизит Тип Длина
Код Строка 9
Наименование Строка 50
Телефон Строка 12
ЭлектроннаяПочта Строка 50
JivoID Число 10

Создадим форму обработки, добавив на нее все эти поля. Добавим команду и кнопку Отправить запрос. В обработчике напишем:

Процедура ОтправитьЗапрос(Команда) // создаем новое HTTP соединение с указанием сервера // последний параметр отвечает за использование защищенного соединения HTTP = Новый HTTPСоединение("localhost",8080,,,,,,Ложь); //создадим структуру ДанныеОКлиенте = Новый Структура("Код,Наименование,Телефон,ЭлектроннаяПочта,JivoID", Объект.Код, Объект.Наименование, Объект.Телефон, Объект.ЭлектроннаяПочта, Объект.JivoID); //сериализуем в json ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, ДанныеОКлиенте); СтрокаДляТела = ЗаписьJSON.Закрыть(); //получим временный файл для передачи в теле POST-запроса ФайлТелаЗапроса = ПолучитьИмяВременногоФайла(); //запишем в файл содержимое тела запроса (текст) ТекстФайл = Новый ТекстовыйДокумент; ТекстФайл.УстановитьТекст(СтрокаДляТела); ТекстФайл.Записать(ФайлТелаЗапроса, КодировкаТекста.UTF8); //получим размер данных для передачи в заголовок ФайлНаОтправку = Новый Файл(ФайлТелаЗапроса); РазмерФайлаНаОтправку = XMLСтрока(ФайлНаОтправку.Размер()); //заголовок создадим в виде соответствия ЗаголовокЗапросаHTTP = Новый Соответствие(); //передаем в заголовках размер и тип данных на отправку ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаНаОтправку); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8"); //создадим заголовок запроса ЗапросHTTP = Новый HTTPЗапрос("Demo/hs/Demo/PostCustomerInfo", ЗаголовокЗапросаHTTP); //загрузить строку в тело ЗапросHTTP.УстановитьИмяФайлаТела(ФайлТелаЗапроса); //отсылаем POST-запрос на обработку. //ссылкаНаРесурс — ссылка на веб-сервер (страницу), к которой посылается POST //запрос ОтветHTTP = HTTP.ОтправитьДляОбработки(ЗапросHTTP); КонецПроцедуры

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

Рисунок 19

Нажмем кнопку Отправить запрос. Затем перейдем в справочник «Контрагенты» – контрагент добавился.

Рисунок 20

Заключение

В данной статье мы подготовили рабочее место для экспериментов по интеграции 1С с веб-приложениями, рассмотрели, что представляют из себя HTTP-запросы и HTTP-ответы. Познакомились с объектами встроенного языка 1С, которые реализуют возможности обмена по протоколу HTTP и разработали несколько примеров, демонстрирующих эти возможности.


Вы нашли эту статью полезной?