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

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

[sociallocker id=»136011″]

Статья в PDF-форматеСтатья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Exchange_with_internet_services.pdf

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

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

  1. Александр

    Как с интернет-страницы получать данные из базы 1С ? Что прописать на интернет странице?

    • AlexeyDubrovin

      Александр, «секретного ингридиента нет!»
      Чтобы получить данные из 1С, нужно изучить какой-нибудь язык программирования, применяемый в веб-разработке (php, python, java, C# и т.д.) и написать на нем код, который обратится к базе 1С через COM или http-сервис или web-сервис или еще каким-либо способом и получит из нее нужные данные. Затем эти данные нужно отрисовать на веб-странице, используя HTML+CSS+возможно понадобится JavaScript.

  2. Александр

    Добрый день. Два вопроса к 4-му примеру. 1. Если не срабатывает обработка в http-сервисе, как узнать, в чем причина? 2. Я правильно понял, что обработку «ТестированиеPOST» можно было сделать в другой аналогичной базе?

    • AlexeyDubrovin

      Добрый день
      1) Если что-то не работает, то можно погуглить или спросить на форуме :).
      А если серьезно, то смотреть сообщения об ошибке, которую возвращает сервис или смотреть журнал регистрации.
      Если все-равно не понятно, то отладку запустить.
      Иногда админы что-нибудь закроют лишнего, тоже может быть как причина.
      Без конкретики можно еще гору возможных причин написать. Если есть конкретная проблема, то опишите что и как не срабатывает, попробую помочь
      2) Да, в принципе можно было сделать в другой базе

      • Александр Борисович

        Спасибо большое, все получилось. Убрал порт 8080, убрал формирование файла, т.е. загрузил прямо «СтрокаДляТела». Заработало. Только «на приеме» в функции PostCustomerInfoPostCustomerInfo(Запрос) отладка не срабатывает. Да, из другой базы тоже заработало:))

        • AlexeyDubrovin

          Рад, что у Вас все получилось.
          Чтобы работала отладка, нужно чтобы
          1) на сервере 1с (если клиент-серверная версия) была включена отладка
          2) в отладчике в меню отладка/подключение нажать кнопку автоматическое подключение и поставить галку на http-сервисы
          3) если сервер 1с и машина с которой запускаетесь разные, то еще и «искать предметы отладки на удаленном компьютере» выставить

    • AlexeyDubrovin

      Добрый день

      Прямо вот так «влоб» — не получится.
      По Вашей ссылке видно Google Disk. У него есть API. Через API можно попробовать

  3. Алекс

    Большое спасибо Автору за просто уникальную статью. Очень удачно получилось подобрать материал. Но и бы хотелось чтобы уважаемый автор немного поправил код. Что касается скачивания картинки править много.
    — протокол https
    — HTTP.Получить(HTTPЗапрос, «С:\Demo\logo.png»); в Попытку. В исключение сделать нормальную обработку с кодами 400-500.
    — И самое интеретесное код 302 перенаправление. Из-за чего код не рабочий
    —————
    Я не в одной типовой не видел данные моменты нормально сделанные.

    Что касается сервисов. Там мелочь все нужно засунуть в СокрЛП(). Иначе жейсонка иногда выдает ошибку. Хотя я весь json выбросил. И все делал в формате yaml
    И последнее XAMPP качать момент спорный. Родная инсталяшка апача 2,2 или 2,4 работает прямо из коробки.

    • AlexeyDubrovin

      Добрый день
      Спасибо за отзыв.
      Посмотрю, что можно поправить и дописать.
      По XAMPP — дело вкуса. На тот момент это был самый вменяемый дистрибутив, с установкой которого не возникало проблем.
      А официальных сборок апача на тот момент вообще не было. Были ссылки на XAMPP и BITNAMI
      прямо на официальном сайте.
      А мне сейчас больше заходит Laragon. Есть там плюшки, которые лень руками делать, типа автоматического прописывания тестовых доменов в hosts, создания самоподписанных сертификатов для локальных сайтов в один клик и тому подобное. Опять же дело вкуса

      • Алекс

        Уважаемый Алексей. По большому счету вопрос сборки Апача не принципиален. У меня давно лежит на облаке Apache 2.4 который когда-то 1с, куда-то ложила, а я слизал уже даже не помню от куда. Он просто инсталируется и все работает. Вопрос не принципиальный по причине, что щас любой специалист обязан по умолчанию знать как по елементарному настроить Апач.
        Принципиальны другие вопросы. Если строку просто считать из базы и не на всякий случай не нормальзировать с помощью например СокрП() или СокрЛП(), бывают странные ошибки. Например в вашем случае у меня преобразование в JSon чудило.
        Вопрос со скачиванием картинки нерабочий. По причине что сайт статьи называется. курсы-по-1с.рф, а в реальности он другой в результате кода 200 мы не получим никогда. Только 302. А вот этот момент самый интересный, посмотреть на Вашу реализацие редиректа. Чисто сравнить. Одна голова хорошо……
        И без попытки Ответ = HTTP.Получить(HTTPЗапрос, «С:\Demo\logo.png»); //писать несколько идеологически не верно. И глобально что слабо написать выложить более менее адекватную отработку HTTP протокола? Да эта же тема для целой нехилой статьи.
        Еще меня уважаемый Алексей напрягает Постоянный канал между браузером и сервером. Очень интерестная тема как бы настроить чтобы он уничтожался по времени, или сразу после получение данных клиентом.

        • AlexeyDubrovin

          Принципиальны другие вопросы. Если строку просто считать из базы и не на всякий случай не нормализировать с помощью например СокрП() или СокрЛП(), бывают странные ошибки. Например в вашем случае у меня преобразование в JSon чудило.

          А как конкретно чудило ? На какой версии платформы ?

          Вопрос со скачиванием картинки нерабочий. По причине что сайт статьи называется. курсы-по-1с.рф, а в реальности он другой в результате кода 200 мы не получим никогда. Только 302.

          Там причина переадресации немножко другая. Там идет переброска с http на https, поэтому можно и без обработки переадресации обойтись, если подключаться сразу по HTTPS

          &НаКлиенте
          Процедура Скачать(Команда)
              //1. создаем HTTP-соединение
             ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС());
             HTTP = Новый HTTPСоединение("Курсы-по-1С.рф",443,,,,,ЗащищенноеСоединение,);
             //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Запрос, "D:\1CBase\!Demo\logo.png");
             //5. обрабатывает ответ на запрос
             Если Ответ.КодСостояния = 200 Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Картинка получена";
                Сообщение.Сообщить();
             Иначе
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Картинка не получена. Статус-код " + Ответ.КодСостояния;
                Сообщение.Сообщить();
             КонецЕсли;
          КонецПроцедуры

          Про обработку кодов 301 и 302: там больше возни с разбором полученной из заголовка ответа ссылкой, чтобы в конструктор HTTP-соединения и в запрос передать потом соответствующие части этой ссылки. Чего-то сильно умного там вряд ли можно придумать. Если интересно, можете поизучать исходники HTTPКоннектора. Взять можно на гитхабе. Там много всего интересного, да и на практике хорошо так ускоряет разработку.

          И без попытки Ответ = HTTP.Получить(HTTPЗапрос, “С:\Demo\logo.png”); //писать несколько идеологически не верно. И глобально что слабо написать выложить более менее адекватную отработку HTTP протокола? Да эта же тема для целой нехилой статьи.

          Код в этой статье не претендует на премию «идеальный код». Цель была не в этом. Нужно было объяснить что-такое HTTP и сделать обзор инструментов платформы для работы c HTTP протоколом. А обработка ошибок — это уже другая тема :)

          • Алекс

            Цель была не в этом. Нужно было объяснить что-такое HTTP и сделать обзор инструментов платформы для работы c HTTP протоколом.
            ———
            Абсолютно с Вами согласен. Основную задачу Вы выполнили просто блестяще. Но интерес в том иногда нужно лезть на самые разные сайты. И тонкостей там очень много, а тема даже интереснее веб сервисов.
            ===========
            ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС());
               HTTP = Новый HTTPСоединение(«Курсы-по-1С.рф»,443,,,,,ЗащищенноеСоединение,);
            ————
            Спасибо.
            ============
            Про обработку кодов 301 и 302: там больше возни
            —————
            кусок кода я удалил пишу по памяти, он не рабочий только демонстрация алгоритма.
            Если Лев(Ответ,2) = «30» тогда
            Host = Ответ.Заголовки.Получить(«Host»);
            Location = Ответ.Заголовки.Получить(«Location»);
            Если Не( Host = Неопределено Или Location = Неопределено)
            Тогда
            Location = СтрЗаменить(Location,»Https:\\»,»»);
            Location = СтрЗаменить(Location,Host,»»); // помоему дважды
            /// дальше очевидно …….
            КонецЕсли
            КонецЕсли
            ….HTTPЗапрос….
            Попытка
            //4. отправляем HTTP-запрос
               Ответ = HTTP.Получить(, Location);
            Исключение
            // Обработка кодов 4хх и 500
            Сообщить(Статус-код » + Ответ.КодСостояния)
            Исключение
            ====================================
            А как конкретно чудило ? На какой версии платформы ?
            ——
            Чудить может в любой версии и еще даже с 7.7. В первую очередь 1с не любит строк неограниченной длины. Ну это еще не все, бывает нормальная строка, но выдает ошибку. Что нужно в случае чего лепить СокрП или СокрЛП и так все давно знают.
            =======================
            Но это вопросы больше технические, идеального кода не бывает. А такою ерунду специалист и сам должен уметь решать.
            Идиологические вопросы это вопросы безопастности.Иметь возможность мониторить кто когда подключался. И обрывать каналы автоматически

            • AlexeyDubrovin

              Если делать переадресацию, то ниже более универсальный пример.

              &НаКлиенте
              Процедура Скачать(Команда)
                  //1. создаем HTTP-соединение
                  ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС());
                  HTTP = Новый HTTPСоединение("Курсы-по-1С.рф",,,,,,,);
                  //2. создаем соответствие ЗаголовокЗапросаHTTP и заполняем заголовки
                  ЗаголовокЗапросаHTTP = Новый Соответствие();
                  //ЗаголовокЗапросаHTTP.Вставить("Host", "xn----1-bedvffifm4g.xn--p1ai");
                  ЗаголовокЗапроса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Запрос, "D:\1CBase\!Demo\logo.png");
                  //5. обрабатывает ответ на запрос
                  Если Ответ.КодСостояния = 200 Тогда
                      Сообщение = Новый СообщениеПользователю;
                      Сообщение.Текст = "Картинка получена";
                      Сообщение.Сообщить();
                  ИначеЕсли Ответ.КодСостояния = 301 ИЛИ Ответ.КодСостояния = 302 Тогда
                      УРЛ = Ответ.Заголовки.Получить("Location"); //"https://курсы-по-1с.рф:443/wp-content/uploads/2016/11/kursy-po-1c.ru-logo-300wide-58high-2016-11-02-v2.png";
                      СтруктураУРЛ = РазобратьУРЛ(УРЛ);
                      HTTP = Новый HTTPСоединение(СтруктураУРЛ.Сервер, СтруктураУРЛ.Порт, , , , , СтруктураУРЛ.ЗащищенноеСоединение);
                      HTTPЗапрос = Новый HTTPЗапрос(СтруктураУРЛ.АдресРесурса, ЗаголовокЗапросаHTTP);
                      Ответ = HTTP.Получить(HTTPЗапрос);
                      Если Ответ.КодСостояния = 200 Тогда
                          Сообщение = Новый СообщениеПользователю;
                          Сообщение.Текст = "Картинка получена";
                          Сообщение.Сообщить();
                      Иначе
                          Сообщение = Новый СообщениеПользователю;
                          Сообщение.Текст = "Картинка не получена. Статус-код " + Ответ.КодСостояния;
                          Сообщение.Сообщить();
                      КонецЕсли;
                  Иначе
                      Сообщение = Новый СообщениеПользователю;
                      Сообщение.Текст = "Картинка не получена. Статус-код " + Ответ.КодСостояния;
                      Сообщение.Сообщить();
                  КонецЕсли;
              КонецПроцедуры

              &НаКлиенте
              Функция РазобратьУРЛ(УРЛ)
                 
                  //Структура ответа
                  Результат = Новый Структура("Сервер,Порт,АдресРесурса,ЗащищенноеСоединение");
                 
                  //Получим протокол
                  Позиция = СтрНайти(УРЛ, "://");
                  Если Позиция > 0 Тогда
                      ПозицияСервера = Позиция + 3;
                      Протокол = Нрег(Лев(УРЛ, Позиция -1 ));
                      Если Протокол = "https" Тогда
                          Результат.ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС());
                      Иначе
                          Результат.ЗащищенноеСоединение = Неопределено;
                      КонецЕсли;
                  Иначе
                      ПозицияСервера = 1;
                  КонецЕсли;
                 
                  УРЛБезПротокола = Сред(УРЛ, ПозицияСервера);
                 
                  //определим Порт и АдресРесурса
                  ПозицияПорт = СтрНайти(УРЛБезПротокола, ":");
                  Если ПозицияПорт > 0 Тогда
                      Результат.Сервер = Сред(УРЛБезПротокола, 1, ПозицияПорт - 1);
                      УРЛБезПротокола = Сред(УРЛБезПротокола, ПозицияПорт + 1);
                      ПозицияАдресРесурса = СтрНайти(УРЛБезПротокола, "/");
                      Если ПозицияАдресРесурса > 0 Тогда
                          Результат.Порт = Число(Сред(УРЛБезПротокола, 1, ПозицияАдресРесурса - 1));
                          Результат.АдресРесурса = СРЕД(УРЛБезПротокола, ПозицияАдресРесурса)
                      Иначе
                          Результат.Порт = Число(Сред(УРЛБезПротокола, ПозицияПорт + 1));
                          Результат.АдресРесурса = "";
                      КонецЕсли;
                  Иначе
                      Если Протокол = "http" Тогда
                          Результат.Порт = 80;
                      Иначе 
                          Результат.Порт = 443;
                      КонецЕсли;
                      ПозицияАдресРесурса = СтрНайти(УРЛБезПротокола, "/");
                      Если ПозицияАдресРесурса > 0 Тогда
                          Результат.Сервер = Сред(УРЛБезПротокола, 1, ПозицияАдресРесурса - 1);
                          Результат.АдресРесурса = СРЕД(УРЛБезПротокола, ПозицияАдресРесурса)
                      Иначе
                          Результат.Сервер = Сред(УРЛБезПротокола, 1);
                          Результат.АдресРесурса = "";
                      КонецЕсли;
                  КонецЕсли;
                 
                  Возврат Результат;
                 
              КонецФункции

              Про идеологические вопросы не очень понятно, что вас волнует ?
              Обрывать каналы между чем и чем (клиентом и веб-сервером или веб-сервером и базой) ? И главное — зачем ?

              • Алекс

                Не буду Вас больше отвлекать. Не хочу выглядить критиканом.
                Обработка ТестированиеPost
                HTTP = Новый HTTPСоединение(«localhost»,80,»Админ»,»ОченьСложныйПароль»,,,,); //авторизация однако. Иначе ответ сервера 401
                //и в конце что бы видеть что нам ответил сервер.
                …..
                Сообщить(«Запрос отправлен,Ответ код состояния: «+ОтветHTTP.КодСостояния);
                Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
                КонецПроцедуры

                Пишите статьи не у каждого талант. Так подобрать материал. Чтобы просто рассказать о сложном. Без лишних подробностей.
                Удачи. Рест интерфейс и ОДата будет?
                ==========
                Спасибо за код. Код очень хороший. Я бы конечно сделал покороче. Шероховатости 3, если Вам интересно
                1) А еще бывает код 307.
                2) Порт 1с по умолчанию и сама подставляет. Но вдруг админ сайта извращенец и направил редирект на забавный порт. Номер порта нужно брать из Локатион.
                3) Попытка
                Ответ = HTTP.Получить(HTTPЗапрос, «D:\1CBase\!Demo\logo.png»);
                Исключение //обработка ошибок 4хх и 500
                Сообщить(ОписаниеОшибки());
                КонецПопытки.

                • AlexeyDubrovin

                  1) А еще бывает код 307.

                  Анекдот такой есть:
                  — Сколько раз я тебе говорила, не будь таким дотошным.
                  — Семь
                  :)

                  2) Порт 1с по умолчанию и сама подставляет. Но вдруг админ сайта извращенец и направил редирект на забавный порт. Номер порта нужно брать из Локатион.

                  В примере и берется из Location. Смотрите внимательнее. Если порт в Location указан, то берем из Location, если не указан, то берем порты по умолчанию

                  • Алекс

                    Уважаемы Алексей!
                    Куда мне по дотошности до г-на Гилева. Дотошностость это общая черта всех программистов 1с. Мы с главбухами работаем, а они все дотошные стервы. Самое страшное это побить базу. Хотите прикол скачать картинку можно 2-мя строчками кода. Но чтобы узнать этот синтаксис. Нужно посмотреть синтаксис-помощник 8.2. Это об дотошности. Это в качестве продолжения анекдота о дотошности.
                    HTTP = Новый HTTPСоединение(«Курсы-по-1С.рф»
                    , //
                    , //
                    , //
                    , //
                    , Истина);
                        Ответ = HTTP.Получить(«/wp-content/uploads/2016/11/kursy-po-1c.ru-logo-300wide-58high-2016-11-02-v2.png», «F:\logo.png»);
                    —————-
                    Сути же нашей с вами общения. Получить удобную процедуру. Где по полному URL можно было получить любой ресурс. Типа для общего модуля.

                    • AlexeyDubrovin

                      Уважаемый Алекс !
                      Будьте уж тогда совсем дотошным. Выше я советовал взять с гитхаба HTTPКоннектор и посмотреть код.
                      Даже не поленюсь и дам ссылку https://github.com/vbondarevsky/Connector.
                      Там все о чем Вы пишете уже давно реализовано. И запросы одной строчкой кода, и переадресация, если она вдруг случится, и много чего еще.

                    • Алекс

                      Даже не поленюсь и дам ссылку https://github.com/vbondarevsky/Connector.
                      ——————-
                      ВАУ! Это мне и нужно. Это огромное спасибо. Видите польза дотошности. Я все понимаю, что в статье можно только показать пример.
                      ———-
                      Теперь о идеологических вопроса. Я о них отчитаюсь через очень продолжительное время. Это вопросы как обеспечить безопастность, надежность функционировая. Что и с какой переодичностью администрировать. Что может сломаться и что делать когда сломалось. Какие запасные варианты работы системы нужно предусмотреть. По сути это и есть основная работа 1с-ника. А кодировать и студента можно взять.

          • Алекс

            Не буду Вас больше отвлекать. Не хочу выглядить критиканом.
            Обработка ТестированиеPost
            HTTP = Новый HTTPСоединение(«localhost»,80,»Админ»,»ОченьСложныйПароль»,,,,); //авторизация однако. Иначе ответ сервера 401
            //и в конце что бы видеть что нам ответил сервер.
            …..
            Сообщить(«Запрос отправлен,Ответ код состояния: «+ОтветHTTP.КодСостояния);
            Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
            КонецПроцедуры

            Пишите статьи не у каждого талант. Так подобрать материал. Чтобы просто рассказать о сложном. Без лишних подробностей.
            Удачи. Рест интерфейс и ОДата будет?

            • AlexeyDubrovin

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

  4. Андрей

    Добрый день. Спасибо за статью, очень полезна. Подскажите пожалуйста, как выгрузить из мобильного приложения (МП) документ в центральную базу? В указанном примере используется метод: «Новый Текстовый Документ», которого нет в МП.
    Спасибо.

    • AlexeyDubrovin

      Добрый день
      Не помню зачем я 4 года назад вообще воспользовался объектом ТекстовыйДокумент. Видимо что-то в голове было, но …
      Если нет потребности выводить в интерфейс текст, лучше его для обменов вообще не использовать. Особенно если файл будет формироваться большой. Это все будет в памяти и либо начнет тормозить или вообще упадет.
      Для данного примера можно было сразу в файл писать. На МП тоже будет работать.

      Запись = Новый ЗаписьJSON;
      Запись.ОткрытьФайл(ИмяВременногоФайла);
      ЗаписатьJSON(Запись, ДанныеОКлиенте);
      Запись.Закрыть();

      А дальше уже в тело вставлять

    • AlexeyDubrovin

      В статье в принципе описано как формируется ссылка. Повторюсь кратенько
      http://localhost:8080 — адрес сервера, где опубликована база (и сервисы)
      /Demo — имя базы, как оно указано в форме публикации
      /hs/Demo — корневой адрес http-сервиса
      /List — шаблон, через который мы обращаемся к методу сервиса
      Таким образом, мы можем написать, например, http://localhost:8080/Demo/hs/Demo/GetCustomerInfo/00001, где /GetCustomerInfo/00001 будет обращение к методу, который вернет информацию по клиенту с кодом 00001

  5. Sergey Seredkin

    А в параметры URL GET запроса из строки браузера можно передать несколько параметров ИНН Сумма и тд .как это будет выглядеть можете показать

    • Sergey Seredkin

      Все понял сам их друг за другом в фигурных скобках через черту /{par1}/{par2} и т.д

  6. Алексей

    Добрый день, после получения данных по:
    http://localhost:8080/Demo/hs/Demo/List
    программирую шаг, на котором можно получить информацию по конкретному контрагенту, но при попытке обновить конфигурацию БД получаю сообщение об исключительной блокировке базы данных (база файловая с нуля по вашей инструкции, платформа 8.3.17.1851). Начинаю разбираться: остановил IIS (на win10), закрыл базу, зашел заново, все равно ошибка исключительной блокировки.

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

    Вопрос: что нужно настроить и как, чтобы этот процесс не блокировал базу данных в случае с файловой и клиент-серверной БД ?

    • AlexeyDubrovin

      IIS он такой, то какой-нибудь процесс не останавливается при остановке из консоли IIS, то при остановке зависает в состоянии Остановка и спасает только перезагрузка компа/сервера или поиск волшебных команд на сайте Microsoft. Веб сервер держит соединение с базой, чтобы отрабатывать быстрее следующие запросы.
      Просто запишите куда-нибудь имя процесса и останавливайте ручками.
      Веб сервер держит соединение с базой, чтобы отрабатывать быстрее следующие запросы. Закрывайте браузер или чем Вы цеплялись сервису перед обновлением базы.
      Если это Вас сильно беспокоит, а использование IIS не является обязательным, то поставьте APACHE. С ним все проще, он не расползается по всей системе.

  7. vik_hook

    Согласен – отличная статья! Нашел небольшую недоработку – попробовал воспроизвести
    последний код – ошибка в строке:
    ОтветHTTP = HTTP.ОтправитьДляОбработки(ЗапросHTTP);
    HTTP не определено – это должно быть соединение… а оно в тексте не определено!
    Добавьте плииз еще пару нужных строк !))

    • AlexeyDubrovin

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

      • vik_hook

        Да отлично! А можно еще добавить как правильно для https с логином и паролем…?))

        • AlexeyDubrovin

          Да, примерно так

          ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(,  Новый СертификатыУдостоверяющихЦентровОС());
          HTTP = Новый HTTPСоединение("Курсы-по-1С.рф", , <Пользователь>, <Пароль>, , , ЗащищенноеСоединение);
              • vik_hook

                Алексей а можно еще 1 вопрос… Пож-та! Благодаря Вашей статье удачно подключился к API. На этапе чтения джейсона возникает ошибка имен свойств — там есть структура с такими вот «44»=»1″.
                Надо делать соответствие. А как это правильно сделать никак не могу найти. Поможете?

  8. Сергей

    Добрый день!
    Пытаюсь сделать HTTP сервис в конфигурации ЗУП .Установил APACHE24 как служба на хосте с 1С AS 64 8.3.15.1656 .Опубликовал в конфигурации как zup3 .создался файл default.vrd. Создал в конфигурации http сервис. Корневой URL сервиса zup_test. Путь шаблона /emp . Имя метода metod_test . Делаю запрос http:\\localhost:8082\zup3\hs\zup_test\emp\metod_test ошибка 404 Относительный путь делал по разному http:\\localhost:8082\zup3\hs\zup_test\emp везде ошибка Сервер работает проверял как http:\\localhost:8082 . Куда копать?

    • AlexeyDubrovin

      Проверьте регистр URL. Apache регистрозависимый, возможно, в этом проблема

  9. Владимир

    Доброго времени суток. Статья отличная. Начал осваивать. И вот сразу же ошибка при віполнении запроса в браузере:
    {HTTPСервис.Customers.Модуль(22)}: Error calling context method (ЗаписатьJSON)

    Автор, можете подсказать куда «копать»?

    • AlexeyDubrovin

      Здравствуйте
      В эту строку и копать. Отладчиком.
      Возможные причины:
      1) версия платформы старая, не поддерживает сериализацию в json
      2) в параметры вызова ЗаписатьJSON передаются некорректные параметры

  10. White

    Спасибо автору за статью, для знакомства с хттп самое то.
    Есть один вопрос: в коде обработки которая отправляет POST-запросы вы получили строку JSON для тела запроса (СтрокаДляТела = ЗаписьJSON.Закрыть();), можно было бы воспользоваться методом «УстановитьТелоИзСтроки» объекта HTTPЗапрос и отправлять запрос, так ведь?
    Сохранение строки JSON в текстовый файл была необходима только для заполнения заголовка запроса «Content-Length», верно понимаю?

    • AlexeyDubrovin

      Добрый день
      Да, можно было УстановитьТелоИзСтроки. И даже без Content-Length обойтись.
      Но файлами все-таки часто пользуюсь при разработке. Удобно. Делаешь выгрузку в файл, смотришь глазками, что получилось.
      Потом пишешь код для загрузки данных из файла. Тестируешь. Потом шлешь любым транспортом (http, web-service, e-mail, ftp и т.п.).
      Можно проверить размер файла перед отправкой (иногда ограничения могут быть по размеру), порезать при необходимости и частями отправить.
      Можно, при необходимости, реализовать асинхронную передачу. Довольно универсально получается пользоваться файлом.

      • White

        Алексей, вы можете помочь разобраться с вопросом доступа, авторизации в контексте веб-сервера + хттп-сервера в базе 1С. В «1Сных» статьях как-то этот вопрос обходят стороной. Много их перечитал на инфостате там в основном демонстрация возможностей хттп-сервисов.
        В частности меня интересует как реализована авторизация когда в заголовках запроса используют элемент «Authorization», а далее «Token….», «Basic …», «Bearer…»
        Может посоветуете ресурс где об этом можно почитать.

  11. Станислав

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

    • AlexeyDubrovin

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

  12. тов.Сухов

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

    • Dubrovin

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

  13. Andrey

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

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

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

  14. drizer

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

  15. drizer

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

    • Dubrovin

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

      • drizer

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

  16. kvt500

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

    • Dubrovin

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

  17. Aidar

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

    • Dubrovin

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

  18. 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С, из другого языка — действительно интересно. Только комментариев не хватает. Пример на интерпретаторе проверяли или компилировали ?

  19. KOT301

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

    • Dubrovin

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

      • Power_on

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

        • AlexeyDubrovin

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

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

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

  21. kurpyaev1

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

  22. a13k55

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

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

  23. Сергей

    Добрый день! При выполнении 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 (установить на сервере сертификат) и последним параметром передавать защищенное соединение.

    • Алекасндр

      Мне на платформе 8.3.9.2170 помог параметр сервиса reuseSessions=»dontuse» в default.vrd

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

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

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

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

    • Dubrovin

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

  25. Сергей

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

    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.

  26. amalaxit

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

    • Dubrovin

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

  27. Алексей

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

  28. Ulus

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

    • Dubrovin

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

  29. Нурлан

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

    • Нурлан

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

      • Dubrovin

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

        • Нурлан

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

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

        • Нурлан

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

  30. 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 Поставил эти кракозяблы в код и картиннка пришла.

  31. 1k

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

  32. 1k

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

  33. 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

  34. andrewkop85

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

      • andrewkop85

        Спустя 3 года вернулся по старой памяти к вашей статье. В очередной раз помогла уже в реальном проекте)) Спасибо!

  35. gosn1ck

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

        • Dubrovin

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

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

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

          • Владимир

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

  36. Никита

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

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

  37. Владимир

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

    • 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

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

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

  39. Denis_Denis

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

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

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

 Ознакомлен с условиями Публичной оферты и Пользовательского соглашения
 Согласен на обработку персональных данных (Политика обработки ПДн)