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.х
<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)
Специальные предложения
Общий модуль и обработки в расширение включаются, а вот остальные упомянутые в статье объекты метаданных? (2) теоретически в расширение эти объекты добавить можно, но вот использовать для публикации не имеется возможности, так как в окне публикации он не появится, по крайней мере на платформе 8.3.16. (6) Не появится в списке - не значит, что нельзя использовать. Нормально публикуется и работает из расширений. Проверено не раз, и не только на 8.3.16. И из 7 ки с использованием компоненты v7plus как настроить тоже самое было бы полезно. (0) поиск дубля не помешал бы перед тем как создавать новый элемент справочника
обработка ИзучениеPOSTЗапросов
а на картинке Изчение POSTЗапросов
для JSON наверное правильнее
HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");
К примеру сейчас обмен с 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” и т.д.
Реализация функции (в виде статического метода) в листинге ниже. Диагностическая информация выводится в консоль.
Читайте также: