[ Интеграция ] Как настроить обмен 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 и запускаем установку от имени администратора
- Пробегаем в мастере установки все окна по умолчанию. Единственное окно, в котором имеет смысл что-то поменять – окно выбора устанавливаемых компонентов сборки. Оставим минимальный набор, как показано ниже.
Если у Вас ранее не были установлены какие-либо веб-серверы, занявшие 80-й порт, то окно приложения будет выглядеть, как на картинке выше, только порт будет указан 80. У меня порт оказался занят, и в окне появилось сообщение об этом:
Если Вы столкнетесь с этой проблемой, то поменяйте порт в файле конфигурации HTTPd.conf. Для этого нажмите кнопку Config – Apache(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
# 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
Обратите внимание:
Чтобы иметь возможность публиковать конфигурацию на веб-сервере прямо из 1С, необходимо установить Apache как службу Windows. Без этого Apache будет недоступен для выбора в окне Публикация на веб-сервере.
Следующим шагом установим Apache как службу Windows и запустим его. Для этого необходимо выполнить следующие действия:Чтобы иметь возможность публиковать конфигурацию на веб-сервере прямо из 1С, необходимо установить Apache как службу Windows. Без этого Apache будет недоступен для выбора в окне Публикация на веб-сервере.
- Остановить Apache кнопкой Stop в форме приложения XAMPP-Control.
- Запустить на выполнение командный файл C:\xampp\apache\apache_installservice.bat от имени администратора.
@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
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)
В результате Вы должны увидеть такое окно:
Установка Платформы
На момент написания статьи последняя версия платформы 8.3.9.2170. Ее и будем устанавливать. При установке платформы нужно обязательно указать компоненту Модули расширения Веб-сервера. Больше никаких особенностей нет.Теперь создадим новую пустую базу (файловый вариант). В свойствах конфигурации укажем Режим использования модальности = Использовать, чтобы излишне не усложнять примеры асинхронными вызовами. Обновим конфигурацию базы данных (F7).
Рисунок 6
Немного теории о протоколе HTTP
Перед тем как начать разбирать примеры работы с HTTP-запросами и HTTP-сервисами в 1С, разберем, как вообще происходит обмен информацией по протоколу HTTP (HyperText Transfer Protocol — протокол передачи гипертекста).Программа-клиент посылает на сервер HTTP-запрос (Request), веб-сервер принимает запрос, обрабатывает его и возвращает клиентской программе HTTP-ответ (Response). И запрос, и ответ представляют собой обычный текст, состоящий из нескольких частей.
Структуру 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 – указывает длину тела запроса в байтах
Тело запроса
В данном примере в теле запроса содержатся данные в формате JSON.
Подробнее о формате JSON можно почитать здесь: https://ru.wikipedia.org/wiki/JSON
Наиболее часто применяются два вида методов запроса:В данном примере в теле запроса содержатся данные в формате JSON.
Подробнее о формате JSON можно почитать здесь: https://ru.wikipedia.org/wiki/JSON
GET – используется для запроса содержимого указанного ресурса. Когда мы вводим URL в адресную строку браузера – это практически всегда запрос с методом GET. Такой запрос не содержит тела.
POST – для отправки данных на сервер. Такой запрос чаще всего применяется, когда мы заполняем какую-либо форму на сайте или закачиваем на сайт фотографии или другие файлы.
Ответ от сервера можно представить в следующем виде:
Статус-строка |
Заголовки ответа |
Строка-разделитель |
Тело ответа |
Наиболее интересен для нас Статус-код, так как он применяется для определения результата выполнения запроса. Элемент Статус-Код представляет собой 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, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю. |
Пример 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 – длина тела в байтах.
Тело ответа
В теле ответа содержатся данные в формате JSON.
В теле ответа содержатся данные в формате 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С скачать картинку с сайта и записать ее на диск. Для этого создадим в базе обработку, добавим форму обработки. Добавим команду формы Загрузить и добавим ее в форму.Итоговая форма имеет вид:
В обработчике команды Скачать напишем код:
&НаКлиенте Процедура Скачать(Команда) //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, авторизация не требуется, и прокси у нас нет.
Первый параметр – имя сайта, например «Курсы-по-1С.рф», а последний параметр указывает, что не нужно использовать аутентификацию ОС.
Остальные параметры (Порт, ИмяПользователя, Пароль, АдресПрокси) в данном примере пропускаем, так как порт будет стандартный — 80, авторизация не требуется, и прокси у нас нет.
2. Создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки
В этой части кода мы создаем соответствие ЗаголовокЗапросаHTTP, в которое добавляем заголовки запроса.
Например, сервер может вернуть информацию на русском языке или на английском. В этом случае можно использовать заголовок запроса Accept-Language, чтобы указать нужный нам язык.
- Ноst — указывает имя сервера, к которому мы обращаемся: Курсы-по-1С.рф
- Accept — сообщает серверу, какие данные мы ожидаем получить: image/png, т.е. картинку в формате PNG
- User-Agent — указывает имя программы-клиента 1C+Enterprise/8.3.
Например, сервер может вернуть информацию на русском языке или на английском. В этом случае можно использовать заголовок запроса Accept-Language, чтобы указать нужный нам язык.
3. Создаем HTTP-запрос
Создаем HTTPЗапрос, где первым параметром передаем относительный адрес картинки, а вторым – соответствие ЗаголовокЗапросаHTTP, которое было создано и заполнено ранее.
4. Отправляем HTTP-запрос
Передаем запрос на сервер с помощью метода Получить, который реализует HTTP-метод GET. Первым параметром передаем HTTPЗапрос, а вторым — полное имя файла, в который нужно сохранить картинку.
5. Обрабатываем ответ на запрос
После отправки запроса и получения ответа мы проверяем КодСостояния (Статус-код).
Если КодСостояния = 200 (класс Успех), то сохраняем картинку в указанный файл и сообщаем пользователю, что картинка получена. В противном случае сообщаем, что картинка не получена, и выводим на экран КодСостояния.
Если КодСостояния = 200 (класс Успех), то сохраняем картинку в указанный файл и сообщаем пользователю, что картинка получена. В противном случае сообщаем, что картинка не получена, и выводим на экран КодСостояния.
Таким образом мы можем, например, передавать из 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-сервисами чаще используется более компактный формат JSON вместо многословного XML.
Пример 2: простой HTTP-сервис
Теперь создадим несколько простых сервисов, чтобы показать, как это работает. Для начала реализуем очень простой сервис, который будет обрабатывать GET запросы и возвращать список всех клиентов в формате JSON. Создадим пустую базу и добавим в нее справочник «Контрагенты».Поле | Тип | Длина |
Наименование | Строка | 50 |
Телефон | Строка | 12 |
ЭлектроннаяПочта | Строка | 50 |
JivoID | Число | 10 |
Рисунок 9
Здесь особо следует обратить внимание на значение свойства Корневой URL, так как это свойство отвечает за формирование URL-адреса, по которому мы будем обращаться ко всем методам этого сервиса.Далее переходим на закладку Шаблоны URL и добавляем шаблон GetCustomersList.
И наконец создаем метод обработчика GetCustomersList, который будет обрабатывать GET-запросы.
Функция 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.
Под сериализацией в программировании понимается перевод структуры данных в последовательность битов, пригодных для сохранения на диске или передачи по сети. В нашем случае результатом сериализации является строка в формате JSON.
3. Формируем ответ
Далее мы формируем ответ HTTP-сервиса на запрос. В заголовке ответа указываем, что это данные в формате JSON в кодировке UTF-8.
Вводим имя 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С:Предприятие». Открываем справочник «Контрагенты» и добавляем нескольких клиентов.
Запускаем браузер и вводим в адресную строку полученный URL:
В результате видим данные в формате 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 данные о контрагенте.
Пример 4: HTTP-сервис, обрабатывающий POST-запрос
Этот сервис будет получать данные по контрагенту из POST-запроса. Если клиент с таким кодом уже есть в базе, то обновим по нему данные, иначе добавим нового и заполним полученными данными.Создадим новый шаблон URL для сервиса Customers. Назовем его PostCustomerInfo. Шаблон /PostCustomerInfo:
Создадим для него обработчик PostCustomerInfo с HTTP-методом POST. В обработчике напишем:
Функция PostCustomerInfoPostCustomerInfo(Запрос) //1.получаем тело запроса Сообщение = Запрос.ПолучитьТелоКакСтроку("UTF-8"); //2.десериализуем данные о клиенте из JSON ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Сообщение); ДанныеКлиента = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); //3.ищем клиента КодКлиента = ""; Если ДанныеКлиента.Свойство("Код", КодКлиента) Тогда Клиент = Справочники.Контрагенты.НайтиПоКоду(КодКлиента); Если НЕ ЗначениеЗаполнено(Клиент) Тогда Клиент = Справочники.Контрагенты.СоздатьЭлемент(); Иначе Клиент = Клиент.ПолучитьОбъект(); КонецЕсли; ЗаполнитьЗначенияСвойств(Клиент, ДанныеКлиента); Клиент.Записать(); Ответ = Новый HTTPСервисОтвет(200); Иначе //4.если нет свойства Код, то что-то не то передали Ответ = Новый HTTPСервисОтвет(402); Возврат Ответ; КонецЕсли; Возврат Ответ; КонецФункции
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); КонецПроцедуры
Нажмем кнопку Отправить запрос. Затем перейдем в справочник «Контрагенты» – контрагент добавился.
Этот комментарий был удален администратором блога.
ОтветитьУдалить