Надіслати повідомлення запит з 1с 8.3.

Друк (Ctrl+P)

Другу частину можна подивитися

Загальні відомості

У версії платформи 8.3.5.1068 , опублікованій у вересні 2015 року з'явився механізм інтеграції 1С із зовнішніми програмами через технологію REST інтерфейс. Як протокол доступу платформа використовує протокол OData. Це відкритий веб-протокол для запиту та оновлення даних. Він дозволяє оперувати даними, використовуючи як запити HTTP-команди. Отримувати відповіді у версії 8.3.5.1068 можна було лише у форматі Atom/XML . Однак, починаючи з релізу 8.3.8.1652 у серпні 2017 р. з'явився другий варіант отримання даних у форматі JSON (JavaScript Object Notation) . Порівняно з XML він легко читається людьми займає менше місця. Крім цього, всі браузери мають вбудовані засоби для роботи з JSON.

Роботу з протоколом OData на платформі 1С: підприємство можна переглянути у книзі 1С: Посібники розробника у розділі 17 Механізми інтернет-сервісів, параграф 17.2.1 Стандартний інтерфейс OData.Можна також переглянути приклади розширення підтримки протоколу OData ,

Перевага використання REST інтерфейс. полягає в тому, що для отримання доступу до даних системи із зовнішнього застосування не потрібно модифікації коду прикладного рішення (наприклад, якщо прикладне рішення стоїть на підтримці). Для отримання такого доступу необхідно особливим чином опублікувати програму на веб-сервері та вказати, які конфігураційні об'єкти будуть використовуватися таким чином. Після цього сторонні системиможуть звертатися до вашої програми за допомогою запитів HTTP.

Публікація стандартного інтерфейсу OData виконується за допомогою діалогу публікації на веб-сервері (Адміністрування – Публікація на веб-сервері) та описано в книзі 1С:Підприємство 8.3. "Керівництво адміністратора".
Важливо!Для того, щоб об'єкти конфігурації стали доступними через стандартний інтерфейс OData, необхідно це дозволити за допомогою методу глобального контексту УстановитиСклад СтандартногоІнтерфейсуOData().
Механізм встановлення складу об'єктів, доступних за допомогою стандартного інтерфейсу OData, можна виконати у вигляді зовнішньої обробки. Для цього не потрібно модифікувати прикладне рішення.

Для взаємодії із зовнішнім REST- веб-сервер з 1С:Підприємства використовується наявні в платформі засоби роботи з HTTP: об'єкти HTTPЗ'єднання, HTTPЗапит та HTTPВідповідь.

У цьому циклі статтею я показуватиму приклади типових операцій, що використовують відповідний HTTP-метод;

  • Отримання даних – метод GET;
  • Створення об'єкта – метод POST;
  • Оновлення даних: метод PATCH– у цьому випадку можна вказувати лише ті властивості, які потрібно оновити; метод PUT- У цьому випадку необхідно вказувати всі властивості сутності;
  • Видалення даних – метод DELETE.

1. Приклади отримання. HTTP-метод GET

Як сервер виступатиме опублікована на веб-сервері БД з ім'ям WebBuh(Демо-база "Бухгалтерія Підприємства 3.0"). Як формат обміну даних я використовуватиму формат JSON. Докладніше про роботу з JSON написано в документації, доступній . Для отримання даних із сервера HTTP-методом GET потрібно створити об'єкт ЧитанняJSONдля послідовного читання JSON-даних із файлу або рядка. Для організації послідовного запису об'єктів та текстів на сервері HTTP-методом POST PATCH PUT потрібно створити об'єкт Запис JSON.Зазначимо, для методу DELETE не потрібне JSON.

В якості ілюстрації потокового читання і запису JSON при зверненні до REST інтерфейсу я викликатиму наступну функцію користувача загального призначення ВикликатиHTTPМетодНаСервері :

