Buyurtmalarni qabul qilish uchun 1c 8.3 post so'rovi. http so'rovini qayta yo'naltirish bilan ishlash

Asosiy elektron hujjat aylanish tizimi (EDF) sifatida foydalanish rejalashtirilgan 1C (ishlab chiqish va konfiguratsiya autsorsing qilingan) va PHP (Symfony) da yozilgan B2B tizimi (ichki ishlanma) o'rtasida ma'lumotlarni uzatish bo'yicha vazifa paydo bo'ldi. kompaniyalarga birlamchi ma'lumotlarni kiritish funktsiyalarini bajaradi.

Menda B2B ni boshqa B2B bilan integratsiyalash tajribasi bor edi. G'oya cURL yordamida JSON-ni uzatish edi. Keyin Oracle-ga asoslangan Borlas tizimini integratsiya qilish vazifasi paydo bo'ldi, bu erda ham ushbu yondashuv qo'llanildi. Biroq, Oracle tomonida ular o'zlarining paketlaridan foydalanishdi - PHPdagi cURL analogi (agar qiziqish bo'lsa, men uni yangi maqolada tasvirlab bera olaman).

Men bilganimdek, 1C 8.2 GET va POST so'rovlarini ham yuborishi mumkin. Agar hamma narsa allaqachon sozlangan va boshqa tizimlar bilan ishlayotgan bo'lsa, u bu erda ham ishlashi kerak deb o'yladim. JSON 1C ishlab chiquvchilari tomonidan rad etildi, chunki format noo'rin va ular faqat XMLni tan oladilar. Bu bizga maʼlumotlar uzatishning minimal miqdorini beradi, lekin biz aslida juda koʻp maʼlumotlarni oldik, degan sharhlar rad etildi. Natijada biz 2 ta XML-ga asoslangan tizimlarni tayyorlashni boshladik.

O'z navbatida men 1C dan so'rov qabul qiluvchini yozdim va natijalarni qaytardim. POST-da o'zgaruvchini qabul qilish funktsiyasi, unda 1Sniki XML o'rnini bosishi kerak edi.
Format taxminan quyidagicha:

123ABC456// avtorizatsiya kaliti oxirgi_buyurtmalarni olish// ular bajarmoqchi bo'lgan operatsiya 4000// ular tanlamoqchi bo'lgan yozuvlar chegarasi

Shartlar bo'yicha allaqachon tanlangan yozuvlarni qaytaradigan va XML ni yaratadigan ishlov beruvchi:

1 O.P.S. 4853352 01.01.2013 1 b2b dan yuklangan SNILS 999999999 Mijozning to'liq ismi Mixaylov Mixail Evgenievich Ariza berilgan sana 01.01.2013 ...

Ma'lumotlar faqat HTTPS ulanishi orqali uzatilishi mumkin.

Bir qarashda hamma narsa oddiy ko'rinadi, ammo jarayonda bir nechta muammolar paydo bo'ldi:
1) autsorserlar bunday so'rovlar bilan tanish emasliklari haqida xabar berishdi va eski isbotlangan sxemani taklif qilishga harakat qilishdi:
1. B2B dan faylni import qilish,
2. 1C ga yuklash,
3. Qayta ishlash mumkin bo'lgan, 1C dan nima bo'lmagani ko'rsatilgan faylni eksport qiling,
4. B2B ga import qilish,
5. va eng boshidan ...
Sxema rad etildi, chunki u tez va inson aralashuvisiz va hech qanday "tugmalar"siz bajarilishi kerak edi.

Keyin ular kod misolini so'rashdi. Men Internetda quyidagi misolni qidirib topdim:

Server = "test.com"; Port = "443"; HTTPTry = Yangi HTTPConnection(Server, Port, True); Aks holda HTTP = Yangi HTTP ulanishi (Server, Port); endIf; ScriptAddress = "/shlyuz/GetData1C/"; HTTP.SendForProcessingga urinish (SendFileName, ScriptAddress, ResponseFileName, HTTPHeader); Istisno hisoboti ("Ulanishga urinish muvaffaqiyatsiz tugadi: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "Ulanishga urinish muvaffaqiyatsiz tugadi: " + ErrorDescription()); EndIf Qaytish; EndAttempt;

Serverga ma'lumotlar kela boshladi, lekin u bo'sh edi, ya'ni GET va POST bo'sh edi. Men jurnallarga yozuv qo'shdim va bu haqda muvaffaqiyatli unutdim. 4 oydan so'ng menga shoshilinch vazifa berildi - integratsiyani natijaga olib kelish (ko'p vaqt o'tdi, 1C ishlab chiquvchilari ishlamoqda va ishlamoqda, ammo hech narsa javob bermaydi). Ular men uchun 1C ni o'rnatdilar va men aylana boshladim.

Birinchidan, nima bo'layotganini tushunish uchun Fiddlerni o'rnatishga qaror qildim. Men ulanish HTTP orqali ekanligini va keyin server HTTPS ga yo'naltirilganligini payqadim. Shu sababli ma'lumotlar bo'sh deb taxmin qildim. Men uni Chrome'da qayta ishlab chiqarishga harakat qildim va POST so'rovidagi ma'lumotlar qayta yo'naltirish paytida yo'qolganligi haqidagi tasdiqni oldim.

HTTP orqali ishlashga ruxsat berishning iloji yo'qligi sababli, men nima uchun ekanligini o'rganishni boshladim, chunki quyidagilar ko'rsatilgan:

HTTP = Yangi HTTPConnection (Server, Port, True); “True” parametri HTTPS dan foydalanishni bildiradi va keyin maʼlum boʻldiki, HTTP = Yangi HTTPConnection(Server, Port);

Natijada, bu "Aks holda" chiqarib tashlandi va men sertifikat noto'g'ri degan xatolik oldim. Sertifikat o'z-o'zidan imzolangan. Integratsiyani rivojlantirish PROD serveridan farqli o'laroq, rasmiy ravishda "Thawte SSL CA" sertifikati sotib olingan ichki serverlarda amalga oshirildi. Sertifikatni barcha mumkin bo'lgan do'konlarga import qilish natija bermadi.

Resurslarni qidirish 1C o'zining ildiz sertifikatlariga ega ekanligiga olib keldi va ular asosida u allaqachon boshqalarni tekshiradi. Ular 1C joylashgan "bin" papkasida joylashgan "cacert.pem" faylida test shaklida. Import ma'lum bo'lganidek oddiy emas.

Birinchidan, biz kerakli sertifikatni faylga eksport qilishimiz kerak (u mening shaxsiy xotiramda allaqachon mavjud edi). “certmgr.msc” ni ishga tushirib, sertifikatni topib, uni *.cer fayliga eksport qilamiz.

C:\OpenSSL-Win64\bin>openssl x509 -inform der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 OGOHLANTIRISH: konfiguratsiya faylini ochib bo'lmaydi: /usr/local/ ssl/openssl.cnf MD5 Barmoq izi=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
Biz MD5 ni saqlaymiz, bizga kerak bo'ladi.
Keyin, "cacert.pem" faylini oching.
Biz eng pastga tushamiz va birinchi navbatda MD5 ni, so'ngra "fiddler.pem" faylida chiqqan barcha tarkibni qo'shamiz.
Faylni saqlang.
Biz 1C ni qayta ishga tushiramiz (ehtimol kerak emas, lekin bu men uchun ishlamadi, shuning uchun men hamma narsani qayta ishga tushirdim.

1C-dagi manba faylga quyidagi shakl berilgan:

Protsedura SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefined then Report("Almashtirish sozlamalarida ko'rsatilgan serverga ulanib bo'lmadi! Qayta ishlash to'xtatildi!"); Aks holda Source = FileAddress; endIf; FileName = FileResult; PostFileName = PostFile; PostFile = Yangi fayl (PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); Sarlavha = Yangi moslik(); Headers.Insert("Content-Type", "application/x-www-form-urlencoded"); Headers.Insert("Content-Lenght", SubmissionFileSize); Urinish.SendForProcessing(PostFileName, Source, FileName, Headers); Istisno hisoboti (ErrorDescription()); EndAttempts EndProcedures funktsiyasi GetHTTPConnection() Export AttemptConnection = Yangi HTTPConnection(HTTPServer,"443",True); Istisno hisoboti (ErrorDescription()); Ulanish = Aniqlanmagan; EndAttempt; Qayta ulanish; EndFunctions protsedurasi OnOpen() HTTPServer = "test.com"; FileAddress = "/shlyuz/GetData1C"; PostFile = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; Jarayonning oxiri

Tugmani bosgandan so'ng HTTPS orqali so'rov yuborildi va chiqish sifatida to'g'ri XML qabul qilindi.

Men 1C HTTPS orqali qanday ishlashini, juda ko'p materiallarni qidirdim, lekin o'z-o'zini imzolash sertifikati yordamida qanday ishlashni topa olmadim.

1C dan saytga 8.3.9.2170 platforma versiyasi bilan ma'lumot yuborish tartibini ishlab chiqishda men muammoga duch keldim: sayt ishlab chiqaruvchisi menga PUT usulidan foydalangan holda faqat HTTP so'rovi yordamida kerakli ma'lumotlarni yozib olish imkoniyatini berdi.

Ikki marta o'ylamasdan, men oddiy kodni chizdim:

Ulanish = Yangi HTTPConnection("www.mysite.ru"); Sarlavhalar = Yangi moslik; Sarlavhalar["Content-Type"] = "application/x-www-form-urlencoded"; So'rov = Yangi HTTPRequest("/api/order_items/93076?order_item=30", Sarlavhalar); Connection.Write(So'rov);

Amalga oshirish natijalariga ko'ra, omborga olingan tovarlar miqdori veb-saytdagi xaridor buyurtmasining tegishli qatoriga kiritilishi kerak edi.

Biroq, siz allaqachon tushunganingizdek, hech narsa sodir bo'lmadi. Saytda xatolik yo'qligiga ishonch hosil qilganimdan so'ng (Chrome plagini orqali shunga o'xshash so'rov yuborish orqali), men uni o'z sahifamda ishga tushirdim. mahalliy kompyuter veb-server va tajriba o'tkazishni boshladi.

G'alati narsa darhol aniq bo'ldi: Yuqoridagi kod PUT emas, balki HEAD so'rovini yaratadi!

Apache jurnallarida men quyidagilarni ko'rdim:

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

Men biroz hayron bo'ldim (oxir-oqibat, qo'llanmada PUT qora va oq rangda yozilgan), lekin men adashmaganman - siz to'g'ridan-to'g'ri usulga qo'ng'iroq qilishingiz mumkin:

Connection.CallHTTPmethod("PUT",So'rov);

Jurnallar xuddi shu narsani ko'rsatadi:

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

"Balki men noto'g'ri ish qilyapmanmi?" - Men o'zimga savol berdim. Ammo Internetda yoki qo'llanmalarda hech qanday maslahat yo'q edi. Xo'sh, hali hech kim ilmiy poking usulini bekor qilmagan. Boshlash uchun men buni qilishga harakat qildim:

Connection.CallHTTPmethod("fyvfyv",So'rov);

Men olgan jurnallarda:

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

Qizig'i shundaki, bu 1C PUT usulini o'rnini bosadi (nima uchun 1C yoqmadi?).

Yana bir necha urinishlardan so'ng men shunday xulosaga keldim:

Connection.CallHTTPmethod("PUT",So'rov);

Men olgan jurnallarda:

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

Va bu variant allaqachon saytda ishlagan va hamma xursand edi.

U muammoni yanada to'g'ri hal qilishni taklif qildi: siz so'rov tanasini, har qanday tanani, hatto bo'sh ham belgilashingiz kerak. Masalan, bu variant ishlaydi:

Ulanish = Yangi HTTPConnection("www.mysite.ru"); Sarlavhalar = Yangi moslik; Sarlavhalar["Content-Type"] = "application/x-www-form-urlencoded"; So'rov = Yangi HTTPRequest("/api/order_items/93076?order_item=30", Sarlavhalar); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(So'rov);

Va, ehtimol, so'rovning asosiy qismiga parametr qiymatlarini o'tkazish juda to'g'ri.

Xulosa quyidagicha: 1C platformasi tanasi bo'lmagan PUT so'rovini noto'g'ri deb hisoblaydi va usulni HEAD bilan almashtiradi.

Qizig'i shundaki, 1C POST so'rovini tanasiz kuzatmaydi va uni GETga aylantirmaydi, men uni zavqlanish uchun tekshirdim.

Taniqli Vovochka mashhur hazildan aytganidek: "Mantiq qani?"

Umid qilamanki, mening nashrim javob izlashda kimdir hayotining bir necha soatini saqlab qoladi. =)))

Chop etish (Ctrl+P)

Ikkinchi qismini tomosha qilishingiz mumkin

Umumiy ma'lumot

Platforma versiyasida 8.3.5.1068 , 2015 yil sentyabr oyida nashr etilgan, 1C bilan integratsiya qilish mexanizmi tashqi dasturlar texnologiya orqali REST interfeysi. Platforma kirish protokoli sifatida OData protokolidan foydalanadi. Bu ma'lumotlarni so'rash va yangilash uchun ochiq veb-protokol. Bu HTTP buyruqlari yordamida so'rovlar sifatida ma'lumotlarni boshqarish imkonini beradi. 8.3.5.1068 versiyada javoblarni faqat formatda olish mumkin edi Atom/XML . Biroq, 2017 yil avgust oyida 8.3.8.1652 versiyasidan boshlab, JSON (JavaScript Object Notation) formatida ma'lumotlarni qabul qilish uchun ikkinchi variant paydo bo'ldi. . XML bilan solishtirganda, u odamlar tomonidan o'qilishi oson va kamroq joy egallaydi. Bundan tashqari, barcha brauzerlarda JSON bilan ishlash uchun o'rnatilgan vositalar mavjud.

OData protokoli bilan 1C: Enterprise platformasida ishlashni 1C kitobida topish mumkin: Dasturchilar uchun qo'llanma 17-bobda. Internet xizmatlarining mexanizmlari, paragraf 17.2.1 Standart OData interfeysi. OData protokolini qo'llab-quvvatlashni kengaytirish misollarini ham ko'rishingiz mumkin,

Foydalanishning afzalligi REST interfeysi. tashqi ilovadan tizim ma’lumotlariga kirish uchun dastur yechimi kodini o‘zgartirish talab qilinmaydi degan xulosaga keladi (masalan, agar ilova yechimi qo‘llab-quvvatlansa). Ushbu ruxsatni olish uchun siz ilovani veb-serverga ma'lum bir tarzda nashr qilishingiz va shu tarzda qaysi konfiguratsiya ob'ektlaridan foydalanishni belgilashingiz kerak. Uchinchi tomon tizimlari HTTP so'rovlari yordamida ilovangizga kirishi mumkin.

Standart OData interfeysini nashr qilish veb-serverdagi nashr qilish dialog oynasi yordamida amalga oshiriladi (Ma'muriyat - nashr qilish veb-server) va 1C: Enterprise 8.3 kitobida tasvirlangan. "Administrator uchun qo'llanma".
Muhim! Konfiguratsiya ob'ektlariga standart OData interfeysi orqali kirish mumkin bo'lishi uchun bu global kontekst usuli yordamida yoqilgan bo'lishi kerak. Standart InterfaceOData() tarkibini o'rnatish.
Standart OData interfeysi yordamida mavjud bo'lgan ob'ektlar tarkibini o'rnatish mexanizmi shaklda amalga oshirilishi mumkin tashqi ishlov berish. Bu dastur yechimini o'zgartirishni talab qilmaydi.

1C: Enterprise dan tashqi REST veb-server bilan ishlash uchun biz HTTP bilan ishlash platformasida mavjud vositalardan foydalanamiz: ob'ektlar HTTPConnection, HTTPRequest va HTTPResponse.

Ushbu maqolalar seriyasida men mos keladigan HTTP usulidan foydalangan holda odatiy operatsiyalar misollarini ko'rsataman;

  • Ma'lumotlarni qabul qilish - usul OLISH;
  • Ob'ektni yaratish - usul POST;
  • Ma'lumotlarni yangilash: usul PATCH- bu holda siz faqat yangilanishi kerak bo'lgan xususiyatlarni belgilashingiz mumkin; usuli PUT– bunda sub’ektning barcha xususiyatlarini ko‘rsatish zarur;
  • Ma'lumotlarni o'chirish - usul OʻCHIRISH.

1. Ma'lumotlarni yig'ish misollari. HTTP GET usuli

Server veb-serverda nomi bilan chop etilgan ma'lumotlar bazasi bo'ladi WebBuh(“Enterprise Accounting 3.0” demo ma’lumotlar bazasi). Men JSON formatini ma'lumot almashish formati sifatida ishlataman. JSON bilan ishlash haqida ko'proq ma'lumot mavjud hujjatlarda yozilgan. HTTP GET usuli yordamida serverdan ma'lumotlarni olish uchun siz ob'ekt yaratishingiz kerak JSON o'qilmoqda fayl yoki satrdan JSON ma'lumotlarini ketma-ket o'qish uchun. HTTP POST PATCH PUT usuli yordamida serverdagi ob'ektlar va matnlarni ketma-ket yozib olishni tashkil qilish uchun siz ob'ekt yaratishingiz kerak. JSON yozuvi. E'tibor bering, DELETE usuli JSON-ni talab qilmaydi.

REST interfeysiga kirishda JSON-ni o'qish va yozish jarayonini tasvirlash uchun men quyidagi maxsus funktsiyani chaqiraman umumiy maqsad HTTPMethodOnServerga qo'ng'iroq qiling :

&Serverda // <Описание функции>// // Variantlar: // - so'rov uchun HTTP usuli nomini o'z ichiga olgan satr ("POST"."PATCH", "PUT", "GET", "DELETE" // - HTTPConnection obyekti //<АдресРесурса>- HTTP so'rovi yuboriladigan http resursining qatori. //<ОтправляемыеДанные>- Qayta ishlash uchun belgilangan manzilga yuborilgan ma'lumotlarni o'z ichiga olgan tuzilma yoki moslik // serverda ko'rsatilgan HTTP usuli "POST" yoki "PATCH" yoki "PUT" // Qaytish qiymati: // server javobining tuzilishiga qarab. HTTP usuli// Funktsiya HTTPMethodOnServerga qo'ng'iroq qiling (HTTPmethod, HTTPConnection, ResourceAddress, SentData = Aniqlanmagan) // HTTP so'rovini yarating Sarlavhalar = new Match(); Sarlavhalar. Insert("Tarkib turi", "ilova/json"); HTTP so'rovi = yangi HTTP so'rovi ( Resurs manzili, sarlavhalar ); // Ma'lumotlarni yaratish va yangilash uchun Json yozing Agar HTTPMethod = "POST" yoki HTTPMethod = "PATCH" yoki HTTPMethod = "PUT" bo'lsa, JSON Record = New JSON Record ; ParametersJSON = Yangi ParametersRecordsJSON(Line WrapJSON.Auto,"",True); RecordJSON.SetString(ParametersJSON); WriteJSON(WriteJSON, Yuborilgan ma'lumotlar ); // Yuborilgan ma'lumotlar bu holda LineForBody = talab qilinadi RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, TextEncoding.UTF8, FoydalanishByteOrderMark. Foydalanmang); endIf; // HTTPConnection usulini chaqiring ResponseHTTP = HTTPConnection.CallHTTPmethod(HTTPmethod, HTTPRequest) ; Javob tuzilishi= Yangi tuzilma; Javob tuzilishi.Insert("StatusCode", ResponseHTTP.StatusCode); // JSONni faqat GET usuli uchun oʻqing Agar HTTPMethod="GET" Keyin TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Moslik = ReadJSON(ReadJSON, rost); Response Structure.Insert("ServerResponse",Xat yozish) ; Javob tuzilishi.Kiritmoq (" Server javobi shifrlanmagan", ServerResponse); Istisno Hisobot (Xato tavsifi()); Qaytish aniqlanmagan; EndAttempt; EndIf; Qaytish Javob tuzilishi ; EndFunction // HTTPMethodOnServer() ga qo'ng'iroq qiling

Serverdan qabul qilish uchun JSON formati dastur yechimining REST interfeysiga kirishda siz manba manzilini ko'rsatishingiz kerak $format=json. Yoki MIME turini belgilang "ilova/json" sarlavhada:

Sarlavhalar = new Match(); Sarlavhalar.Insert("Tarkib turi", "ilova/json") ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" RequestHTTP = Yangi HTTPRequest (Resurs manzili, sarlavhalar);

Global kontekstning xususiyati ReadJSON(ReadJSON, rost)

  • Agar ikkinchi parametr True ga o'rnatilgan bo'lsa, ob'ektni o'qing JSON yilda yakunlanadi Xat yozish.False ga o'rnatilgan bo'lsa, ob'ektlar turdagi ob'ektga o'qiladi Tuzilishi.
  • JSON ob'ektlarini tuzilishda seriyadan chiqarishda siz strukturaning asosiy talablaridan xabardor bo'lishingiz kerak. Agar ob'ektni seriyadan chiqarishda struktura kaliti uchun mos bo'lmagan xususiyat nomi topilsa, istisno chiqariladi.

1. 1 HTTP ulanish parametrlarini sozlash

Tashqi REST veb-server bilan o'zaro aloqaning mijoz qismini tashkil qilish uchun men noldan BSP asosida mijoz konfiguratsiyasini yaratdim. Ushbu konfiguratsiyadan foydalanib, men ulanish parametrlarini o'rnatish uchun ma'lumotnoma yaratdim (1-rasmga qarang).

1-rasm Qolgan interfeys orqali tashqi axborot xavfsizligiga HTTP ulanishi parametrlarini o'rnatish katalogi

Tugmani bosgandan so'ng Server javobini tekshiring, mijoz serverdan javob olishga harakat qiladigan protsedura chaqiriladi. Dastur kodi Jarayon quyida yozilgan:

&OnClient protsedurasi CheckConnection(Buyruq) Manzil = Object.ServerAddress; Foydalanuvchi = Object.User; Parol = Object.Password; DatabaseName = Ob'ekt nomi; Port =? (Object.Port<>0,Object.Port,80); HTTPConnection = Yangi HTTP ulanishi (manzil, port, foydalanuvchi, parol); ResourceAddress = DatabaseName + "/odata/standard.odata/ $metadata "; //Qo'ng'iroq moslashtirilgan funksiya Javob tuzilishi= B HTTPMethodOnServerga qo'ng'iroq qiling("GET", HTTPConnection, ResourceAddress) ; Agar Javob tuzilishi <> Keyin aniqlanmagan General PurposeClientServer.NotifyUser("Holat kodi"+Javob tuzilmasi.Status kodi); cheksiz; Jarayonning oxiri

Ushbu protseduraning maqsadi xizmatni tekshirish va foydalanuvchi ulanish parametrlarini to'g'ri kiritganmi yoki yo'qmi. Buning uchun faqat GET so'rovini bajaring:
HTTPConnection.CallHTTPmethod( "OLING", HTTP so'rovi);
resurs manzili yordamida:
Resurs manzili =Asosiy nom+ /odata/standard.odata/ “;
Bundan tashqari, xizmatni brauzeringizda tekshirishingiz mumkin
URL
http://host/WebBuh/odata/standard.odata. Bunday so'rovning natijasi faqat ob'ektlar ro'yxati. Standart OData interfeysining to'liq tavsifini olish uchun (mavjud ob'ektlar ro'yxati, ularning atributlari va funktsiyalari XML-
hujjat.) parametr yordamida GET so'rovini bajarishingiz kerak $metadata. URL http://host/WebBuh/odata/standard.odata/$metadata. Batafsil tavsif Hujjatni http://www.odata.org/documentation/ (ingliz tilida) manzilidan olish mumkin.
Javoblarni formatda olishingiz mumkin Atom/XML yoki JSON. HTTP javob holati kodlari diapazonlardagi javoblarni ko'rish mumkin:

  • 100-199 - mijozning so'rovi qabul qilinganligi va ko'rib chiqilayotganligini ko'rsatadigan ma'lumotli javoblar.
  • 200-299 - mijozning so'rovi muvaffaqiyatli bajarilganligini anglatadi.
  • 300-399 so'rov bajarilmaganligini va mijoz so'rovni qondirish uchun ba'zi choralar ko'rishi kerakligini anglatadi.
  • 400-499 - mijoz ilovasi tomonidagi xatolar haqida xabar beradi. Ushbu kodlar mijozdan qo'shimcha ma'lumot talab qilinishini ham ko'rsatishi mumkin.
  • 500-599 - Server xatolikka duch kelganligi va mijoz so'rovini bajara olmasligini bildiruvchi server tomonidagi xato haqida xabar beradi.

1.2 Ob'ektni ID bo'yicha qidirish

Keyingi funktsiya serverdagi noyob identifikator bo'yicha katalog yoki hujjatni qidirish uchun mo'ljallangan. Agar ob'ekt topilsa, u holda funktsiya identifikatorning (Ref_Key) satr qiymatini qaytaradi, aks holda u qaytaradi aniqlanmagan. Funktsiyaga quyidagi parametrlar uzatiladi:

  • HTTPConnection - HTTPConnection turidagi ob'ekt
  • PublicationName - nashr etilgan server ma'lumotlar bazasining nomi
  • Element - ob'ekt identifikatori, masalan, Katalog_Tashkilotlar yoki Document_- Tashkilotning katalogi.
  • Identifikator - serverda qidiriladigan ob'ektning identifikatori, masalan. Organization.UniqueIdentifier()
&OnServer funksiyasi SearchObjectByGUID (HTTPConnection, nashr nomi, element, noyob identifikator) GUID = String (UniqueIdentifier); // ResourceAddress = + qatoriga aylantiring Element+ "(guid""+ GUID+ "")?$format=json" ; Javob tuzilishi = BHTTPMethodOnServerga qo'ng'iroq qiling("OLING" , HTTPConnection, ResourceAddress) ; Agar Javob tuzilishi .StatusCode >= 400 Keyin //General PurposeClientServer.NotifyUser(Element+ "Xato"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Qaytish aniqlanmagan; EndIf; Moslik = Javob tuzilishi. ReplyServer a; Massiv = Moslash["qiymat"]; Agar massiv = Aniqlanmagan bo'lsa, moslikni qaytaring["Ref_Key"] Aks holda, massivni qaytaring["Ref_Key"]; endIf; EndFunction

Parametr Resurs manzili REST xizmatiga kirish uchun foydalaniladi. Xizmatning ishlashini tekshirish uchun siz brauzerda resursni shunday belgilashingiz mumkin

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Element)?(Parametrlar) ,Qaerda

  • Veb-server manzili– Xizmat chop etiladigan veb-serverning manzili, masalan, Localhost
  • Nashrlar nomi- Ism axborot bazasi qarorni e'lon qilishda ko'rsatilgan
  • /odata/standard.odata/ – Standart OData interfeysiga kirish belgisi
  • Element – resurs identifikatori yoki oldindan belgilangan resurslar. Masalan, Catalog_Account(guid'value').
  • Variantlar- resurs parametrlari. Masalan, HTTP so'rovlari uchun qabul qilingan usulda tanlash uchun ishlatiladi: ?key=value&key2=value2

1.3 Qidiruv maydonlari yordamida ob'ektni qidirish

Quyidagi foydalanuvchi belgilagan funksiya, ob'ekt identifikatsiya raqami bo'yicha bo'lgan holda, qidiruv maydonlari bo'yicha ob'ektni qidirish uchun mo'ljallangan. Funktsiya ob'ektlari qatori Ref_Key -identifikatsiya raqami.

&OnServer funktsiyasi P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields) Shart = "" ; Qidiruv maydoni tsiklidagi har bir kalit qiymati uchun Vaziyat = Vaziyat + KeyValue.Key+ "eq"" + KeyValue.Value+ "" va "; EndCycle; So'rov matni =Lev(Shart, StrLength(Shart)-5); // oxirgi 5 ta belgini olib tashlang Resurs manzili= PublicationName+ "/odata/standard.odata/" +Element+ "?$filter=" + So'rov matni+ "&$format=json& $select=Ref_Key" ; //Mening maxsus funktsiyamga qo'ng'iroq qiling Javob tuzilishi= CallHTTPmethodOnServer( "OLING",HTTPConnection,ResourceAddress); Agar Javob tuzilishi .StatusCode >= 400 Keyin //General PurposeClientServer.NotifyUser(Element+ “Xato”+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Qaytish aniqlanmagan; endIf; Moslik = Javob tuzilishi. ReplyServer a; Massiv = Moslash["qiymat"]; Agar massiv = Aniqlanmagan bo'lsa, moslikni qaytaring ["Ref_Key" ] Aks holda, massivni qaytaring ["Ref_Key" ]; endIf; EndFunction

Jarayonning tanasidan ko'rinib turibdiki P searchObjectBySearchFields, tanlash kalit so'z bilan boshlanadi$filtrresurs manzilida. Formal parametrQidiruv maydonlari -bu tafsilotlarning nomlari va qiymatlarini o'z ichiga olgan yozishma.

E'tibor bering, tafsilotlarning nomlari ba'zan aniq emas. Ma'lumotnomalar uchun quyidagilarni yodda tutish kerak:

  • Kod - kod,
  • Tavsif - Ism
  • DeletionMark - o'chirish belgisi,
  • IsFolder - guruh belgisi,
  • Parent_Key - ota-ona.
  • Agar atribut mos yozuvlar turiga tegishli bo'lsa, uning nomiga _Key qo'shimchasi qo'shilishi kerak, masalan, Account_Key.

Hujjatlar uchun:

  • Raqam - hujjat raqami,
  • Sana - hujjat sanasi.

Mantiqiy tanlash operatsiyalari

  • eq - Teng; /Catalog_Cities?$filter=Im eq ‘Asosiy’;
  • ne - teng emas; /Catalog_Cities?$filter="Perm" nomi;
  • gt - ko'proq; /Katalog_Mahsulotlar?$filtr= Narxi gt 10;
  • ge - kattaroq yoki teng; /Catalog_Products?$filtr=Narx 10;
  • lt - kamroq; /Catalog_Products?$filtr=Narxi lt 10;
  • le - dan kichik yoki teng; /Catalog_Products?$filtr=Narxi 10;
  • yoki - Mantiqiy OR; /Katalog_ Mahsulotlar ?$filtr= Narxi lt 10 yoki Narxi gt 100;
  • va - Mantiqiy VA; / Katalog _Mahsulotlar?$ filtri =Narx g t 10 va Narxi l t 100;
  • emas - inkor qilish; /Katalog_ Mahsulotlar ?$filtr=not (Narx ekv 10);

Haqiqiy parametrning qiymatini ham unutmang Element(yoki ob'ekt)) funktsiyaga o'tkazaman quyidagi qoidaga muvofiq shakllantiriladi:

Ism Prefix_ConfigurationObjectName_Name suffiksi.

Standart OData interfeysidan foydalanib, siz quyidagi ob'ektlarga kirishingiz mumkin ( Ism prefiksi):

  • Katalog - Katalog;
  • Hujjat - Hujjat;
  • Document Journal - DocumentJournal;
  • Doimiy - doimiy;
  • Birja rejasi - ExchangePlan;
  • Hisoblar jadvali - ChartOfAccounts
  • Hisoblash turlari jadvali - ChartOfCalculationTypes;
  • Xarakteristik tiplar diagrammasi - ChartOfCharacteristicTypes;
  • Axborot reestri - Axborot reestri;
  • Jamg'arish registri - jamg'arish registri;
  • Hisoblash registri - CalculationRegister;
  • Buxgalteriya registri - Buxgalteriya registri;
  • Biznes jarayoni - BusinessProcess;
  • Vazifa - Vazifa.

ConfigurationObjectName- konfiguratorda ko'rsatilgan konfiguratsiya ob'ektining "Nom" xususiyati.

Ism qo'shimchasi- resurs nomini aniqlashtirish uchun zarur, ixtiyoriy, quyidagi qiymatlarni olishi mumkin:

  • Ob'ektning jadval qismining nomi;
  • Ism virtual jadval ob'ekt;
  • RowType - ob'ektning jadval qismining qatori;
  • RecordType - alohida registr yozuvi.

Resurslarga kirish parametrlari

Resurs nomini shakllantirgandan so'ng, siz manbaga kirish parametrlarini belgilashingiz kerak, masalan, ?$filtr= Ma'nosi &$format=json& $select= Ref_Key ,

  • $filtr- ma'lumotlarni qabul qilishda tanlash
  • $format- qaytarilgan ma'lumotlarning formatini ko'rsatadi,
  • $tanlash- so'rov natijasiga kiritiladigan ob'ekt xususiyatlarining ro'yxati;
  • $metadata- standart OData interfeysining tavsifini qaytaradi (ism qo'shimchasini ko'rsatmasdan foydalaniladi, misol yuqoridagi rasmlardan birida);
  • $top- qaytarilgan yozuvlar sonini cheklash;
  • $skip- so'rov natijasidan ko'rsatilgan yozuvlar sonini olib tashlaydi;
  • $count- so'rov tanlovidagi yozuvlar sonini qaytaradi;
  • $inlinecount=allpage(=yo'q)- so'rov natijasiga yozuvlar soni haqidagi ma'lumotlarni qo'shadi
  • $orderby=<Реквизит1>yuksalish,<Реквизит2>pasaytirish- so'rov natijasini saralash
  • ruxsat berish faqat- faqat ruxsat etilganlar ("$" belgisisiz ishlatiladi).

1.4 Axborot registridagi yozuvlar qatorini oling

Jismoniy shaxslarning to'liq ismlari, masalan, to'liq ismlarning o'zgarishi tarixi haqida ma'lumot olish uchun reestr yozuvlari qatorini olish misolini ko'rib chiqaylik. individual

Nashrlar nomi = "WebBuh"; Element = "InformationRegister_Name of individuals"; Davr = Aniqlanmagan; ReferenceType Data= new Structure(); D DataReferenceType.Insert("Individual",Individual_Key); DataNON-ReferenceType= new Structure(); DataNON-ReferenceType.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") Massiv = GetRegisterInfoSet(HTTPConnection, nashr nomi, element, davr, O'lchamlarReferenceType, Referans turi bo'lmagan o'lchamlar)

Ushbu misolda chaqirilgan GetInfoRegisterRecordSet funktsiyasining tanasi quyida ko'rsatilgan

&OnServer funksiyasi GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Aniqlanmagan, O'lchamlarReferenceType= Aniqlanmagan Referans turi bo'lmagan o'lchamlar= Aniqlanmagan) RequestText = "" ; Agar davr<>Keyin aniqlanmagan Formatlangan davr= Format (Davlat,"DF=yyyy-AA-ddTH:mm:ss"); RequestText = "Period = datetime"" + FormattedPeriod + """ ; endIf; Agar O'lchamlarReferenceType <>Undefined So'ngra Har bir KeyValue Of uchun O'lchamlarReferenceType Cycle Powered =? ( Qiymat to'ldirilgan(QueryText), "," ,""); RequestText = RequestText+ Yoqilgan + KeyValue.Key+ "=guid(""+ KeyValue.Value+ "")"; EndCycle; EndIf; If Referans turi bo'lmagan o'lchamlar<> Keyin aniqlanmagan Har bir kalit ma'nosi uchun Referans turi bo'lmagan o'lchamlar Velosiped So'radi =? ( Qiymat to'ldirilgan(QueryText), "," ,""); QueryText = QueryText + Fed+ K kalit ma'nosi.Kalit + "=" + KeyValue.Value; EndCycle; endIf; ResourceAddress=PublicationName + " /odata/standard.odata/" + Element + "("+ So'rov matni + + ") ?$format=json"; //Mening maxsus funktsiyamga qo'ng'iroq qiling Javob tuzilishi = HTTPMethodOnServerga qo'ng'iroq qiling("GET", HTTPConnection, ResourceAddress); Agar Javob tuzilishi.StatusCode >= 400 Keyin//General PurposeClientServer.NotifyUser(Element+ “Xato”+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Qaytish aniqlanmagan; endIf; Moslik = 0

Platformaning ikkinchi 8-versiyasidan boshlab foydalanuvchilar va ishlab chiquvchilar http so'rovidan to'g'ridan-to'g'ri 1C da foydalanish imkoniyatiga ega. Dastur ikki turdagi so'rovlarni qo'llab-quvvatlaydi:

  • POST so'rovlari;
  • so'rovlarni oling.

Shunday qilib, http orqali ishlaydigan veb-xizmatlar va xizmatlar bilan ma'lumot almashish va o'zaro ishlash uchun juda qulay vosita yaratildi.

GET so'rovi

Albatta, so'rovlardan foydalanishning eng oddiy misollari ularning imkoniyatlarini ko'plab tavsif satrlariga qaraganda ancha yaxshi tasvirlaydi. Shunday qilib, harakat qilaylik:

  1. Keling, saytimizning asosiy sahifasini olamiz;
  2. Biz so'rovni qayta yo'naltirish ustida ishlaymiz;
  3. Keling, saytdan rasmga tushamiz.

Sayt tanasini olish

Keling, oddiy narsadan boshlaylik. Shaklda..

Kodning ushbu qismini bajarish natijasi ancha katta matn bo'lib, uning yakuniy qismi 2-rasmda ko'rsatilgan.

2-rasm

Kodning birinchi qatorida biz http resursiga ulanish ob'ektini yaratamiz. Ob'ekt quyidagi xususiyatlarni o'z ichiga olishi mumkin:

  • Server - server manzilini o'z ichiga olgan ulanish qatori;
  • Port - server portini ko'rsatadigan raqamni o'z ichiga oladi; sukut bo'yicha, ulanish turiga qarab, xavfsiz bo'lmagan ulanishlar uchun 80 yoki SSL bilan himoyalanganlar uchun 443 ni belgilashingiz mumkin.
  • Foydalanuvchi nomi - agar serverda avtorizatsiya zarur bo'lsa, ko'rsatiladi;
  • Parol - ko'rsatilgan resursdagi foydalanuvchi paroli;
  • Proksi - server bilan bog'lanish uchun proksi-serverdan foydalanilganda ko'rsatilgan InternetProxy tipidagi ob'ektni o'z ichiga olishi mumkin;
  • Xavfsiz ulanish – standart qiymat FALSE, TRUE ga o‘tish https protokolidan foydalanishni bildiradi.

Bundan tashqari, HTTPConnection ob'ektining o'ziga xos usullari mavjud bo'lib, ular sizga ishlov beruvchini bajarish algoritmini to'liqroq tavsiflash imkonini beradi:

  • CallHTTPmethod - ikkita talab qilinadigan parametrni o'z ichiga oladi, HTTPmethod va HTTPrequest, uchinchi parametrda ko'rsatilgan faylga javob tanasini yozish qobiliyatini qo'llab-quvvatlaydi;
  • Write - PUT so'rovidan foydalanib, ma'lumotlarni serverga yuboradi;
  • O'zgartirish - PATCH so'rovlarini qayta ishlash orqali ob'ektni o'zgartiradi;
  • SendForProcessing - oldingi barcha usullarda bo'lgani kabi, POST so'rovidan foydalanishni ko'rsatadigan usul, so'rov matnini o'z ichiga olishi kerak va ma'lumotlarni yozib olish uchun javob faylining manzilini ham uzatishi mumkin;
  • Qabul qilish - bu quyida batafsilroq muhokama qilinadi;
  • GetHeadings - maqolada qo'llaniladigan yana bir usul;
  • O'chirish aslida so'rovda uzatilgan resursni serverdan olib tashlaydigan Delite so'rovidir.

Ikkinchi qatorda biz tanlangan saytga so'rov yaratamiz, so'rovimiz matnida bitta chiziqcha mavjud, ya'ni biz qabul qilishni xohlaymiz. bosh sahifa. Agar chiziq chizig'idan keyin biron bir ibora bo'lsa, masalan, "sahifa2" yoki "yangiliklar", biz boshqa sahifaga ega bo'lardik.

Uchinchi qator bizning serverga so'rovimizni bajaradi.

To'rtinchisida biz natijani ko'rsatamiz.

http so'rovini qayta yo'naltirish bilan ishlash

Keling, biron bir dastur orqali qidiruv natijasini olishimiz kerak bo'lgan vaziyatni tasavvur qilaylik qidiruv tizimi"1 soniyada so'rovlar" tugmachasi bilan. GOOGLE-ga kirish uchun zarur bo'lgan kod bo'limi 3-rasmda ko'rsatilgan

3-rasm

Bu erda bizga allaqachon tanish bo'lgan tuzilmalarga qo'shimcha ravishda Sarlavhalar va holat kodi mavjud. Keling, ular bilan shug'ullanamiz.

Status kodi - "Izohlar so'rovi" da ko'rsatilgan standart qiymat quyidagi qiymatlarni olishi mumkin:

  1. Har bir narsa yaxshi bo'lsa, qiymat 100 dan 299 gacha bo'lgan oraliqda qaytadi;
  2. Qayta yo'naltirishda 300 dan 399 gacha bo'lgan kod qaytariladi, bizning holatlarimizda resursga muvaffaqiyatli doimiy yo'naltirish 301 kodi bilan aniqlanadi;
  3. Agar so'rovda xatolar mavjud bo'lsa, parametr 400 dan 499 gacha bo'lgan qiymatni oladi;
  4. 500-599 oralig'idagi qiymat server bilan bog'liq muammolarni ko'rsatadi.

Har bir sahifaning sarlavhasi bor, uning matnida bir nechta parametrlarni ajratib ko'rsatish mumkin (4-rasm):

  1. Ulanish diagrammasi (ikkita "//" chizig'idan oldin keladigan hamma narsa);
  2. Manzil paneli ulanishlar;
  3. Foydalanuvchi nomi va parol;
  4. Ulanish uchun port va xost.

Aynan shu bo'linish SplitAddressLine funktsiyasi tomonidan amalga oshiriladi. Shunday qilib olgan yangi manzil, biz sahifani kompyuterimizda saqlashimiz va uni standart brauzerda ochishimiz mumkin (GetPage protsedurasi).

5-rasm

Bu erda so'rovlar bilan ishlashning yangi funktsiyalari yoki usullari yo'q, biz aslida yaratmoqdamiz Matnli hujjat saytning asosiy qismidan va brauzerda sahifani ishga tushiring.

Faylni D diskining ildiziga joylashtiramiz va uni test deb ataymiz.

Rasmni saytdan olamiz

Tabiiy savol tug'iladi: agar bizga butun sayt kerak bo'lmasa, faqat uning alohida elementlarini olish kerak bo'lsa, buni qilish mumkinmi va qanday qilib? Ha mumkin. Buni amalga oshirish imkonini beruvchi dastur kodi 6-rasmda keltirilgan

6-rasm

Rasmdan ko'rinib turibdiki, so'rov matnida biz olishimiz kerak bo'lgan sayt strukturasi elementining kodi mavjud. Bu qism avvalgi tavsifimizda yo'q edi va biz bu nuqtaga batafsilroq to'xtashimiz kerak.

Biz brauzerdan foydalandik Saytga kirish uchun Opera. Bu biz uchun bitta muhim vositaga ega: elementni o'ng tugmasini bosganingizda, kontekst menyusini chaqirishingiz mumkin, uning elementlaridan biri "Element kodini ko'rish".

Aynan uning yordamida biz 7-rasmda so'rovda foydalaniladigan manzilni olishimiz mumkin.

POST so'rovi

Oddiy Get so'rovlaridan farqli o'laroq, POST http so'rovlari odatdagidek saqlanishi mumkin bo'lgan matn tanasiga ega matn shakli, va xml, soap, json kengaytmali fayllar shaklida. Tarmoqda so'rov matnlarini yaratish uchun juda ko'p vositalar mavjud bo'lib, ular sizga disk raskadrovka va muayyan so'rovlarning bajarilishini kuzatish imkonini beradi.

1C da, ma'lum bir matn bilan so'rovni ishga tushirish uchun HTTP so'rov ob'ektida SetBodyFromString protsedurasi mavjud.