1с передать параметры в веб сервис

Обновлено: 05.07.2024

<Источник> (обязательный). Тип - Строка. Адрес ресурса на сервере.
<ИмяВыходногоФайла> (обязательный). Тип - Строка. Имя файла на диске, в который
помещаются данные, полученные от сервера (ответ сервера).
<Заголовки> (необязательный). Тип - Строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида <Заголовок>:<Значение>, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры Получить() более подробно:

В поле ИмяВыходногоФайла указывает имя файла на диске, в который будут сохранены данные, полученные от сервере в результате запроса. Так, например, если сервер возвращает список пользователей в формате XML, то на диск в указанный файл будет сохранен XML файл со списком пользователей.

О заголовках более подробно будет сказано ниже.

Так же, при запросе к веб-серверу зачастую передаются дополнительные данные (параметры) для этого запроса. Параметры от адреса источника отделяются символом "?". Каждый параметр задается в формате <Имя_Параметры>=<Значение_Параметры>. Параметры от адреса источника отделяются символом "?". Сами же параметры отделяются друг от друга символом "&". В результате строка адреса источника может выглядеть следующим образом: getUsers.php?owner_id=263544&count=100.

Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х

Все заголовки разделяются на четыре основных группы:

Поле АдресРесурса аналогично полю Источник процедуры Получить(), т.е. указывается строка с адресом запроса, идущая после имени домена и символа "/".

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

О заголовках было упомянуто выше. Напомню лишь, что для метода POST обычно указываются заголовки Content-Type и Content-Length. В качестве параметра заголовка Content-Length указывается размер файла-источника, преобразованный с помощью функции XMLСтрока().

Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х

<?xml version="1.0" encoding="UTF-8"?>
<request>
<user_id>ID_Пользователя</user_id>
<post_id>ID_Материала</post_id>
<message>Текст_Комментария</message>
</request>

где:
<ID_Пользователя> - id пользователя на сайте, от имени которого добавляется комментарий;
<ID_Материала> - id материала на сайте, к которому добавляется комментарий;
<Текст_Комментария> - текст комментария.

Предположим, что нам уже известны id пользователя и материала и они хранятся в переменных user_id и post_id. Ниже приведен пример, решающий нашу задачу.
Код 1C v 8.х

Bounday можно сформировать, например, таким образом
Код 1C v 8.х

Все данные отделяются друг от друга разделителем boundary. Начинать разделитель нужно с "--":
Код

--<boundary>
Content-Disposition: form-data; name="<имя_переменной>"
<пустая_строка>
<значение_переменной>
Для отправки файла необходимо еще добавить тип и имя файла:

--<boundary>
Content-Disposition: form-data; name="<имя_переменной>"; filename="<имя_файла>"
Content-Type: <тип_файла> (например image/jpeg или text/plain)
<пустая_строка>
<данные_файла>

В конце данных нужно закрыть разделитель, добавили в конце разделителя "--", т.е. вид будет "--<boundary>--".

Итак, например, нам нужно передать на веб-сервер текстовый файл через параметр "text", его описание через параметр "desc" и id пользователя через параметр "uid", для которого будет загружен наш файл.

Предположим, что файл содержит следующий текст:
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!

Описание должно содержать "Стих А.С. Пушкина", а id пользователя равно "0123456". Тогда файл должен быть сформирован следующим образом (для упрощения предположим, что bounday мы уже сформировали и он равен "ccf8111910")
Код

--ccf8111910
Content-Disposition: form-data; name="uid"

0123456
--ccf8111910
Content-Disposition: form-data; name="desc"

Стих А.С. Пушкина
--ccf8111910
Content-Disposition: form-data; name="text"; filename="stih.txt"
Content-Type: text/plain

Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
--ccf8111910--

А теперь перейдем непосредственно к 1С. Пусть у нас будет форма с реквизитами "Пользователь", "Описание" и "ИмяФайла". Реализуем отправку данных, описанным выше способом
Код 1C v 8.х

Передача текстовых файлов таким способом проблем не вызывает. Сложнее дело обстоит с файлами, содержащими двоичные данные (изображения, архивы и т.п.). Все дело в том, что в 1С просто нет методов для чтение двоичных файлов в строку. Если мы делаем обмен со своим сайтом, которые сами и разрабатывали, то можно просто преобразовать файл в строку Base64 при помощи процедуры Base64Строка(), а на стороне сервера преобразовать строку Base64 обратно.
Код 1C v 8.х

А как же быть если мы загружаем файл на сторонний сервер, который принимает файл как есть без преобразование его в строку Base64(). В это случае можно пойти на хитрость. В 1С есть процедура ОбъединитьФайлы(), которая объединяет несколько файлов на диске в один результирующий файл
Код 1C v 8.х
<ИменаЧастей> (обязательный). Тип - Массив. Массив имен частей файлов, которые
требуется объединить. Объединение будет происходить в порядке, в котором заданы
имена файлов в массиве.
<ИмяРезультирующегоФайла> (обязательный). Тип - Строка. Имя файла, который будет
создан в результате объединения файлов.
Т.е. мы можем сформировать текстовый файл с запросом, объединить его с файлом(-ами), которые необходимо передать на веб-сервер и передать уже файл, получившийся в результате объединения исходных файлов. Ниже демонстрируется процесс передачи двух zip архивов на сервер с дополнительными параметрами user_id и post_id.
Код 1C v 8.х

Ну вот, вроде бы, и все, что я хотел рассказать о способах передачи файлов и данных на веб-сервер из 1С. Если что-то не понятно, что-то хотите уточнить или нашли ошибки - пишите в комментариях.
Автор: Павел

Для чего это может быть нужно. Например, нам нужно получить информацию не о всей номенклатуре, а только о той номенклатуре, у которой определенный штрих код.

-Перейдем на закладку «Шаблоны»

-Добавим новый шаблон. Назовем его «ИзучениеПередачиПараметров»

-Придумаем шаблон, например, «get_products_barcode»

До этого момента мы с вами повторили действия предыдущего занятия.


Замечательно. Но куда этот параметр деть, куда его приложить?

А вот куда. Мы придумали имя шаблона « get _ products _ barcode », так вот после него и записывается параметр вот так, / get _ products _ barcode /< barcode >. Мы в шаблоне указали параметр.


-В общем модуле «ОбщегоНазначения» создадим новую функцию, которая будет возвращать JSON строку с данными по номенклатуре, в зависимости от параметра штрих кода.

Функция будет называться «ПолучитьНоменклатуруПоШтрихкоду»

Эта функция находится в ОбщиеМодули - ОбщегоНазначения


Данная функция находится тут


Меню - Администрирование - Публикация на веб-сервере


-Открываем браузер и собираем строку запроса. Как мы помним из прошлого урока строка собирается так:

Ip адрес / имя_публикации / hs / корневой_каталог / шаблон/

localhost / my _ name / hs / products / get _ products / < barcode >– ТОЛЬКО ВМЕСТО ФИГУРНЫХ СКОБОК, КОНКРЕТНОЕ ЗНАЧЕНИЕ ШТРИХ КОДА, НАПРИМЕР 20000000583067



Поставим задачу:

Подготовим базу источник.

-Создаем чистую информационную базу.

-Назовем ее «БазаИсточник»

-Добавляем в нее несколько объектом метаданных:

Реквизит «Атрикул» тип строка 25

- Обработка «Изучение POST Запросов»


Подготовим базу приемник

-Создаем чистую информационную базу

-Назовем ее «БазаПриемник»

-Добавим в нее несколько объектов метаданных:

Реквизит «Атрикул» тип строка 25


-Переходим на закладку «Шаблоны URL »

- Добавляем новый шаблон «ЗагрузкаНоменклатуры»

-Создадим шаблон, назовем его « product _ json »

- Добавим новый метод «ЗагрузкаНоменклатурыJSON»



Localhost – IP адрес

post_test – имя публикации