&На сервері // <Описание функции>// // Параметри: // - Рядок, що містить ім'я HTTP-методу для запиту ("POST". "PATCH", "PUT", "GET", "DELETE" // - об'єкт HTTPЗ'єднання //<АдресРесурса>- Рядок http-ресурсу, до якого буде надіслано запит HTTP. //<ОтправляемыеДанные>- Структура або відповідність, що містять дані, що надсилаються на вказану адресу для обробки // на сервер з використанням зазначеного HTTP-методу "POST" або "PATCH" або "PUT" // Значення, що повертається: // Структура відповіді сервера в залежності від HTTPМетод// Функція ДзвонитиНЕ визначено ) // Створення HTTP ЗапитЗаголовки = Новий Відповідність (); Заголовки.("Content-Type", "application/json"); ЗапитHTTP = Новий HTTPЗапит ( АдресаРесурсу, Заголовки ); // ЗаписJson толку для створення та оновлення данихЯкщо HTTPМетод = "POST" або HTTPМетод = "PATCH" або HTTPМетод = "PUT", тоді ЗаписJSON = Новий ЗаписJSON ; ПараметриJSON = Новий ПараметриЗаписиJSON(ПереносСтрокJSON.Авто,"",Істина); Запис JSON.(Параметри JSON); ЗаписатиJSON(ЗаписJSON, НадісланіДані ); // НадісланіДаніобов'язкові в цьому випадку РядокТіла = ЗаписJSON.Закрити(); ЗапитHTTP.ВстановитиТілоІзРядки(РядокТіла, Кодування тексту.UTF8, ВикористанняByteOrderMark.Невикористовувати); КінецьЯкщо; // Виклик Методу HTTPЗ'єднання ВідповідьHTTP = HTTPЗ'єднання.ВикликатиHTTPМетод(HTTPМетод, ЗапитHTTP) ; СтруктураВідповіді= Новий Структура; СтруктураВідповіді.Вставити ("КодСтану ", ВідповідьHTTP.КодСтану); // Читання JSON тільки для методу GETЯкщо HTTPМетод = "GET"Тоді Спроба Читання JSON = Новий Читання JSON ; ВідповідьСервера = ВідповідьHTTP.ОтриматиТілоЯкСтроку("UTF-8"); Читання JSON.; Відповідність = ПрочитатиJSON(ЧитанняJSON,Істина); СтруктураВідповіді.Вставити("ВідповідьСервера",Відповідність) ; СтруктураВідповіді.Вставити (" ВідповідьСервераНеРозшифрований", Відповідь Сервера); Виняток Повідомити(ОписПомилки()); Повернення Невизначено;КінецьСпроби; Концеслі; Повернення СтруктураВідповіді ; КінецьФункції // Викликати HTTPМетодНа Сервері()

Для отримання від сервера у форматі JSON при зверненні до інтерфейсу REST прикладного рішення потрібно в адресі ресурсу вказати $format=json.Або вказати MIME тип “application/json”у заголовку:

Заголовки = Новий Відповідність (); Заголовки.Вставити("Content-Type", "application/json") ; Адресаресурсу = " WebBuh/odata/standard.odata/ ?$format=json" ЗапитHTTP = Новий HTTPЗапит(АдресРесурсу, Заголовки);

Особливість глобального контексту ПрочитатиJSON(ЧитанняJSON, Істина)

  • Якщо значення другого параметра встановлено Істина, читання об'єкта JSONбуде виконано в Відповідність.Якщо встановлено Брехня, об'єкти будуть зчитуватися в об'єкт типу Структура.
  • При десеріалізації об'єктів JSON у структуру необхідно пам'ятати про вимоги до ключів структури. Якщо при десеріалізації об'єкта буде знайдено ім'я властивості, неприпустиме для ключа структури, буде викликано виняток.

1. 1 Налаштування параметрів HTTP з'єднання

Для організації клієнтської частини взаємодії із зовнішнім REST- веб-сервер, я створив "з нуля" конфігурацію клієнта на базі БСП. На цій конфігурації я створив довідник параметрів підключення (див. Рис 1)

