Бизнесы все активнее используют интернет-сервисы: интернет-магазины, торговые площадки, облачные 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 и запускаем установку от имени администратора
- Пробегаем в мастере установки все окна по умолчанию. Единственное окно, в котором имеет смысл что-то поменять – окно выбора устанавливаемых компонентов сборки. Оставим минимальный набор, как показано ниже.
После завершения установки запустится приложение XAMPP-Control:
Если у Вас ранее не были установлены какие-либо веб-серверы, занявшие 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
После этого запустите 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 и в контекстном меню выберите Запуск от имени Администратора.
В результате Вы должны увидеть такое окно:
Установка Платформы
На момент написания статьи последняя версия платформы 8.3.9.2170. Ее и будем устанавливать. При установке платформы нужно обязательно указать компоненту Модули расширения Веб-сервера. Больше никаких особенностей нет.
Теперь создадим новую пустую базу (файловый вариант). В свойствах конфигурации укажем Режим использования модальности = Использовать, чтобы излишне не усложнять примеры асинхронными вызовами. Обновим конфигурацию базы данных (F7).
Немного теории о протоколе HTTP
Перед тем как начать разбирать примеры работы с HTTP-запросами и HTTP-сервисами в 1С, разберем, как вообще происходит обмен информацией по протоколу HTTP (HyperText Transfer Protocol — протокол передачи гипертекста).
Программа-клиент посылает на сервер 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С скачать картинку с сайта и записать ее на диск. Для этого создадим в базе обработку, добавим форму обработки. Добавим команду формы Загрузить и добавим ее в форму.
Итоговая форма имеет вид:
В обработчике команды Скачать напишем код:
&НаКлиенте Процедура Скачать(Команда) //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-соединение
В первой строке создается HTTPСоединение.
Первый параметр – имя сайта, например “Курсы-по-1С.рф”, а последний параметр указывает, что не нужно использовать аутентификацию ОС.
Остальные параметры (Порт, ИмяПользователя, Пароль, АдресПрокси) в данном примере пропускаем, так как порт будет стандартный – 80, авторизация не требуется, и прокси у нас нет.
2. Создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки
В этой части кода мы создаем соответствие ЗаголовокЗапросаHTTP, в которое добавляем заголовки запроса.
- 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.
Теперь создадим несколько простых сервисов, чтобы показать, как это работает. Для начала реализуем очень простой сервис, который будет обрабатывать GET запросы и возвращать список всех клиентов в формате JSON. Создадим пустую базу и добавим в нее справочник «Контрагенты».
Поле | Тип | Длина |
Наименование | Строка | 50 |
Телефон | Строка | 12 |
ЭлектроннаяПочта | Строка | 50 |
JivoID | Число | 10 |
Перейдем в ветку Общие и создадим HTTP-сервис Customers.
Здесь особо следует обратить внимание на значение свойства Корневой URL, так как это свойство отвечает за формирование URL-адреса, по которому мы будем обращаться ко всем методам этого сервиса.
Далее переходим на закладку Шаблоны URL и добавляем шаблон GetCustomersList.
Здесь обращаем внимание на шаблон /List. Шаблоны тоже отвечают за формирование URL, по которому мы будем обращаться к конкретному методу сервиса. Это очень простой шаблон, который не содержит никаких параметров.
И наконец создаем метод обработчика 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.
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, чего и добивались.
Теперь реализуем сервис, который обрабатывает GET-запрос c параметрами. В этом сервисе мы будем выводить данные по клиенту, код которого передан в качестве параметра в запросе.
Добавим в HTTP-сервис Customers новый шаблон URL GetCustomerInfo и укажем шаблон /GetCustomerInfo/{CustomerCode}.
{CustomerCode} – это параметр, в который будет передаваться код клиента. Строка URL для запроса данных по клиенту будет иметь примерно такой вид: HTTP://localhost:8080/Demo/hs/Demo/GetCustomerInfo/000000001
Добавим метод обработчика GetCustomerInfo:
В обработчике события напишем:
Функция 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, который является кодом контрагента.
5. Сформируем ответ
В этом фрагменте кода создается объект с типом HTTPСервисОтвет. Мы задаем Статус-код ответа 200 (Успех), добавляем заголовок ответа Content-Type, который указывает, что возвращается строка в формате JSON, и в тело ответа загружаем сериализованные на шаге 4 данные о контрагенте.
Проверим, что получилось, набрав в браузере URL http://localhost:8080/Demo/hs/Demo/GetCustomerInfo/000000001:
Этот сервис будет получать данные по контрагенту из 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); Возврат Ответ; КонецЕсли; Возврат Ответ; КонецФункции
Главное отличие этого сервиса от тех, что мы писали ранее, в том, что он получает запрос, в котором имеется тело в формате 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. Теперь зайдем в пользовательском режиме и запустим обработку.
Нажмем кнопку Отправить запрос. Затем перейдем в справочник «Контрагенты» – контрагент добавился.
Заключение
В данной статье мы подготовили рабочее место для экспериментов по интеграции 1С с веб-приложениями, рассмотрели, что представляют из себя HTTP-запросы и HTTP-ответы. Познакомились с объектами встроенного языка 1С, которые реализуют возможности обмена по протоколу HTTP и разработали несколько примеров, демонстрирующих эти возможности.
Об авторе
Автор статьи – Алексей Дубровин, г. Челябинск
E-mail: dubrovin1973@gmail.com
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)
Здравствуйте.
Какие есть курсы по Интеграции?
Здравствуйте, Елена!
На данный момент нет актуального курса по интеграции.
Когда появится информация о выходе курса по этой теме, мы будем сообщать об этом – следите за новостями на сайте и нашими информационными рассылками.
Здравствуйте.
Не подскажите такой вопрос:
Я из 1С обращаюсь к внешнему (для 1С) HTTP серверу, он отдает мне информацию. Как отдать этому HTTP серверу ответ что я информацию принял в той же сессии?
Вот мой код:
АдресСайта = “ХХХ.ХХХ.ХХ.ХХХ/api/complaints/”;
Соединение = Новый HTTPСоединение(АдресСайта,,,,,20, Новый ЗащищенноеСоединениеOpenSSL);
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.Заголовки.Вставить(“Content-type”, “application/json”);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, ” “, Истина);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства(“token”);
ЗаписьJSON.ЗаписатьЗначение(“ХХХХХХХХХХХХХХХХ_ХХХХХХХХ-ХХХХХХХХХ”);
ЗаписьJSON.ЗаписатьКонецОбъекта();
strJSON = ЗаписьJSON.Закрыть();
HTTPЗапрос.УстановитьТелоИзСтроки(strJSON,”UTF8″,ИспользованиеByteOrderMark.Авто);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
ЧтениJSON = Новый ЧтениеJSON;
Резик=Результат.ПолучитьТелоКакСтроку();
ЧтениJSON.УстановитьСтроку(Резик);
Рез=ПрочитатьJSON(ЧтениJSON);
Для каждого эля Из Рез Цикл
Если эля.Ключ=”ХХХ” и ЗначениеЗаполнено(эля.Значение) Тогда
//тут обрабатываем ответ HTTP сервера
КонецЕсли;
КонецЦикла;
//тут хотелось бы ответить HTTP серверу что мы все приняли.
//разработчик сайта по поводу ответа сообщил следующее “можно в той-же сессии отправлять md5 хэш сообщения” – но как это сделать из 1С?
Получить md5 хэш сообщения можно так
Хеш.Добавить(Сообщение)
ХешСумма = Хеш.ХешСумма;
И потом ХешСумма (тип ДвоичныеДанные) надо отправить в http-запросе.
Разработчика опять же надо спросить нужны ли какие-то заголовки в запросе, надо ли “заворачивать” ответ в какой-нибудь xml и т.д.
И он говорит “в той же сессии”, скорее всего идентификатор сессии нужно будет вытаскивать из заголовка ответа set-coockie и передавать в запросе с хэшем в заголовке cookie.
Вам нужно прям подробно пообщаться с разработчиком “на той стороне” и обговорить API по которому Ваше приложение общается с его.
Здравствуйте. В общем я понял так что нужно таки отдельный http запрос делать в любом случае для подтверждения и это его “в той же сессии” – ерунда какая то… “та сессия” закончилась после ответа сервера… Спасибо большое!
Возможно разработчик имел ввиду HTTP persistent connection – HTTP keep-alive
Что имел ввиду разработчик “на той стороне” можно только гадать.
Тут либо выпытывать у него что в его понимании “в той же сессии”, либо смотреть на ответы, которые приходят от API и по результатам экспериментировать.
Может быть Ваше предположение правильное, а может нужны куки, а может какой-нибудь токен.
Здравствуйте. У меня вопрос: Я обращаюсь к внешнему (для 1С) HTTP серверу, он отдает мне информацию. Как отдать этому HTTP серверу ответ что я информацию принял? Спасибо.
Добрый день, Александр
На самом деле этот вопрос надо задавать разработчику сервиса, который отдает Вам данные.
Он должен дать Вам URL на который посылать запрос с подтверждением и формат данных подтверждения, которое Вы должны послать на этот адрес.