post – корневой каталог

Переходим в базу источник.

-Открываем обработку «Изучение POST Запросов»

-Создадим форму. На форме разместим кнопку «Перенести номенклатуру JSON »


-Отправляем данные на сервер. (пример кода)

Еще раз. Для того чтобы передать данные на сервер, надо эти данные поместить в тело POST запроса. В заголовке необходимо указать какого типа эти данные.

-Открываем базу источник в режиме предприятия и добавляем в справочник «Номенклатура» несколько элементов.


Базу источник мы подготовили!

Переходим в базу приемник

- Добавляем общий модуль «ОбщегоНазначения»

-В нем описываем две процедуры

-Описываем в нем следующий код

Базу приемник мы подготовили.

Запускаем обработку из базы источник. Нажимаем на кнопку. И в базе приемнике создается номенклатура.



Видео инструкция тут:

Там же, вы сможете скачать файлы конфигурации источника и приемника.

Итак, мы решили поставленную задачу.

При реализации данного функционала была использована платформа 1С:Предприятие 8.3 (8.3.12.1567)

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Подскажите пож-ста, можно ли все это реализовать в виде расширения, например к БП 3?
Общий модуль и обработки в расширение включаются, а вот остальные упомянутые в статье объекты метаданных? (2) теоретически в расширение эти объекты добавить можно, но вот использовать для публикации не имеется возможности, так как в окне публикации он не появится, по крайней мере на платформе 8.3.16. (6) Не появится в списке - не значит, что нельзя использовать. Нормально публикуется и работает из расширений. Проверено не раз, и не только на 8.3.16. И из 7 ки с использованием компоненты v7plus как настроить тоже самое было бы полезно. (0) поиск дубля не помешал бы перед тем как создавать новый элемент справочника

обработка ИзучениеPOSTЗапросов
а на картинке Изчение POSTЗапросов

для JSON наверное правильнее
HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");

(10)Чаще всего если сервис сторонний то разворачивают без этого заголовка.
К примеру сейчас обмен с API IIKO делаю, там этот момент не документирован, но без этого заголовка кушать запросы отказывается.

Технически, можно передать данные и создать объект и GET запросом, передав нужные значения в параметрах, т.к. GET-запрос не имеет тела. Но это, конечно, извращение, да и размер данных ограничен максимальной длинной URL.

А передать данные в теле запроса можно и методами PATCH, PUT, а не только POST.

Так, распространённая практика при создании REST API использовать POST для создание объекта, а PUT/PATCH для его изменения (метод DELETE, соответственно, используется для удаления).

А вообще, все эти методы используются на усмотрение программиста. Встречался с таким, что для всех запросов использовался только POST (и для получения данных, и для передачи).

По поводу заголовка Content-Type. Вы указываете text/plain, а передаёте json (Content-Type: application/json). А если учесть, что база-приёмник ни как этот заголовок не использует, то его вообще можно не передавать.

Обмен данными с конфигурацией через веб-сервисы

Внимание! Данный функционал доступен в "Библиотеке стандартных подсистем", начиная с версии 2.3.1.62.

Для обмена данными через формат EnterpriseData у конфигураций, использующих "Библиотеку стандартных подсистем", есть два веб-сервиса:

  • EnterpriseDataUpload – упрощенный вариант для загрузки данных в информационную базу из сторонних приложений. Не требует специальных настроек на стороне конфигурации (кроме развертывания собственно веб-сервиса); однонаправленный обмен данными – ТОЛЬКО импорт данных в информационную базу.
  • EnterpriseDataExchange – для двустороннего обмена данными между конфигурацией и сторонним приложением. Для работы с ним необходима настройка обмена данными на стороне конфигурации.

Собственно задача обмена данными включает в себя две подзадачи:

  • Составление корректного XML-файла в формате EnterpriseData,
  • Вызов веб-методов в правильной последовательности.

Особенности работы методов веб-сервисов