Рис 1 Довідник налаштування параметрів HTTP з'єднання до зовнішньої ІБ через rest інтерфейс

Після натискання кнопки Перевірити відповідь сервера, викликається процедура, якою клієнт спробує отримувати відповідь сервера. Програмний кодпроцедури написано нижче:

&НаКлієнті Процедура ПеревіритиПідключення(Команда) Адреса = Об'єкт.АдресСервера; Користувач = Об'єкт.Користувач; Пароль = Об'єкт.Пароль; Ім'яБази = Об'єкт. Найменування; Порт =? (Об'єкт. Порт<>0, Об'єкт. Порт, 80); HTTPЗ'єднання = Новий HTTPЗ'єднання(Адреса,Порт,Користувач, Пароль); Адресаресурсу = Ім'яБази + "/odata/standard.odata/ $metadata "; //Виклик функції користувача СтруктураВідповіді= В викликатиHTTPМетодНа Сервері("GET", HTTPЗ'єднання,АдресРесурсу) ; Якщо СтруктураВідповіді <> Невизначено Тоді ЗагальногоПризначенняКлієнтСервер.ПовідомитиКористувачу("Код стану "+СтруктураВідповіді.КодСтану); Концеслі; КінецьПроцедури

Ціль цієї процедури – Це перевірка роботи сервісу таЧи правильно користувач ввів параметри з'єднання. Для цього достатньо виконати GET-запит:
HTTPЗ'єднання.ВикликатиHTTPМетод( "GET", ЗапитHTTP);
з використанням адреси ресурсу:
Адресаресурсу =Ім'яБази+ /odata/standard.odata/ “;
Перевірити роботи сервісу можна також у браузері з використанням
URL
http://host/WebBuh/odata/standard.odata. Внаслідок такого запиту виходить лише список сутностей. Для отримання повного описустандартного інтерфейсу OData (список доступних сутностей, їх атрибутів та функцій у вигляді XML-
документа.) необхідно виконати GET-запит з використанням параметра $metadata. URL http://host/WebBuh/odata/standard.odata/$metadata. Докладний описдокумент можна отримати за адресою http://www.odata.org/documentation/ (англійською мовою).
Отримувати відповіді можна у форматі Atom/XMLабо JSON. Коди статусів відповіді за протоколом HTTP можна переглянути Відповіді в діапазонах:

  • 100-199 - Інформаційні відповіді, що показують, що запит клієнта прийнятий та обробляється.
  • 200-299 – означають, що запит клієнта успішно опрацьовано.
  • 300-399 означає, що запит не виконано і клієнту потрібно вжити деяких дій задоволення запиту.
  • 400-499 – інформує про помилки на стороні клієнтської програми. Ці коди можуть означати, що від клієнта вимагається додаткова інформація.
  • 500-599 – інформує про помилку на стороні сервера, показує, що сервер зіткнувся з помилкою і, ймовірно, не зможе виконати запит клієнта.

1.2 Пошук об'єкта за ідентифікатором

Наступна функція призначена для пошуку довідника або документа з унікального ідентифікатора на сервері. Якщо об'єкт знайдено, функція повертає рядкове значення ідентифікатора (Ref_Key) , інакше повертає НЕ визначено.У функцію передаються такі параметри:

  • HTTPЗ'єднання – Об'єкт типу HTTPЗ'єднання
  • Ім'яПублікації – Ім'я опублікованої бази бази даних сервера
  • Елемент – ідентифікатор сутності об'єкта, наприклад, Catalog_Організаціїабо Document_- довідник Організації.
  • Ідентифікатор – Ідентифікатор об'єкта, який потрібно шукати на сервері, наприклад, Організація.УнікальнийІдентифікатор()
&На Сервері Функція ПошукОб'єктПоGUID (HTTPЗ'єднання,Ім'яПублікації,Елемент,УнікальнийІдентифікатор) GUID = Рядок(УнікальнийІдентифікатор); // Перетворимо в рядок Адресаресурсу = + Елемент+ "(guid""+ GUID+ "")?$format=json" ; СтруктураВідповіді = ВвикликатиHTTPМетодНа Сервері("GET" , HTTPЗ'єднання,АдресРесурсу) ; Якщо СтруктураВідповіді .КодСтану >= 400 Тоді //Загального призначенняКлієнтСервер.Повідомити Користувачеві(Елемент+ "Помилка" +СтруктураВідповіді.КодСтану+ //ЗагальногоПризначенняКлієнтСервер.ПовідомитиКористувачу(СтруктураВідповіді.ВідповідьСервераНеРозшифрований); Повернення невизначене; КінецьЯкщо ; Відповідність = СтруктураВідповіді. ВідповідьСервер а; Масив = Відповідність["value"]; Якщо Масив = Невизначено Тоді Повернення Відповідність ["Ref_Key"] Інакше Повернення Масив ["Ref_Key"]; КінецьЯкщо; КінецьФункції

Параметр Адресаресурсу використовується для звернення до REST-сервісу. Для перевірки роботи сервісу можна вказати ресурс у браузері таким чином

http://(АдресВебСервера)/(Ім'яПублікації)/odata/standard.odata/(Елемент)?(Параметри) де

  • АдресаВебСервера– Адреса веб-сервера, на якому опубліковано сервіс, наприклад Localhost
  • Ім'яПублікації– ім'я інформаційної базизазначене під час публікації рішення
  • /odata/standard.odata/ – Ознака звернення до стандартного інтерфейсу OData
  • Елемент – ідентифікатор ресурсу чи визначені ресурси. Наприклад, Catalog_Контрагент(guid'value').
  • Параметри- Параметри ресурсу. Використовуються, наприклад, для відбору, прийнятому для HTTP-запитів: ?ключ=значення&ключ2=значение2

1.3 Пошук об'єкта по полям пошуку

Наступна функція користувача призначена для пошуку об'єкта по полях пошуку в тому випадку, коли об'єкт за ідентифікаційним номером. Функція заперечує рядок Ref_Key –ідентифікаційний номер.

&На Сервері Функція П пошукОб'єктПолямПошуку(HTTPЗ'єднання,Ім'яПублікації, Елемент,ПоляПошуку)Умова = "";Для кожного КлючЗначення з ПоляПошуку Цикл Умова = Умова + КлючЗначення.Ключ+ "eq"" + КлючЗначення.+ "" and "; КінецьЦикл; Текст Запиту =Лев(Умова, СтрДліна(Умова)-5); // видаляємо останні 5 символів Адресаресурсу= Ім'яПублікації+ "/odata/standard.odata/" +Елемент+ "?$filter=" + Текст Запиту+ "&$format=json& $select=Ref_Key" ; //Виклик моєї користувальницької функції СтруктураВідповіді= Викликати HTTPМетодНа Сервері( "GET",HTTPЗ'єднання,АдресРесурсу);Якщо СтруктураВідповіді .КодСтану >= 400 Тоді / / Загального призначення Клієнт Сервер. Повідомити Користувачеві (Елемент + "Помилка" + Структура Відповіді. Код Стану); //ЗагальногоПризначенняКлієнтСервер.Повідомити Користувачеві(СтруктураВідповіді.ВідповідьСервераНеРозшифрований); Повернення невизначене; КінецьЯкщо; Відповідність = СтруктураВідповіді. ВідповідьСервер а; Масив = Відповідність["value" ]; Якщо Масив = Невизначено Тоді Повернення Відповідність ["Ref_Key"] Інакше Повернення Масив ["Ref_Key"]; КінецьЯкщо; КінецьФункції

Як видно з тіла процедуриП пошукОб'єктПолямПошуку, відбір починається з ключового слова$filterна адресу ресурсу. Формальний параметрПоляПошуку –це відповідність, що містить найменування та значення реквізитів.

Зазначимо, що найменування реквізитів часом очевидно. Необхідно запам'ятати, що для довідників:

  • Code – код,
  • Description – Найменування
  • DeletionMark – позначка видалення,
  • IsFolder – ознака групи,
  • Parent_Key – батько.
  • Якщо реквізит типу посилання, до його імені слід додати суфікс _Key, наприклад Контрагент_Key.

Для документів:

  • Number – номер документа,
  • Date – дата документа.

Логічні операції відбору

  • eq - Рівно; /Catalog_Міста?$filter=Найменування eq 'Головний';
  • ne - Не рівне; /Catalog_Міста?$filter=Найменування ne 'Перм';
  • gt – більше; /Catalog_Товари?$filter=Ціна gt 10;
  • ge - Більше або одно; /Catalog_Товари?$filter=Ціна ge 10;
  • lt - менше; /Catalog_Товари?$filter=Ціна lt 10;
  • le - Менше чи одно; /Catalog_Товари?$filter=Ціна le 10;
  • or - Логічне АБО; /Catalog_ Товари ?$filter= Ціна lt 10 or Ціна gt 100;
  • and - Логічне І; / Catalog _Товари?$ filter =Ціна g t 10 and Ціна l t 100;
  • not - заперечення; /Catalog_ Товари ?$filter=not (Ціна eq 10);

Зазначимо також, що значення фактичного параметра Елемент(або сутність)), який я передаю на функцію формується за таким правилом:

ПрефіксІм'я_Ім'яОб'єктКонфігурації_СуфіксІм'я.

За допомогою стандартного інтерфейсу OData можна отримати доступ до таких об'єктів ( ПрефіксІмені):

  • Довідник – Catalog;
  • Документ – Document;
  • Журнал документів – DocumentJournal;
  • Константа – Constant;
  • План обміну – ExchangePlan;
  • План рахунків - ChartOfAccounts
  • План видів розрахунку - ChartOfCalculationTypes;
  • План видів характеристик - ChartOfCharacteristicTypes;
  • Регістр відомостей - InformationRegister;
  • Регістр накопичення – AccumulationRegister;
  • Регістр розрахунку - CalculationRegister;
  • Регістр бухгалтерії - AccountingRegister;
  • Бізнес-процес - BusinessProcess;
  • Завдання – Task.

Ім'яОб'єктаКонфігурації- Властивість «Ім'я» об'єкта конфігурації так, як воно задано в конфігураторі.

СуфіксІмені- необхідний уточнення імені ресурсу, необов'язковий, може приймати такі значения:

  • Ім'я табличної частини об'єкта;
  • Ім'я віртуальної таблиціоб'єкта;
  • RowType - рядок табличної частини об'єкта;
  • RecordType – окремий запис регістру.

Параметри звернення до ресурсів

Після формування імені ресурсу слід визначити параметри звернення до ресурсу, наприклад, ?$filter= Значення &$format=json& $select= Ref_Key ,

  • $filter- відбір при отриманні даних
  • $format- вказує формат даних, що повертаються,
  • $select- перерахування властивостей сутності, які потраплять до результату запиту;
  • $metadata- повертає опис стандартного інтерфейсу OData (використовується без вказівки суфікса імені, приклад на одному із зображень вище);
  • $top- обмеження кількості записів, що повертаються;
  • $skip- прибирає з результату запиту вказану кількість записів;
  • $count- Повертає кількість записів у вибірці запиту;
  • $inlinecount=allpage(=none)- додає у результат запиту інформацію про кількість записів
  • $orderby=<Реквизит1>asc,<Реквизит2>desc- Сортування результату запиту
  • alloweOnly- Тільки дозволені (використовується без знака «$»).

1.4 Отримати масив записів регістру відомостей

Подивимося приклад отримання масив записів регістра відомості ПІБФізичнихОблич, наприклад історію зміни ПІБ фізичної особи

Ім'яПублікації = "WebBuh";Елемент = "InformationRegister_ФІОФізичних Облич"; Період = Невизначено; Дані ПосилальногоТипу= Нова структура (); Д аніПосилальногоТипу.Вставити ("ФізичнеОбличчя",ФізичнеОбличчя_Key); ДаніНЕСилковогоТипу= Нова структура (); ДаніНЕСилковогоТипу.Вставити ("ФізичнаОбличчя_Type", "StandardODATA.Catalog_ФізичніОсоби") Масив = ОтриматиНабірЗаписиРеєстраВідомостей(HTTPЗ'єднання ,Ім'яПублікації ,Елемент , Період , Вимірювання ПосилальногоТипу, Вимірювання НЕСилковогоТипу)

Тіло функції ОтриматиНабірЗаписиРегістраВідомостей, що викликається в цьому прикладі показано нижче

&На Сервері Функція ОтриматиНабірЗаписиРеєстраВідомостей(HTTPЗ'єднання ,Ім'яПублікації ,Елемент , Період =Невизначено , Вимірювання ПосилальногоТипу= Невизначено, Вимірювання НЕСилковогоТипу= Невизначено) Текст Запиту = "";Якщо період<>Невизначено Тоді Форматований період= Формат (Період "ДФ=yyyy-MM-ddTHH:mm:ss"); Текст Запиту = "Period = datetime""+ ФорматованийПеріод + """ ; КінецьЯкщо; Якщо Вимірювання ПосилальногоТипу <>Невизначено Тоді Для Кожного КлючЗначення з Вимірювання ПосилальногоТипуЦикл Запит = ? ( ЗначенняЗаповнено(Текст Запиту), ",",""); Текст Запиту = Текст Запиту+ Запитуючи + КлючЗначення.Ключ+ "=guid(""+ КлючЗначення.+ "")"; КінецьЦикла; КінецьЯкщо; Якщо Вимірювання НЕСилковогоТипу<> Невизначено ТодіДля кожного КлючЗначення з Вимірювання НЕСилковогоТипу Цикл Запитая =? ( ЗначенняЗаповнено(Текст Запиту), ",",""); Текст Запиту = Текст Запиту + Запит+ До лючЗначення.Ключ + "=" + КлючЗначення.; КінецьЦикл; КінецьЯкщо; АдресаРесурса= Ім'яПублікації + " /odata/standard.odata/" + Елемент + "("+ Текст Запиту + + ") ?$format=json"; //Виклик моєї користувальницької функції СтруктураВідповіді = ВикликатиHTTPМетодНаСервері("GET", HTTP З'єднання, Адреса Ресурсу); Якщо СтруктураВідповіді.КодСтану >= 400 Тоді/ / Загального призначення Клієнт Сервер. Повідомити Користувачеві (Елемент + "Помилка" + Структура Відповіді. Код Стану); //ЗагальногоПризначенняКлієнтСервер.Повідомити Користувачеві(СтруктураВідповіді.ВідповідьСервераНеРозшифрований); Повернення невизначене; КінецьЯкщо; Відповідність = 0

При розробці процедури надсилання на сайт інформації з 1С з версією платформи 8.3.9.2170 зіткнувся з проблемою: розробник сайту надав мені можливість записувати потрібну інформаціютільки за допомогою запиту HTTP методом PUT.

Недовго думаючи, я накидав простенький код:

З'єднання = Новий HTTPЗ'єднання ("www.mysite.ru"); Заголовки = Новий Відповідність; Заголовки["Content-Type"] = "application/x-www-form-urlencoded"; Запит = Новий HTTPЗапит("/api/order_items/93076?order_item=30", Заголовки); З'єднання. Записати (Запит);

За результатами виконання у відповідному рядку замовлення покупця на сайті повинна була проставитися кількість товару, що надійшов на склад.

Однак, як ви напевно зрозуміли, нічого не сталося. Після того, як я переконався, що на сайті помилок немає (шляхом відправки аналогічного запиту через плагін до Хрому), я запустив на своєму локальному комп'ютері web-сервер і став експериментувати.

Відразу ж з'ясувалась дивна річ: Наведений вище код генерує не PUT, а HEAD запит!

У логах апача я побачив таке:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

Я трохи здивувався (адже в керівництві було чорним по білому написано PUT), але не розгубився - адже можна викликати метод безпосередньо:

З'єднання.ВикликатиHTTPМетод("PUT",Запит);

У логах те саме:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

"Можливо, я щось не так роблю?" - Запитав я собі питання. Але в інтернеті та в мануалах не було жодних підказок. Що ж, метод наукового тику ще ніхто не скасовував. Для початку я спробував зробити так:

З'єднання.ВикликатиHTTPМетод("фивфив",Запит);

У логах отримав:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Цікаво, отже 1С замінює саме спосіб PUT (що він 1С не догодив?).

Після ще кількох спроб я прийшов до варіанта:

З'єднання.ВикликатиHTTPМетод("PUT ",Запит);

У логах отримав:

127.0.0.1 - - "PUT /api/order_items/93076?order_item=30 HTTP/1.1"

І вже цей варіант відпрацював на сайті, і всі залишилися задоволені.

Підказав коректніше вирішення проблеми: необхідно задати тіло запиту, будь-яке, навіть порожнє. Наприклад, спрацює такий варіант:

З'єднання = Новий HTTPЗ'єднання ("www.mysite.ru"); Заголовки = Новий Відповідність; Заголовки["Content-Type"] = "application/x-www-form-urlencoded"; Запит = Новий HTTPЗапит("/api/order_items/93076?order_item=30", Заголовки); Запит.ВстановитиТілоІзРядки("", КодуванняТексту.UTF8, ВикористанняByteOrderMark.НеВикористовувати); З'єднання. Записати (Запит);

І вже зовсім правильно, напевно, передавати в тілі запиту значення параметрів.

Висновок наступний: PUT запит без тіла платформа 1С вважає помилковим та замінює метод на HEAD.

Цікаво, що POST запит без тіла 1С ніяк не відстежує і не перетворює на GET, перевіряв заради спортивного інтересу.

Як сказав би всім відомий Вовочка із знаменитого анекдоту: "Де логіка?".

Сподіваюся комусь моя публікація збереже кілька годин життя у пошуках відповіді. =)))

Починаючи з другої версії 8 платформи, у користувачів та розробників з'явилася можливість використання безпосередньо у 1С http запит. При цьому програма підтримує два типи запитів:

  • POST запити;
  • GET запити.

Таким чином, був створений досить зручний інструмент для обміну даними та взаємодії з веб-сервісами та службами, що працюють через http.

GET запит

Безумовно, найпростіші приклади використання запитів краще ілюструють їх можливості, ніж багато рядків опису. Тому спробуємо:

  1. Отримаємо тіло головної сторінки нашого сайту;
  2. Відпрацюємо перенаправлення запиту;
  3. Заберемо картинку із сайту.

Отримання тіла сайту

Почнемо із простого. На Мал.

Результатом виконання цієї ділянки коду є досить великий текст, кінцевий ділянку якого відображено на Рис.2.

Рис.2

У першому рядку коду ми створюємо об'єкт з'єднання з http ресурсом. Об'єкт може містити такі властивості:

  • Сервер - рядок підключення, що містить адресу сервера;
  • Порт – це число, яке вказує на порт сервера, за замовчуванням, залежно від типу підключення, можна вказати 80 для незахищених з'єднань або 443 для захищених SSL.
  • Ім'я користувача – вказується, якщо потрібна авторизація на сервері;
  • Пароль - пароль користувача на вказаному ресурсі;
  • Проксі – може містити об'єкт типу Інтернет-проксі, вказується, коли для зв'язку з сервером використовується проксі;
  • Захищене З'єднання – за замовчуванням має значення БРЕХНЯ, перемикання в ІСТИНА вказує на використання https протоколу.

Крім цього, об'єкт HTTPЗ'єднання має свої методи, звернення до яких дозволяє більш повно описати алгоритм виконання оброблювача:

  • Викликати HTTPметод – містить два обов'язкові параметри HTTPметод і HTTPзапрос, підтримує можливість запису тіла відповіді файл, зазначений у третьому параметрі;
  • Записати – за допомогою PUT запиту надсилає дані на сервер;
  • Змінити – змінює об'єкт, опрацьовуючи PATCH запити;
  • НадіслатиДля Обробки – метод, що вказує на використання POST запиту, як і у всіх попередніх методах, обов'язково повинен містити текст запиту, так само може передавати адресу файлу відповіді для запису даних;
  • Отримати - про нього докладніше буде розказано нижче;
  • Отримати Заголовки – ще один метод, який буде використаний у статті;
  • Видалити – це запит Delite, який видаляє переданий у запиті ресурс із сервера.

Другим рядком ми створюємо запит до вибраного сайту, текст нашого звернення містить один слеш, а це означає, що ми хочемо отримати головну сторінку. Якби слідом за слешем йшов якийсь вираз, наприклад «page2» або «news», ми б отримали іншу сторінку.

Третій рядок виконує запит до сервера.

У четвертій ми показуємо результат.

Відпрацювання перенаправлення http запиту

Уявимо ситуацію, коли нам потрібно програмно отримати результат пошуку через будь-яку пошукову системуза ключом "Запити в 1с". Ділянка коду, необхідна для звернення до GOOGLE, вказана на рис.3.

Рис.3

Тут крім вже знайомих нам конструкцій присутні Заголовки та КодСтану. Розберемося з ними.

КодСтану – стандартна величина, обумовлена ​​в Request for Comments, може приймати наступні значення:

  1. Якщо все нормально повернеться значення в діапазоні від 100 до 299;
  2. У разі перенаправлення повернеться код у діапазоні від 300 до 399, у нашому випадку вдале постійне перенаправлення на ресурс визначиться кодом 301;
  3. При помилках у запиті параметр набуде значення від 400 до 499;
  4. Значення в області 500-599 вказує на проблеми із сервером.

Кожна сторінка має заголовок, у тексті якого можна виділити кілька параметрів (Рис.4):

  1. Схему підключення (все, що йде до двох слішів «//»);
  2. Адресний рядок з'єднання;
  3. Ім'я користувача та пароль;
  4. Порт та хост для підключення.

Саме цю розбивку виконує функція РозбитиРядокАдреси. Отримавши таким чином нову адресу, ми можемо зберегти сторінку на нашому комп'ютері та відкрити її у браузері за умовчанням (процедура ОтриматиСторінку).

Рис.5

Тут немає нових функцій та способів роботи із запитами, ми фактично створюємо текстовий документз тіла сайту та запускаємо сторінку у браузері.

Файл ми поміщаємо до кореня диска D і називаємо test.

Забираємо картинку із сайту

Виникає природне питання: якщо нам не потрібен весь сайт повністю, а потрібно отримати лише окремі його елементи, чи можна це зробити і як? Так можна. Код програми, що дозволяє це зробити, наведено на Рис.6

Рис.6

Як видно з малюнка, у тілі запиту у нас представлений код елемента структури сайту, який необхідно отримати. Цієї частини не було в нашому попередньому описі і на цьому моменті слід зупинитися докладніше.

Ми використовували браузер Opera для доступу до веб-сайту. У ньому є один важливий для нас інструмент, при натисканні правою кнопкоюмиші на елементі можна викликати контекстне меню, один із пунктів якого "Подивитися код елемента".

Саме завдяки йому ми можемо отримати адресу, яка буде використовуватися в запиті Рис.7.

POST-запит

На відміну від нескладних Get запитів, POST http запити мають текстове тіло, яке може зберігатися як у звичайному текстовому вигляді, і у вигляді файлів з розширенням xml, soap, json. У мережі досить багато інструментів для створення текстів запиту, які дозволяють налагоджувати та моніторити виконання тих чи інших звернень.

У 1С для того, щоб запустити запит з певним текстом, об'єкт HTTPзапит має процедуру Встановити ТілоІз рядків.



Завантаження...
Top