[ Интеграция ] Как настроить обмен 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.Вставить("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.

Пример 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 и разработали несколько примеров, демонстрирующих эти возможности.

Об авторе

Автор статьи – Алексей Дубровин, г. Челябинск

E-mail: dubrovin1973@gmail.com

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.


Статья в PDF-форматеСтатья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Комментарии / обсуждение (106):

  1. Станислав

    Добрый день, статья полезна, спасибо! Подскажите а если есть задача сверки данных приложения с 1С(сканируем штрих код и проверяем есть ли такой в базе(наш ли он) если да отправить подтверждение) можно ли это реализовать стандартными путями

    • AlexeyDubrovin

      Добрый день
      Ну а почему нет ? Можно через COM, можно через OData (это встроенные в платформу 8.3 REST-сервисы)

  2. тов.Сухов

    Можно ли задействовать сторонний хостинг?
    “…Для работы нам потребуется: Веб-сервер (Apache или IIS) Платформа 1С (8.3.8 или старше) с установленным расширением веб-сервера.”
    В нашей организации платформа 1С установлена на собственном сервере. Плюс имеется сторонний хостинг, на котором находятся сайты, которые и надо согласовать с 1С.
    Вопрос.
    Обязательно ли вместе с 1С, на той же машине, держать еще Apache (или IIS)?
    Можно ли задействовать сторонний хостинг?

    • Dubrovin

      Здравствуйте
      Как минимум, на сайте с apache придется держать 1С. Веб-сервер ведь не знает ничего про 1С, так же как про PHP, Pyton и другие языки. Веб-сервер просто перенаправляет запросы соответсвующим обработчикам. Если хостер позволяет поставить 1С, то в принципе можно это сделать (при наличии лицензии). Но опять же возникает вопрос безопасности такого решения. Вам ведь придется разрешить доступ к базе 1С с того хостинга. Вот тут https://infostart.ru/public/303420/ статья про то как человек публиковал базу на другом сервере под Линукс, но в той же сети. Может быть Вам пригодится.

  3. Andrey

    Добрый день,
    Попробовал скачать картинку с сайта, выдает ошибку 301. В чем может быть проблема?

    • Василенко Тарас

      Здравствуйте!
      Ошибка 301 – это ошибка редиректа куда-либо. ТО есть, редирект не сработал у Вас, можно попробовать скачать картинки из другого браузера.

  4. drizer

    Попробовал поставить XAMPP на винду 8.1 , в процессе установки выдается ошибка, что программа Apache HTTP сервер не работает, когда инсталлировалась, жму на Пуск выдается ошибка, что отсутсвует api-ms-win–crt-runtime-l1-1-0.dll. Все снес, перезагрузил комп, еще раз инсталлировал, то же самое.

  5. drizer

    Здравствуйте! Подскажите, данная статья актуальна еще или уже есть более “продвинутые” способы настройки web-сервисов через 1с?

    • Dubrovin

      Здравствуйте
      Статья актуальна. Что имеете ввиду под более продвинутыми способами настройки?

      • drizer

        Вышли новые платформы, возможно, в них появились новые методы настройки веб-сервисов.

  6. kvt500

    В статье показаны чтение и создание данных, как насчет редактирования и удаления? Будут ещё статьи, курсы, ссылки что почитать?

    • Dubrovin

      Удаление и редактирование мало чем отличается от чтения и редактирования. Для редактирования получаете данные, изменяете и отправляете в http-сервис. В обработчике сервиса пишете код, который найдет в базе соответствующий объект и изменит его.
      Та же история с удалением.

  7. Aidar

    Добрый вечер! Подскажите в какой конкретно конфигурации есть
    обработка “Обмен с WEB-сайтом”?

    • Dubrovin

      УТ 10.3, УПП, КА, УТ11, КА2, ERP, УНФ
      В УТ 10.3 обработка называется ОбменССайтом, в УПП и КА1 вроде так же
      В остальных на вскидку не скажу как называется обработка, не под рукой сейчас.

  8. kvt500

    Статья прекрасна.
    Немножко разовью тему, сделал примеры из статьи на языке Go:
    GET запрос

    package main

    import (
    “fmt”
    “net/http”
    “io”
    “os”
    )
    func main() {
    resp, err := http.Get(“http://localhost/web1c/hs/Demo/List”)
    if err != nil {
    fmt.Println(err)
    return
    }
    defer resp.Body.Close()
    io.Copy(os.Stdout, resp.Body)
    }

    POST запрос

    package main

    import (
    “bytes”
    “encoding/json”
    “fmt”
    “io/ioutil”
    “net/http”
    )

    func main() {
    mapVar1 := map[string]string{“Код”: “000000007”, “Наименование”: “КонтрагентСемь”, “Телефон”: “8-800-555-3535”, “ЭлектроннаяПочта”: “chototam@yandex.ru”, “JivoID”: “666”}
    mapVar2, _ := json.Marshal(mapVar1)
    post(“http://localhost/web1c/hs/Demo/PostCustomerInfo”, string(mapVar2))
    }

    func post(url string, jsonData string) string {
    var jsonStr = []byte(jsonData)

    req, err := http.NewRequest(“POST”, url, bytes.NewBuffer(jsonStr))
    req.Header.Set(“Content-Type”, “application/json”)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()

    fmt.Println(“response Status:”, resp.Status)
    fmt.Println(“response Headers:”, resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    return string(body)
    }

    • Dubrovin

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

  9. KOT301

    Здравствуйте.
    Как получить эти данные в переменные php, которые вы привели в примерах на локальном сайте?
    Как например записать в переменную “Name”: “Иванов”?
    Подскажите пожалуйста. Спасибо.

    • Dubrovin

      HTTP-запрос – это не SQL-запрос в нем нет никаких ПОДОБНО.
      Для чего Вам эта конструкция ? Какая стоит задача ?

  10. Руслан Терликбаев

    Скажите, как сделать чтобы ответ JSON формировался в одну строку в формате [{“Ключ1″:”Значение1”},{“Ключ2″:”Значение2”}…]? А не как у вас с дополнительными переводами корретки.

  11. kurpyaev1

    Обязательно ли нужен apache для http сервиса, вроде как то можно на eindows server 2012 тспользовать встроенные инструменты ос?

  12. a13k55

    Добрый день.
    После переустановки платформы с 8.3.8 на 8.3.10
    при обращении к веб сервису со стороны сайта возникает ошибка:
    SOAP сервис (1С) на IP ***.***.***.*** не доступен!

    В чем может быть проблема?

  13. Сергей

    Добрый день! При выполнении http://localhost/Demo/hs/Demo/List ошибка

    {“#exception”:”{http://v8.1c.ru/8.2/virtual-resource-system}Exception”,”exception”:{“clsid”:”580392e6-ba49-4280-ac67-fcd6f2180121″,”reason”:404,”descr”:”HTTP: Not found\nОшибка при выполнении запроса GET к ресурсу /hs/Demo/List:”,”#inner”:”{http://v8.1c.ru/8.1/data/core}Exception”,”inner”:{“clsid”:”a01f465c-ed70-442e-ada5-847668d7a41c”,”descr”:”Текущему соединению с информационной базой не назначен сеанс”,”data”:”77u/ew0Ke2EwMWY0NjVjLWVkNzAtNDQyZS1hZGE1LTg0NzY2OGQ3YTQxYywi0KLQ\r\ntdC60YPRidC10LzRgyDRgdC+0LXQtNC40L3QtdC90LjRjiDRgSDQuNC90YTQvtGA\r\n0LzQsNGG0LjQvtC90L3QvtC5INCx0LDQt9C+0Lkg0L3QtSDQvdCw0LfQvdCw0YfQ\r\ntdC9INGB0LXQsNC90YEifSwzNX0=”}}}

    Буду благодарен за помощь!

    • Dubrovin

      Попробуйте поставить время жизни сеанса = 0. Это в свойствах http-сервиса на закладке управление сеансами.

      • ser_mcorp

        В общем нашел проблему, но не знаю как лечить… Если в ИБ нет пользователей то все работает! Если добавляешь пользователя возникает вышеуказанная ошибка.

        • Dubrovin

          Откройте файл default.vrd (в папке публикации) и в параметре ib добавьте пользователя и пароль пользователя у которого есть права. Например ib=”File="C:\1C_BASE\Demo";Usr=админ;Pwd=123;”

          • ser_mcorp

            Спасибо, работает! А есть ли другие варианты чтобы в файле не хранить пользователя и пароль – с точки зрения безопасности?

            • Dubrovin

              Можно сделать пользователя ИБ с windows-аутентификацией и сопоставить этого пользователя с пользователем windows.

                • Dubrovin

                  Если Вам нужно сделать запрос от конкретного пользователя, то в конструкторе HTTPСоединения указываете логин и пароль 3 и 4 параметром
                  HTTP = Новый HTTPСоединение(server,port,login,password,,,,);
                  Причем для безопасности лучше работать через HTTPS (установить на сервере сертификат) и последним параметром передавать защищенное соединение.

  14. Дмитрий Сидоренко

    Эх, вот года 2-3 назад бы статейку…

    Правда, набивая руку пришел к выводу, что нет смысла плодить кучу методов get и post, достаточно по одному, а параметром уже передавать имя метода и в зависимости от имени отрабатывать тот или иной сценарий.

    А вообще для данных примеров больше подошла бы oData

    • Dubrovin

      Если еще и про oData написать, то статья не вощла бы ни в какие рамки по объему. А она и так вылезла за рамки. Опять же хотелось показать именно базовые основы работы с http-сервисами, а oData это уже вообще отдельная тема.

  15. Сергей

    Добрый день! В результате выполнения примера браузер выдает ошибку

    Object not found!

    The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.

    If you think this is a server error, please contact the webmaster.

    Error 404

    localhost
    Apache/2.4.27 (Win32) OpenSSL/1.0.2l PHP/7.1.8

    • Dubrovin

      Проверьте правильность написания URL. Возможно, проблема у Вас та же что и в комментариях ниже – регистрозависимость.

      • LeonidMessin22

        Проблема та же. Регистр не влияет.

        А в общем статья интересная. Жаль только, что уже на втором примере тестирование стало невозможным по выше указанной причине.
        Чаще всего, кстати, это и останавливает в изучении чьего-либо кода… или курса :)

        • LeonidMessin22

          Как обычно в 1С, путем танцев с бубном разобрался (XAMPP Control Panel лучше не использовать, а управлять Аппачем через Службы в винде).
          Вопрос снят.
          Двигаюсь дальше…)

          • Dubrovin

            Ну вот, а говорили, что это останавливает изучение. Изучение обычно останавливает только лень. Никакой курс статья или учебник не может стать волшебной пилюлей, которую скушал – и все умеешь и можешь. Все равно нужно пробовать, ошибаться, находить решения, копать глубже и т.п. И это интересно :-)

          • Наталья

            Большое спасибо за “наводку”! Была та же ошибка 404. Помог простой перезапуск службы Apache2.4 через службы ОС Windows.

  16. amalaxit

    Спасибо за статью. У кого-нибудь получился сервис из примера 2? Мой хром выдаёт Error 404. На localhost страница Welcome to XAMPP.

    • Dubrovin

      У меня работает. Но ошибку воспроизвести получилось.
      Очень странно это, но такое ощущение, что URL регистрозависимый.
      Если пишу /List работает, пишу /list выдает 404.

  17. Алексей

    Добрый день. Спасибо за статью. У кого -нибудь заработал HTTP сервис с контрагентами (пример 2)? Браузер хром выдаёт ошибку Error 404. На localhost висит “welcom to xampp”.

  18. Ulus

    Огромнейшее спасибо. Супер описано.
    Очень хотелось бы реально статью про различия web сервисов и Http-Сервисов.
    Мы как то дискуссировали
    По Get запрос все понятно там явное отличие.
    Какое отличие Web сервиса от POST запроса Http-сервиса я так и не понял, пазлики в голове не сложились.
    А хотелось бы понимать, чтобы принимать корректное решение при автоматизации той или иной задачи интеграции.
    Еще раз огромное спасибо.

    • Dubrovin

      Веб-сервисы в 1С это по сути реализация протокола SOAP поверх HTTP (возможен SOAP поверх TCP и т.п, но в 1с пока этого нет). Если коротко и без влезания в описание протокола SOAP, то это передача сообщений в формате XML. Формат стандартизирован. Данные, которые пересылаются в пакете типизированы. Типы данных указываются прямо в XML и автоматически проверяются. В случае с 1С SOAP сообщение отправляется в теле HTTP запроса/ответа. Так как содержимое SOAP сообщения получается довольно большим (кроме типизации там еще много всего), то при выборе технологии в пользу веб-сервисов нужно учитывать пропускную способность Вашего канала интернет. В плюсах – это конечно типизация и наличие стандартов. Стандартов для формата сообщений вслучае с HTTP-сервисами (или REST-сервисами по другому) нет. Можно формировать сообщения и помещать их в тело запроса в любом формате. Поэтому размер сообщения может быть сильно меньше и можно использовать на более слабых каналах. Но нет типизации из коробки. Примерно так если кратенько и поверхностно. А так это реально тема для большой статьи или даже нескольких.

  19. Нурлан

    Здравствуйте!
    Спасибо за статью! Правда возникли сложности! При обращении к сервису посредством браузера сервис вернул “Ошибка инициализации библиотеки модулей”. Посмотрел через отладчик, система проходит процедуру “УстановкаПараметровСеанса” в модуле сеанса без ошибок, на этом все! До модуля обработчика метода шаблона не доходит. Подскажите, пожалуйста, в чем может быть проблема?

    • Нурлан

      При этом данная ошибка возникает при установке тела ответа из строки, т.е. при отправке только кода “200” ошибка не возникает.

      • Dubrovin

        Речь про примеры из статьи или Вы в какой-то своей конфигурации что-то делали? Чтобы что-то ответить нужны подробности для воспроизведения ошибки, а так можно только гадать.

        • Нурлан

          Да, пример из статьи.
          Данный код отрабатывает корректно:
          Ответ = Новый HTTPСервисОтвет(200);
          Возврат Ответ;

          Данный уже вызывает ошибку:
          Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить(“Content-type”, “application/JSON; charset=utf-8”); Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Возврат Ответ;

        • Нурлан

          Также, в случае когда возникает ошибка, не отрабатывает точка останова. В случае когда возвращаю только код 200, точка останова отрбатывает!

  20. 1k

    Загрузка работает так:
    HTTP = Новый HTTPСоединение(“Курсы-по-1С.рф”,,,,,,,Ложь);
    //2. создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки
    ЗаголовокЗапросаHTTP = Новый Соответствие;
    //ЗаголовокЗапросаHTTP.Вставить(“Host”, “Курсы-по-1С.рф”);

    • Dubrovin

      Добрый день

      Отвечу сразу на все 3 Ваших комментария. В вызове HTTPСоединение действительно я допустил опечатку и не заметил нехватки запятых. Но и платформа их тоже не заметила. :) Возможно, платформа по-прежнему поддерживает два синтаксиса для конструктора этого объекта, как было в 8.2, но об этом не пишется в синтакс-помощнике. А возможно, что Ложь воспринялось как 0. Короче я просто удачно опечатался, и раскопировал ошибку на все примеры. Благодарю, что заметили и указали на эту ошибку. Исправим
      А по поводу заголовка Host, который Вы закомментировали и все заработало, то тут похоже переделки на сайте какие-то были. Заголовок Host в принципе в большинстве случаев указывать необязательно. И в большинстве случаев этот значение этого заголовка совпадает с именем хоста. Однако, иногда на одном хосте располагают несколько сайтов, и, чтобы указать к какому конкретно сайту мы обращаемся мы можем указать в заголовке эту информацию. Приведенный в статье код действительно на сегодняшний день выдает ошибку 404. Закомментировал в коде добавление заголовка Host (как Вы указали) и посмотрел c помощью Fiddler (это такой инструмент для отладки http) как выглядит запрос и ответ при успешно полученной картинке. А там в заголовке вот такие кракозяблы Host=xn—-1-bedvffifm4g.xn--p1ai Поставил эти кракозяблы в код и картиннка пришла.

  21. 1k

    Статья приводит косячный код:
    ДанныеОКлиенте = Новый Структура(“Код,Наименование,Телефон,ЭлектроннаяПочта,JivoID”, Объект.Код, Объект.Наименование, Объект.ЭлектроннаяПочта, Объект.JivoID);
    Код писался явно на вскидку и не тестировался.

  22. 1k

    Не скачивается картинка с “Курсы-по-1С.рф”, возвращает 404. Хром её по этому адресу видит. Есть алгоритм отладки?

  23. kmaximka

    Добрый день!
    Новый HTTPСоединение(, , , , , , , )
    т.е. 6й параметр это вроде как должен быть, откуда синтаксис из примера?

    • Dubrovin

      Ага, разобрались. В вызове конструктора HTTPСоединение я ошибся и поставил мало запятых. Подробности в ответе на комментарий 1k

    • magefred

      Установил Apache по вашему примеру, 1с пишет:
      Веб-серверы не обнаружены!
      Хотя http://localhost/dashboard/ – открывается
      Welcome to XAMPP for Windows 7.1.8
      XAMPP Control Panel v3.2.2
      1С:Предприятие 8.3 (8.3.6.2041)

      Может что-то не досказали?

      • Dubrovin

        XAMPP 7.1.8 как я помню устанавливает апач 2.4, а поддержка 2.4 появилась только в платформе 8.3.8. Либо ставьте платформу поновее либо апач 2.2

  24. andrewkop85

    Спасибо. Просто и доступно самые основы. В голове теперь есть не абстрактное представление того, что это и зачем оно нужно, а вполне практическое.

  25. gosn1ck

    Добрый день!
    подскажите, можно ли выполнить публикацию сервиса в конфигураторе если веб-сервер находится на другом физическом сервере?

        • Dubrovin

          Ну на другом физическом сервере все равно придется ставить 1С. В ИТС по этой ссылке http://its.1c.ru/db/v838doc#bookmark:adm:TI000000195 написано:
          —цитата

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

          —конец цитаты

          • Владимир

            на другом сервере может быть запущен reverse-proxy, который в свою очередь переправляет запросы на сервер с 1ской и веб-сервером в одном флаконе

  26. Никита

    Из пожеланий: было бы полезно прояснить различия между платформенными вэб-сервисами и http-сервисами. Сферы применения, преимушества и недостатки, безопасноть и защита данных в случае применения каждого из объектов. Источник: ©Курсы-по-1С.рф

    Поддерживаю.

  27. Владимир

    Добрый день.
    Спасибо за статью.
    Приходилось ли вам сталкиваться с обработкой ответов сторонних сервисов, содержащих вложения? Если да, то как обрабатывали их?

    • Dubrovin

      Здравствуйте, Владимир
      Приходилось дорабатывать типовые обмены с сайтом и пару обработок, реализующих обмены с торговыми площадками. Там во вложениях файлы в CommersML или YandexML. Завтра (8 сентября) накидаю пример как вытащить вложение. Я так понимаю, что проблема в этом ?

      • Dubrovin

        По поводу “вложений”. Насколько я понимаю, вопрос касается случаев,
        когда в HTTP-запросе/ответе содержатся смешанные данные: значения
        полей веб-формы, произвольный текст и один или несколько бинарных файлов.
        Чтобы понять как работать с подобными пакетами, рассмотрим что они из себя представляют

        ===============================================
        POST /form.html HTTP/1.1
        Host: localhost
        Referer: http://localhost/form.html
        User-Agent: Mozilla
        Content-Type: multipart/form-data; boundary=573cf973d5228
        Content-Length: 288
        Connection: keep-alive
        Keep-Alive: 300

        –573cf973d5228
        Content-Disposition: form-data; name=”field”

        –573cf973d5228
        Content-Disposition: form-data; name=”file”; filename=”sample.jpg”
        Content-Type: image/jpeg

        –573cf973d5228–
        ===========================================

        Для передачи смешанных данных в заголовке размещается Content-Type: multipart/form-data вместе с которым указывается строка-разделитель boundary.
        Далее в теле пакета идет преамбула, которая чаще всего не используется и там просто пустая строка.
        Потом идет строка-разделитель, за ней идут заголовки, определяющие что в этой области тела размещено и какой тип данных у этого содержимого.
        Затем идет пустая строка, за которой следуют сами данные. Ну а дальше разобрать это дело техники. Пример кода, реализующий создание пакета и его чтения
        можно посмотреть на сайте 1С по ссылке http://v8.1c.ru/o7/201602bin/index.htm

  28. Никита Юров

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

  29. Denis_Denis

    Добрый день!
    Аплодирую стоя)) ждем новый курс по интеграции.
    Ориентировочно в сентябре будет или нет?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.