Большинство методов обоих веб-сервисов имеют выходной параметр – строку ErrorMessage. В случае если внутри конфигурации произошла ошибка, связанная с бизнес-логикой – в эту строку будет записана информация об этой ошибке. Если ошибок в процессе работы метода не было – в строку ErrorMessage будет помещена пустая строка. Если же в процессе работы метода возникла системная ошибка (например, на стороне конфигурации не удалось разархивировать полученный архив) – веб-метод сгенерирует исключение (exception).

Большинство методов обоих веб-сервисов возвращают строки, но в текущей версии возвращаемые строки всегда пустые (кроме EnterpriseDataUpload.PutDataActionResult – он возвращает статус обработки данных на стороне конфигурации – “Active”, “Completed” либо “Failed”).

Что нужно для работы

На стороне конфигурации

На стороне конфигурации должны быть развернуты веб-сервисы EnterpriseDataUpload и EnterpriseDataExchange соответствующих версий (в данном случае была использована версия 1.0.1.1). При открытии этих двух URL-адресов в браузере (нужно подставить правильное для вашей инсталляции «1С:Предприятия» имя веб-сервера и публикации):

должны выводиться WSDL-описания сервисов:


  • В Solution Explorer в контекстном меню узла References выбрать команду Add Service Reference.
  • В нижнем левом углу появившегося диалога нажать кнопку Advanced.
  • В нижнем левом углу появившегося диалога нажать кнопку Add Web Reference.

Использовалась среда разработки Eclipse 4.4.2. Для генерации кода по WSDL файлов веб-сервисов применялась утилита wsdl2java из фреймворка Apache CXF 2.7.16.

Простой обмен данными с конфигурациями с помощью формата EnterpriseData

Объект может содержать в себе ссылки на другие объекты (например, документ «Акт выполненных работ» может содержать в себе одну или несколько ссылок на номенклатуру). В этом случае, если мы импортируем данные в информационную базу, все объекты, на которые мы ссылаемся из «родительского» объекта, должны либо уже существовать в системе, либо их описание должно содержаться в том же XML файле.

Если нам необходимо удалить какой-то объект, в коллекцию Body надо добавить элемент типа «УдалениеОбъекта», и в этом элементе сослаться на удаляемый объект (см. описание типа «УдалениеОбъекта» в схеме EnterpriseData_X_Y_Z.xsd).

С помощью формата EnterpriseData нам доступны операции создания, обновления и удаления объектов. На данный момент для корректной загрузки данных в типовые решения все объекты должны содержать заполненный элемент «Ссылка» из элемента «Ключевые свойства» (GUID в форме строки). Это первичный ключ объекта. Конфигурации ведут себя следующим образом:

  • Если в системе нет объекта с ключом из поля «Ссылка» - создается новый объект.
  • Если в системе уже есть объект с ключом из поля «Ссылка» - существующий объект обновляется новыми данными, пришедшими в XML.
  • Если пришел элемент типа «УдалениеОбъекта» - объект с соответствующим ключом удаляется из системы.

Веб-сервис EnterpriseDataUpload

EnterpriseDataUpload – интерфейс исключительно для импорта данных в формате EnterpriseData в конфигурацию из сторонних приложений. Условия задачи: у нас есть XML файл с данными в формате EnterpriseData, надо передать его в конфигурацию и убедиться в том, что на стороне конфигурации данные успешно получены.

Алгоритм работы следующий:

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

Реализуем функцию, которая принимает такие входные параметры:

  • URL Веб-сервиса,
  • Имя пользователя для соединения с Веб-сервисом,
  • Пароль.

Путь до архивированного файла с данными. Если архив умещается в одном файле – это имя файла с полным путем, включая расширение (например, “C:\Exchange\data.zip”). Если же архив разбит на несколько частей, то это будет имя любого из файлов без расширения и точки (например, “C:\Exchange\data”). Предполагается, что это последовательность файлов с расширениями “.001”, “.002” и т.д.

Реализация функции (в виде статического метода) в листинге ниже. Диагностическая информация выводится в консоль.

Читайте также: