пятница, 8 сентября 2017 г.

Как настроить обмен 1С с интернет-сервисами


[ Интеграция ] Как настроить обмен 1С с интернет-сервисами   Источник: ©Курсы-по-1С.рф

Бизнесы все активнее используют интернет-сервисы: интернет-магазины, торговые площадки, облачные CRM, социальные сети, системы рассылок…
Естественно, возникает задача интеграции с корпоративной системой — это сокращает рутинные работы и повышает скорость принятия решений.
Условно — чтобы у директора и у менеджеров на одном экране были все необходимые данные: заказы через интернет, цифры по конверсии, данные по оффлайн продажам. списки клиентов и действий и т.д.
И для нас интересны случаи интеграции именно с конфигурациями на платформе «1С:Предприятие 8».

Что мы разберем в статье

Мы рассмотрим 2 основных инструмента интеграции 1С — HTTP-запросы и HTTP-сервисы.
Штатные средства платформы «1С:Предприятие 8», ничего лишнего.
На конкретных примерах разберем:
  • Отправку данных
  • Получение данных
  • Ответы на запросы от внешних сервисов.
Поехали!

Требования к рабочему окружению

Для работы нам потребуется:
  • Веб-сервер (Apache или IIS)
  • Платформа 1С (8.3.8 или старше) с установленным расширением веб-сервера.
Если на Вашем компьютере уже установлено все необходимое, то Вы можете пропустить следующие два раздела.

Установка веб-сервера Apache

Скачать дистрибутив Apache можно с официального сайта: http://httpd.apache.org/download.cgi
Нам нужен уже собранный дистрибутив для Windows. Сам Apache.org не собирает дистрибутивы, а предоставляет только исходники. Однако на официальном сайте даются ссылки на сайты партнеров, которые собирают Apache из исходников. Брать дистрибутивы рекомендуется именно с сайтов этих партнеров. Мы будем устанавливать XAMPP (https://www.apachefriends.org), т.к его установка проще всего.
Порядок действий следующий:
  • Скачиваем файл xampp-win32-5.6.30-0-VC11-installer.exe и запускаем установку от имени администратора
  • Пробегаем в мастере установки все окна по умолчанию. Единственное окно, в котором имеет смысл что-то поменять – окно выбора устанавливаемых компонентов сборки. Оставим минимальный набор, как показано ниже.

Рисунок 1
После завершения установки запустится приложение XAMPP-Control:

Рисунок 2
Если у Вас ранее не были установлены какие-либо веб-серверы, занявшие 80-й порт, то окно приложения будет выглядеть, как на картинке выше, только порт будет указан 80. У меня порт оказался занят, и в окне появилось сообщение об этом:

Рисунок 3
Если Вы столкнетесь с этой проблемой, то поменяйте порт в файле конфигурации HTTPd.conf. Для этого нажмите кнопку ConfigApache(HTTPd.conf). В открывшемся файле нужно изменить два параметра конфигурации, как показано ниже:
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080 #было Listen 80

<…….>
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn’t have a registered DNS name, enter its IP address here.
#
ServerName localhost:8080 #было ServerName localhost:80
После этого запустите Apache. Ошибка должна уйти, а веб-сервер запуститься.
Обратите внимание:
Чтобы иметь возможность публиковать конфигурацию на веб-сервере прямо из 1С, необходимо установить Apache как службу Windows. Без этого Apache будет недоступен для выбора в окне Публикация на веб-сервере.
Следующим шагом установим Apache как службу Windows и запустим его. Для этого необходимо выполнить следующие действия:
  • Остановить Apache кнопкой Stop в форме приложения XAMPP-Control.
  • Запустить на выполнение командный файл C:\xampp\apache\apache_installservice.bat от имени администратора.
Однако в файле есть небольшая ошибка, которую нужно предварительно исправить. Откройте Проводник, перейдите в папку C:\xampp\apache\, найдите файл apache_installservice.bat, кликните по нему правой кнопкой мыши и в контекстном меню выберите Изменить. Укажите полный путь к файлу HTTPd.exe (строчка с изменением выделена красным):
@echo off
if «%OS%» == «Windows_NT» goto WinNT
:Win9X
echo Don’t be stupid! Win9x don’t know Services
echo Please use apache_start.bat instead
goto exit

:WinNT
echo Installing Apache2.4 as an Service
C:\xampp\apache\bin\HTTPd -k install
echo Now we Start Apache2.4 :)
net start Apache2.4

:exit
pause
По сути, файл содержит всего две команды:
  • C:\xampp\apache\bin\HTTPd -k install (установка Apache в качестве службы Windows)
  • net start Apache2.4 (запуск службы Apache)
Сохраните файл. Вернитесь в проводник, кликните левой кнопкой мыши на файле apache_installservice.bat и в контекстном меню выберите Запуск от имени Администратора.
В результате Вы должны увидеть такое окно:

Рисунок 4

Установка Платформы

На момент написания статьи последняя версия платформы 8.3.9.2170. Ее и будем устанавливать. При установке платформы нужно обязательно указать компоненту Модули расширения Веб-сервера. Больше никаких особенностей нет.

Рисунок 5
Теперь создадим новую пустую базу (файловый вариант). В свойствах конфигурации укажем Режим использования модальности = Использовать, чтобы излишне не усложнять примеры асинхронными вызовами. Обновим конфигурацию базы данных (F7).
Рисунок 6

Немного теории о протоколе 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.Вставить("Host", "Курсы-по-1С.рф"); ЗаголовокЗапроса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-соединение

В первой строке создается HTTPСоединение.
Первый параметр – имя сайта, например «Курсы-по-1С.рф», а последний параметр указывает, что не нужно использовать аутентификацию ОС.
Остальные параметры (Порт, ИмяПользователя, Пароль, АдресПрокси) в данном примере пропускаем, так как порт будет стандартный — 80, авторизация не требуется, и прокси у нас нет.

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

В этой части кода мы создаем соответствие ЗаголовокЗапросаHTTP, в которое добавляем заголовки запроса.
  • Ноst — указывает имя сервера, к которому мы обращаемся: Курсы-по-1С.рф
  • Accept — сообщает серверу, какие данные мы ожидаем получить: image/png, т.е. картинку в формате PNG
  • User-Agent — указывает имя программы-клиента 1C+Enterprise/8.3.
В большинстве случаев заголовки задавать не требуется, так как 1С необходимые заголовки создаст сама, а серверные приложения чаще всего пытаются определить нужные заголовки по содержимому запроса. Однако иногда заголовки все-таки необходимо указать, чтобы получить от сервера нужный нам результат.
Например, сервер может вернуть информацию на русском языке или на английском. В этом случае можно использовать заголовок запроса Accept-Language, чтобы указать нужный нам язык.

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

Создаем HTTPЗапрос, где первым параметром передаем относительный адрес картинки, а вторым – соответствие ЗаголовокЗапросаHTTP, которое было создано и заполнено ранее.

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

Передаем запрос на сервер с помощью метода Получить, который реализует HTTP-метод GET. Первым параметром передаем HTTPЗапрос, а вторым — полное имя файла, в который нужно сохранить картинку.

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

После отправки запроса и получения ответа мы проверяем КодСостояния (Статус-код).
Если КодСостояния = 200 (класс Успех), то сохраняем картинку в указанный файл и сообщаем пользователю, что картинка получена. В противном случае сообщаем, что картинка не получена, и выводим на экран КодСостояния.
В принципе, по той же схеме можно послать любой запрос на сервер. При этом возможно отправлять или получать не только файлы картинок, но и просто данные в различных форматах (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

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

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

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

Рисунок 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 и найдем по коду контрагента

Входящий параметр функции Запрос является объектом с типом HTTPСервисЗапрос. У этого объекта есть свойство ПараметрыURL с типом Соответствие. Получим из ПараметрыURL значение ключа CustomerCode, который является кодом контрагента.
Фрагменты кода под комментариями 2, 3 и 4 в особых пояснениях не нуждаются.

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

В этом фрагменте кода создается объект с типом HTTPСервисОтвет. Мы задаем Статус-код ответа 200 (Успех), добавляем заголовок ответа Content-Type, который указывает, что возвращается строка в формате JSON, и в тело ответа загружаем сериализованные на шаге 4 данные о контрагенте.
Проверим, что получилось, набрав в браузере 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 и разработали несколько примеров, демонстрирующих эти возможности.


1 комментарий: