Pavel Chistov. Veb-xizmatlar 1c 8 veb-xizmatlar

kompaniyasi " 1C» 1C: Enterprise platformasini faol rivojlantirmoqda va har bir relizda yangi funksiyalarni qo‘shmoqda. 8.3 filialining rivojlanishi boshlanganidan so'ng, ko'plab yangi mahsulotlar paydo bo'la boshladi va doimiy bandlik tufayli ularning barchasini sinab ko'rishga vaqtingiz yo'q. Yaqinda men to'liq mobil ilovani qanday ishlab chiqish kerak(ha, "1C: Enterprise" da) va bugun men yaratish haqida gaplashmoqchiman HTTP xizmatlari platformasi orqali.

Rivojlanish imkoniyati HTTP xizmatlari versiyada konfiguratsiyaning bir qismi sifatida paydo bo'ldi 8.3.5 . Bu vaqt ichida komponent bir necha bor yangilandi va bugungi kunda uni "bolalarcha" xatolar mavjudligidan qo'rqmasdan ishlatish juda mumkin. Haqiqiy sharoitda http xizmatlarini yaratish uchun 1C: Enterprise platformasining funksionalligidan foydalanish imkoniyatiga ega emasman, hozircha mening tajribam ta'lim loyihalari bilan cheklangan. Biroq, hozirgi ishchi loyihalardan birida http xizmatlari mexanizmidan foydalanish istiqbollarini ko'raman. Ushbu qisqacha eslatmalar seriyasida men foydalanishning odatiy misollarini ko'rsatishga harakat qilaman http xizmatlari platforma uchun konfiguratsiyalarda " 1C: Korxona».

1C: Enterprise 8.3 da oddiy http xizmatini yaratish

Bugun biz eng oddiy http xizmatining misolini ko'rib chiqamiz, keyin esa uni yaxshilaymiz va murakkablashtiramiz. Darsning maqsadi - yaratilishning soddaligini tushunish va his qilishdir http xizmatlari 1C: Enterprise 8.3 platformasi asosida.

Muammoni shakllantirishdan boshlaylik. Eslatma doirasida yaratilgan xizmat faqat ikkita narsani qila olishi kerak: GET so'rovini qabul qilish va JSON formatida javob qaytarish. Vazifa ahamiyatsiz va PHP/ASP .NET da shunga o'xshash narsani qilish bir necha qator kodlar masalasidir. Oldinga qarab, aytamanki, 1C: Enterprise-da bizga taxminan bir xil miqdor kerak bo'ladi (yaxshi, 1C platformasining g'alati narsalariga kulmang).

Biz http xizmatlaridan foydalanish holatlari haqida alohida postda gaplashamiz, ammo hozircha biz yangi http xizmatini yaratamiz. Qulaylik uchun biz bo'sh konfiguratsiyaga ega yangi ma'lumotlar bazasini yaratamiz. Keling, unga bitta quyi tizimni qo'shamiz, biz uni " HTTP xizmatlarini sinab ko'rish" Endi konfiguratsiya daraxtida "Umumiy" bo'limini ochamiz va "Guruh" ni topamiz. HTTP xizmatlari» va birinchi veb-xizmatni qo'shing. Yangi xizmat yaratish oynasida quyidagi maydonlarni to'ldiring:

  • Ism- FirstWebService;
  • Sinonim- birinchi veb-xizmat;
  • Ildiz URL- bizning xizmatlarimiz;

Maydonga e'tibor bering " Ildiz URL" Bu erda ko'rsatilgan nom xizmatga kirishda ishlatiladi. Bu yerda hech qanday boʻshliq boʻlmasligi kerak va kirill alifbosidan foydalanmaslik tavsiya etiladi. Biz buni hal qildik, keyin " Quyi tizimlar" va http xizmatini yagona mavjud quyi tizimga qo'shing.

Keyingi qadam URL naqshini tasvirlashdir. Keling, tegishli yorliqga o'tamiz va nomi bilan shablonni qo'shamiz " Xizmatlar roʻyxatini koʻrsatish" Mulk inspektorida biz mulkni topamiz " Namuna"va unda yozing" /ro'yxat" Buni amalga oshirish orqali biz http xizmati bilan o'zaro aloqada bo'ladigan yo'lni belgilaymiz. Shablon o'tgan parametrlarni belgilashga imkon beruvchi maxsus belgilarni o'z ichiga olishi mumkin (ikkala kerak va kerak emas), lekin birinchi misol uchun biz o'zimizni oddiy bilan cheklaymiz " /ro'yxat" Ushbu yo'lda ketayotganda, bizning yagona usulimiz ishlaydi va mijozga ma'lumotlar to'plamini beradi.

Ajoyib, shablon bor, endi bu usulga bog'liq. Keling, qo'ng'iroq qiladigan shablonimiz uchun qo'shamiz getServicesList. Mulk inspektorida biz HTTP usulini ko'rsatishimiz kerak. Belgilangan qiymat usulimiz qanday turdagi so'rovlarga javob berishini aniqlaydi. Joriy vazifa "" yordamida olish imkonini beradi. OLISH”.

Bizning xizmatimiz deyarli tayyor, faqat tuzilgan usul uchun hodisa ishlovchisini ro'yxatdan o'tkazish qoladi getServicesList. Siz mulk inspektori orqali voqea ishlov beruvchisini yaratishingiz mumkin. Ishlovchining tanasida biz yozamiz:

Funktsiya OutputIndexgetServicesList(Request) ArrayServices = Yangi massiv; Xizmatlar massivi.Qo'shish(Yangi tuzilma("nom, tavsif", "Xizmat №1", "Xizmat №1 tavsifi")); Xizmatlar massivi.Qo‘shish(Yangi tuzilma("nom, tavsif", "Xizmat №2", "2-sonli xizmat tavsifi")); Xizmatlar massivi.Qo‘shish(Yangi tuzilma("nom, tavsif", "Xizmat №3", "Xizmat №3 tavsifi")); Xizmatlar massivi.Qo'shish(Yangi tuzilma("nom, tavsif", "Xizmat №4", "Xizmat №4 tavsifi")); EntryJSON = Yangi EntryJSON; RecordJSON.SetString(); WriteJSON(WriteJSON, ArrayServices); StringForResponse = JSONRecord.Close(); Javob = Yangi HTTPServiceResponse (200); Response.Headers.Insert("Content-type", "application/json; charset=utf-8"); Response.SetBodyFromString(StringForResponse, TextEncoding.UTF8, UseByteOrderMark.NotUse); Javobni qaytarish; EndFunction

Keling, yuqoridagi kodni biroz batafsilroq ko'rib chiqaylik. Eng boshida men tuzilmalardan iborat massivni tasvirlayman. Bizga bu massiv faqat namoyish qilish uchun kerak. Biz uning barcha mazmunini JSONga aylantiramiz va mijozga beramiz. Ob'ekt turini ishga tushirish JSON yozuvi. Usulni chaqirishga ishonch hosil qiling SetString(), chunki biz JSON matnini satr o'zgaruvchisiga olishimiz kerak. Keyin biz global usulni chaqiramiz WriteJSON(), biz tur ob'ektini o'tkazamiz JSON yozuvi va konvertatsiya qilinishi kerak bo'lgan massiv. Keyin natijani o'zgaruvchiga olamiz " LineForResponse" va HTTP javobini tayyorlang.

Bunga javoban biz qo'shamiz (usulga qarang " SetBodyFromString") natijada olingan JSON. Hammasi, demo-kod tayyor va siz testlarga o'tishingiz mumkin.

1C: Enterprise 8.3 da HTTP xizmatini nashr qilish

Bajarilgan ish natijalarini sinab ko'rish uchun yaratilgan HTTP xizmatini nashr qilaylik. Eng oddiy sinov uchun tizimingizda veb-server o'rnatilgan bo'lishi kerak. Men uchun veb-xizmat rolini bajaradi Apache. Biz veb-serverni o'rnatish/sozlash uchun zarur bo'lgan bosqichlarni o'tkazib yuboramiz va HTTP xizmatini nashr qilish masalasiga o'tamiz.

Nashr qilish uchun siz “Ma’muriyat” menyusiga o‘tishingiz va “ Veb-serverda nashr qilish" Ko'rsatilgan oynada quyidagilarni to'ldiring:

  • Ism bizning yechimimizning nomi. U nashr etilgan axborot xavfsizligiga kirishda URL manzilida ishlatiladi. Misol uchun, agar siz bu yerda testni belgilasangiz, axborot xavfsizligingiz http://localhost/test manzilida mavjud bo'ladi. Men sinov variantidan mamnunman.
  • Veb-server- Avtomatik ravishda to'ldiriladi. Men Apache 2.2 dan veb-server sifatida foydalanaman;
  • Katalog– nashr etilgan AT konfiguratsiya fayli joylashtiriladigan katalogga yo'l;
  • Belgini olib tashlang Yupqa mijoz va veb-mijozni nashr eting», « Standart OData interfeysini nashr eting», « Sukut bo'yicha WEB xizmatlarini nashr eting»;
  • HTTP xizmatlari ko'rinishida " Sukut bo'yicha HTTP xizmatlarini nashr qiling" va jadval bo'limida biz yaratilgan xizmatni belgilaymiz.

HTTP xizmati sinovdan o'tkazilmoqda

Yaratilgan http xizmatini sinab ko'rish uchun brauzerni ishga tushiramiz va unga kirishga harakat qilamiz. Agar siz mening barcha qadamlarimni takrorlagan bo'lsangiz, unda yo'l quyidagicha ko'rinishi kerak:

Http://localhost:9090/services/hs/our-services/list

Portga e'tibor berishga arziydi 9090 , bu xost nomidan keyin ikki nuqta bilan belgilanadi. Agar siz Apache-ni standart sozlamalar bilan o'rnatgan bo'lsangiz, u 80-portda tinglaydi, shuning uchun siz hech narsa ko'rsatishingiz shart emas. Natijada, URL quyidagicha bo'ladi:

Http://localhost/services/hs/our-services/list

U orqali o'tishga harakat qiling va agar hamma narsa to'g'ri ishlayotgan bo'lsa, siz JSON formatidagi ma'lumotlarga ega sahifa olasiz:

[ ( sarlavha: "Xizmat № 1", tavsif: "Xizmat № 1 tavsifi" ), ( sarlavha: "Xizmat № 2", tavsif: "Xizmat № 2 tavsifi" ), ( sarlavha: "Xizmat" № 3", tavsifi: "Xizmat tavsifi № 3", ( sarlavha: "Xizmat № 4", tavsif: "Xizmat № 4 tavsifi") ]

Bu erda biz demo misolini ko'rib chiqishni yakunlashimiz mumkin, ammo men nihoyat URLni uning tarkibiy elementlariga ajratmoqchiman, shunda nima uchun aynan shunday havolani olganimiz aniq bo'ladi.

Shunday qilib, birinchi qism aniq bo'lishi kerak - localhost. Bu veb-server o'rnatilgan xost nomi. Keyingi - nashr etilgan axborot xavfsizligiga havola (xizmatlar). Keyinchalik hs keladi, bu yo'l elementi http xizmati bilan o'zaro aloqada bo'lishdan manfaatdor ekanligimizni bildiradi. Oxirgi ikkita element xizmatimizning ildiz URL manzili va URL shablonidir.

Xulosa o'rniga

« 1C: Enterprise 8.3» oddiy yaratish imkonini beradi HTTP xizmatlari minimal mehnat xarajatlari bilan, bu qisqa eslatmani o'qib chiqqandan so'ng, bunga ishonchingiz komil bo'lishi kerak edi. Funktsionallik platformaning dastur imkoniyatlarini sezilarli darajada kengaytiradi. Keyingi postlarda biz texnologiyadan foydalanishning amaliy holatlari haqida gapiramiz va turli xil echimlarni amalda qo'llashni ko'rib chiqamiz.

Veb-xizmatlar boshqa axborot tizimlari bilan integratsiya qilish uchun foydalaniladigan platforma mexanizmlaridan biridir. Bu ilovalar va axborot tizimlarini integratsiyalashning zamonaviy standarti bo'lgan xizmatga yo'naltirilgan arxitektura SOA (Xizmatga yo'naltirilgan arxitektura) ni qo'llab-quvvatlash vositasidir.

Xizmatga yo'naltirilgan arxitekturaning muhim afzalligi shundaki, u mavjud echimlarni yo'q qilmasdan korxona infratuzilmasini bir xilda rivojlantirish imkonini beradi. Uning ishlatilishi heterojen va eski tizimlarni zamonaviy korxona landshaftiga integratsiyalash orqali xarajatlarni minimallashtirishga imkon beradi. Bu sizga erkin bog'langan dasturiy ta'minot komponentlarini qayta ishlatishni maksimal darajada oshirish uchun amalga oshirish imkonini beradi.

Xizmatga yo'naltirilgan arxitektura jadal rivojlanmoqda va yirik sotuvchilar tomonidan qo'llab-quvvatlanmoqda. U avtonom yoki tashqaridan boshqariladigan xizmatlar asosida qurilgan. Ularni amalga oshirishning afzal usuli bu veb-xizmatlardir. Ular platformadan mustaqil, mustaqil va hamma joyda qo'llab-quvvatlanadi.

Ilova yechimi 1C: Enterprise 8 ham veb-xizmatlar provayderi, ham boshqa provayderlar tomonidan nashr etilgan veb-xizmatlarning iste'molchisi bo'lishi mumkin.

O'zboshimchalik bilan apparat va dasturiy platformalardan foydalanadigan tizimlar iste'molchi sifatida harakat qilishi mumkin. Veb-xizmatlar texnologiyasi platformadan mustaqil.


Veb-xizmatlarni texnik amalga oshirish

Agar dastur yechimi veb-xizmat provayderi bo'lsa, u holda fayl va mijoz-server ish rejimlarida dastur yechimi va veb-xizmat iste'molchilari o'rtasidagi o'zaro aloqa veb-server kengaytmasi modulidan foydalangan holda veb-server orqali amalga oshiriladi.

Bunday holda, iste'molchi dastur yechimining veb-xizmatiga kirganda, veb-xizmat moduli bajariladi. Ushbu modul konfiguratsiyada mavjud va muayyan veb-xizmat operatsiyalarini chaqirishda bajariladigan protseduralarni o'z ichiga oladi.

Ishning mijoz-server versiyasida ushbu modul klasterda bajariladi. Ishning fayl versiyasida - veb-server kengaytmasi modulida.

Agar dastur yechimi uchinchi tomon veb-xizmat provayderining iste'molchisi bo'lsa, u holda bu holda dastur yechimi va veb-provayder o'rtasidagi o'zaro ta'sir amalga oshiriladi.

Bilaman, Habré-da ular sabr-toqatli 1C ni yoqtirmaydilar. Garchi, 8.3 platformasi (Linux uchun mijozlar bilan) chiqarilishi bilan ular uni biroz ko'proq seva boshladilar. Aytgancha, yaqinda 1C-ning asosiy ishlanmalaridan biri - Manufacturing Enterprise Management konfiguratsiyasi interfeysi to'liq ingliz tiliga tarjima qilindi. Ko'p marta men bu erda nima uchun 1C haqida yozmasliklari haqida savollarga duch keldim. Ularga javob juda aniq - siz barcha savollarni tezda muhokama qilishingiz va biror narsani o'qishingiz mumkin bo'lgan ko'plab maxsus manbalar mavjud.

Ushbu maqola bu erda omon qolmasligiga ishonish uchun barcha asoslar bor, lekin men hali ham tavakkal qilaman, chunki 1C da gapirishga arziydigan qiziqarli narsalar mavjud.

Bir muncha vaqtdan beri 1C 8.x veb-xizmatlardan foydalanish imkonini berdi: 1C ham yetkazib beruvchi, ham iste'molchi sifatida harakat qilishi mumkin. Ushbu maqolada men 1C dan iste'molchi sifatida qanday foydalanishni Markaziy bank serveridan valyuta kurslarini olish misolida ko'rsataman.

Veb-xizmat

Markaziy bankda kunlik ma'lumotlarni olish uchun veb-xizmati mavjud: valyuta kurslari, yangiliklar, valyuta kursi dinamikasi va boshqalar. Xizmat tavsifini bu yerda http://www.cbr.ru/scripts/Root.asp?Prtid=DWS orqali topishingiz mumkin. Bizni ushbu xizmatning usullaridan biri qiziqtiradi: GetCursOnDate(on_date)- ma'lum bir sana uchun valyuta kurslarini olish. Usulga bitta argument uzatiladi On_date- bu kurslarni olishingiz kerak bo'lgan sana. Natijada jadvalni o'z ichiga olgan XML hosil bo'ladi ValueCursOnDate(kurslarning o'zlari va tegishli ma'lumotlar).

Konfiguratsiya

Rivojlanish uchun men 1C 8.2 (mening ishimda 8.2.15.317) ni oldim va bo'sh konfiguratsiya yaratdim. Tashqi veb-xizmatlardan foydalanish uchun WS havolasi obyekti taqdim etiladi, lekin undan foydalanish shart emas, xizmatga koddan dinamik ravishda kirish mumkin. Men birinchi variantni ishlataman va keyin ikkinchisidan qanday foydalanishingiz mumkinligini ko'rsataman. Konfiguratsiyada men ishlov berishni yaratdim va uni "CBR valyuta kurslarini yuklash" deb nomladim. Men shakl qo'shdim (boshqariladigan) va uni asosiy qilib qo'ydim. Shaklda tafsilotlarni yaratdim va boshqaruv elementlarini rasmda ko'rsatilgandek joylashtirdim.

Endi eng muhimi, veb-xizmat tavsifiga havola yaratishdir. Konfiguratsiyada biz WS-link turidagi yangi ob'ektni qo'shamiz. Ko'rsatilgan oynada WSDL ga havolani ko'rsating (ushbu formatning tavsifi maqola doirasidan tashqarida, siz bu haqda Vikipediyada o'qishingiz mumkin): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx ?WSDL.

Qabul qilingan tavsifga asoslanib, 1C avtomatik ravishda veb-xizmatning vizual xaritasini yaratadi. Siz veb-xizmat nomini ko'rishingiz, unda qanday operatsiyalar mavjudligini, shuningdek ishlatiladigan ma'lumotlar turlarini ko'rishingiz mumkin.

Konfiguratsiya deyarli tugallandi, ilovamiz yanada estetik ko'rinishga ega bo'lishi uchun bir necha marta teginishimiz kerak. Konfiguratsiya ildiziga o'ng tugmasini bosing va "Ish stoli buyruq interfeysini ochish" menyusini chaqiring. Ko'rsatilgan oynada "Markaziy bank valyuta kurslarini yuklash" jarayoni yonidagi "Ko'rinish" bayrog'ini olib tashlashingiz kerak. OK tugmasini bosing. Keyin, konfiguratsiya ildiziga sichqonchaning o'ng tugmachasini bosing va "Ish stolini ochish" menyusiga qo'ng'iroq qiling, u erda biz rasmdagi kabi sozlamalarni qilamiz:

Ushbu sozlamalar bizga ishlov berish shaklini to'g'ridan-to'g'ri ish stolida (1C dasturining ish stolini anglatadi) 1C Enterprise rejimida ko'rsatishga imkon beradi.

Dasturlash

Endi bizning qayta ishlashimizni ma'no bilan to'ldirish qoladi: uni valyuta kurslarini qabul qilish va shakldagi jadvalda ko'rsatish. Shaklni tahrirlash rejimida siz yangi forma buyrug'ini qo'shishingiz kerak, keling, uni LoadCurrencies deb ataymiz. Bu buyruq formada joylashgan tugma bilan bog'lanishi kerak. Buyruq uchun amalni quyidagi kod bilan to'ldiramiz (muallifning eslatmasi: voy, markazda 1C kodini ajratib ko'rsatish mavjud, garchi u to'g'ri ishlamasa ham):

&Mijoz protsedurasi bo'yicha LoadCurrencies(Buyruq) Agar ValueFilled BO'lmasa(DownloadSana) Keyin Report("Yuklab olish sanasi tanlanmagan!", MessageStatus.Important); Qaytish; endIf; CurrencyRatesTable.Clear(); LoadCurrencyRates(LoadDate); Jarayonning oxiri
Bu erda biz birinchi navbatda sana to'ldirilganligini tekshiramiz (agar u to'ldirilmagan bo'lsa, biz bu haqda foydalanuvchiga xabar beramiz va boshqa hech narsa qilmaymiz). Keyin formada joylashgan jadval tozalanadi va sana o'tkaziladigan LoadCurrencyRates() protsedurasi chaqiriladi.

LoadCurrencyRates() protsedurasi kodi, tushuntirishlar kodga izohlarda berilgan:

LoadCurrencyRates(fDataDownload) protsedurasi //Tashqi veb-xizmatga kirish uchun proksi-server yarating, //funksiyaga nom maydoni URI, xizmat nomi, port nomini o'tkazing. Proksi = WSLinks.CBR_DailyInfoWebServ.CreateWSProxy("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //GetCursOnDate usuliga uzatiladigan parametr turini oling. TypeWSParameter = Proxy.FactoryXDTO.Packets.Get("http://web.cbr.ru/").Get("GetCursOnDate"); //Turga qarab parametr yarating va On_Date parametrining qiymatini to'ldiring. WSParameter = Proxy.XDTO Factory.Create(WSParameterType); WSParameter.On_Date = fLoadDate; //Veb-xizmat usulini chaqiring, natijani Valyuta kurslari o'zgaruvchisiga yozing. Valyuta kurslari = Proxy.GetCursOnDate(WSParameter); //ValuteCursOnDate jadvalini aylantiring, har bir jadval qiymatini // shakldagi jadvalga qo'shing (ustunlarni mos qiymatlar bilan to'ldiring). Valyuta kurslaridan har bir element uchun.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate tsikli NewLineTK = CurrencyRatesTable.Add(); NewLineTK.CurrencyName = Element.Vname; NewStringTZ.Nominal = Element.Vnom; NewLineTZ.DigitalCurrencyCode = Element.Vcode; NewTZLine.CurrencyCode = Element.VChCode; NewLineTZ.Currency Rate = Element.Vcurs; EndCycle; Jarayonning oxiri
Endi siz ma'lumotlar bazasi konfiguratsiyasini (F7) yangilashingiz va 1C Enterprise (F5) ni ishga tushirishingiz mumkin. Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, quyidagi kabi oynani ko'rishingiz kerak:

Natijani tekshirish uchun biz valyuta kurslarini olmoqchi bo'lgan sanani kiritishimiz va "Valyutalarni yuklash" tugmasini bosishimiz kerak. Agar so'rov muvaffaqiyatli bo'lsa, shakldagi jadval tarif qiymatlari bilan to'ldiriladi:

Va nihoyat, men tashqi veb-xizmatga, ya'ni WS havolasi ob'ektini qo'shmasdan qanday qilib dinamik ravishda kirishingiz mumkinligini ko'rsatmoqchiman. Shunday qilib, biz konfiguratsiyaga bog'lanmasdan bunday veb-xizmatlarni tashqi ishlov berishdan foydalanishimiz mumkin.

LoadCurrencyRates() protsedurasida chiziq

Ta'riflar = Yangi WSDefinitions("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); Proksi = Yangi WSProxy(Tanriflar, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Avval biz WSDL-dan veb-xizmat uchun ta'riflar yaratamiz. Keyin unga kirish uchun proksi-server ham yaratamiz.

Ko'rib turganingizdek, 1C-dan tashqi veb-xizmatlardan foydalanish odatda juda oddiy (garchi turlarning ta'rifini tushunishda biroz qiyinchilik bo'lsa-da, shu jumladan men).

Agar bu post shu yerda aks-sado bersa, yana bir qancha mavzular haqida gapirish mumkin.

2012-yil 30-iyul, soat 13:19

Valyuta kurslarini yuklash misolidan foydalanib, 1C-da tashqi veb-xizmatlardan foydalanish

  • Dasturlash

Bilaman, Habré-da ular sabr-toqatli 1C ni yoqtirmaydilar. Garchi (Linux bilan ishlaydigan mijozlar bilan), ular buni biroz ko'proq yoqtira boshladilar. Aytgancha, yaqinda 1C-ning asosiy ishlanmalaridan biri - Manufacturing Enterprise Management konfiguratsiyasi interfeysi to'liq ingliz tiliga tarjima qilindi. Ko'p marta men bu erda nima uchun 1C haqida yozmasliklari haqida savollarga duch keldim. Ularga javob juda aniq - siz barcha savollarni tezda muhokama qilishingiz va biror narsani o'qishingiz mumkin bo'lgan ko'plab maxsus manbalar mavjud.

Ushbu maqola bu erda omon qolmasligiga ishonish uchun barcha asoslar bor, lekin men hali ham tavakkal qilaman, chunki 1C da gapirishga arziydigan qiziqarli narsalar mavjud.

Bir muncha vaqtdan beri 1C 8.x veb-xizmatlardan foydalanish imkonini berdi: 1C ham yetkazib beruvchi, ham iste'molchi sifatida harakat qilishi mumkin. Ushbu maqolada men 1C dan iste'molchi sifatida qanday foydalanishni Markaziy bank serveridan valyuta kurslarini olish misolida ko'rsataman.

Veb-xizmat

Markaziy bankda kunlik ma'lumotlarni olish uchun veb-xizmati mavjud: valyuta kurslari, yangiliklar, valyuta kursi dinamikasi va boshqalar. Xizmat tavsifini bu yerda http://www.cbr.ru/scripts/Root.asp?Prtid=DWS orqali topishingiz mumkin. Bizni ushbu xizmatning usullaridan biri qiziqtiradi: GetCursOnDate(on_date)- ma'lum bir sana uchun valyuta kurslarini olish. Usulga bitta argument uzatiladi On_date- bu kurslarni olishingiz kerak bo'lgan sana. Natijada jadvalni o'z ichiga olgan XML hosil bo'ladi ValueCursOnDate(kurslarning o'zlari va tegishli ma'lumotlar).

Konfiguratsiya

Rivojlanish uchun men 1C 8.2 (mening ishimda 8.2.15.317) ni oldim va bo'sh konfiguratsiya yaratdim. Tashqi veb-xizmatlardan foydalanish uchun WS havolasi obyekti taqdim etiladi, lekin undan foydalanish shart emas, xizmatga koddan dinamik ravishda kirish mumkin. Men birinchi variantni ishlataman va keyin ikkinchisidan qanday foydalanishingiz mumkinligini ko'rsataman. Konfiguratsiyada men ishlov berishni yaratdim va uni "CBR valyuta kurslarini yuklash" deb nomladim. Men shakl qo'shdim (boshqariladigan) va uni asosiy qilib qo'ydim. Shaklda tafsilotlarni yaratdim va boshqaruv elementlarini rasmda ko'rsatilgandek joylashtirdim.

Endi eng muhimi, veb-xizmat tavsifiga havola yaratishdir. Konfiguratsiyada biz WS-link turidagi yangi ob'ektni qo'shamiz. Ko'rsatilgan oynada WSDL ga havolani ko'rsating (ushbu formatning tavsifi maqola doirasidan tashqarida, siz bu haqda Vikipediyada o'qishingiz mumkin): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx ?WSDL.

Qabul qilingan tavsifga asoslanib, 1C avtomatik ravishda veb-xizmatning vizual xaritasini yaratadi. Siz veb-xizmat nomini ko'rishingiz, unda qanday operatsiyalar mavjudligini, shuningdek ishlatiladigan ma'lumotlar turlarini ko'rishingiz mumkin.

Konfiguratsiya deyarli tugallandi, ilovamiz yanada estetik ko'rinishga ega bo'lishi uchun bir necha marta teginishimiz kerak. Konfiguratsiya ildiziga o'ng tugmasini bosing va "Ish stoli buyruq interfeysini ochish" menyusini chaqiring. Ko'rsatilgan oynada "Markaziy bank valyuta kurslarini yuklash" jarayoni yonidagi "Ko'rinish" bayrog'ini olib tashlashingiz kerak. OK tugmasini bosing. Keyin, konfiguratsiya ildiziga sichqonchaning o'ng tugmachasini bosing va "Ish stolini ochish" menyusiga qo'ng'iroq qiling, u erda biz rasmdagi kabi sozlamalarni qilamiz:

Ushbu sozlamalar bizga ishlov berish shaklini to'g'ridan-to'g'ri ish stolida (1C dasturining ish stolini anglatadi) 1C Enterprise rejimida ko'rsatishga imkon beradi.

Dasturlash

Endi bizning qayta ishlashimizni ma'no bilan to'ldirish qoladi: uni valyuta kurslarini qabul qilish va shakldagi jadvalda ko'rsatish. Shaklni tahrirlash rejimida siz yangi forma buyrug'ini qo'shishingiz kerak, keling, uni LoadCurrencies deb ataymiz. Bu buyruq formada joylashgan tugma bilan bog'lanishi kerak. Buyruq uchun amalni quyidagi kod bilan to'ldiramiz (muallifning eslatmasi: voy, markazda 1C kodini ajratib ko'rsatish mavjud, garchi u to'g'ri ishlamasa ham):

&Mijoz protsedurasi bo'yicha LoadCurrencies(Buyruq) Agar ValueFilled BO'lmasa(DownloadSana) Keyin Report("Yuklab olish sanasi tanlanmagan!", MessageStatus.Important); Qaytish; endIf; CurrencyRatesTable.Clear(); LoadCurrencyRates(LoadDate); Jarayonning oxiri
Bu erda biz birinchi navbatda sana to'ldirilganligini tekshiramiz (agar u to'ldirilmagan bo'lsa, biz bu haqda foydalanuvchiga xabar beramiz va boshqa hech narsa qilmaymiz). Keyin formada joylashgan jadval tozalanadi va sana o'tkaziladigan LoadCurrencyRates() protsedurasi chaqiriladi.

LoadCurrencyRates() protsedurasi kodi, tushuntirishlar kodga izohlarda berilgan:

LoadCurrencyRates(fDataDownload) protsedurasi //Tashqi veb-xizmatga kirish uchun proksi-server yarating, //funksiyaga nom maydoni URI, xizmat nomi, port nomini o'tkazing. Proksi = WSLinks.CBR_DailyInfoWebServ.CreateWSProxy("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //GetCursOnDate usuliga uzatiladigan parametr turini oling. TypeWSParameter = Proxy.FactoryXDTO.Packets.Get("http://web.cbr.ru/").Get("GetCursOnDate"); //Turga qarab parametr yarating va On_Date parametrining qiymatini to'ldiring. WSParameter = Proxy.XDTO Factory.Create(WSParameterType); WSParameter.On_Date = fLoadDate; //Veb-xizmat usulini chaqiring, natijani Valyuta kurslari o'zgaruvchisiga yozing. Valyuta kurslari = Proxy.GetCursOnDate(WSParameter); //ValuteCursOnDate jadvalini aylantiring, har bir jadval qiymatini // shakldagi jadvalga qo'shing (ustunlarni mos qiymatlar bilan to'ldiring). Valyuta kurslaridan har bir element uchun.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate tsikli NewLineTK = CurrencyRatesTable.Add(); NewLineTK.CurrencyName = Element.Vname; NewStringTZ.Nominal = Element.Vnom; NewLineTZ.DigitalCurrencyCode = Element.Vcode; NewTZLine.CurrencyCode = Element.VChCode; NewLineTZ.Currency Rate = Element.Vcurs; EndCycle; Jarayonning oxiri
Endi siz ma'lumotlar bazasi konfiguratsiyasini (F7) yangilashingiz va 1C Enterprise (F5) ni ishga tushirishingiz mumkin. Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, quyidagi kabi oynani ko'rishingiz kerak:

Natijani tekshirish uchun biz valyuta kurslarini olmoqchi bo'lgan sanani kiritishimiz va "Valyutalarni yuklash" tugmasini bosishimiz kerak. Agar so'rov muvaffaqiyatli bo'lsa, shakldagi jadval tarif qiymatlari bilan to'ldiriladi:

Va nihoyat, men tashqi veb-xizmatga, ya'ni WS havolasi ob'ektini qo'shmasdan qanday qilib dinamik ravishda kirishingiz mumkinligini ko'rsatmoqchiman. Shunday qilib, biz konfiguratsiyaga bog'lanmasdan bunday veb-xizmatlarni tashqi ishlov berishdan foydalanishimiz mumkin.

LoadCurrencyRates() protsedurasida chiziq

Ta'riflar = Yangi WSDefinitions("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); Proksi = Yangi WSProxy(Tanriflar, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Avval biz WSDL-dan veb-xizmat uchun ta'riflar yaratamiz. Keyin unga kirish uchun proksi-server ham yaratamiz.

Ko'rib turganingizdek, 1C-dan tashqi veb-xizmatlardan foydalanish odatda juda oddiy (garchi turlarning ta'rifini tushunishda biroz qiyinchilik bo'lsa-da, shu jumladan men).

Agar bu post shu yerda aks-sado bersa, yana bir qancha mavzular haqida gapirish mumkin.

Mavzu sarlavhasi haqiqatan ham savol, chunki... Men o'zim bu nima ekanligini bilmayman va birinchi marta ushbu maqola doirasida u bilan ishlashga harakat qilaman. Men kafolat bera oladigan yagona narsa shundaki, quyida keltirilgan kod ishlaydi, ammo mening iboralarim bularning barchasini o'zim qanday tushunganim haqidagi taxminlar va taxminlar bo'ladi. Xo'sh, ketaylik ...

Kirish

Biz veb-xizmatlar tushunchasi nima uchun yaratilganidan boshlashimiz kerak. Bu kontseptsiya dunyoda paydo bo'lgan vaqtga kelib, ilovalarning masofadan o'zaro ta'sirini ta'minlaydigan texnologiyalar allaqachon mavjud edi, bu erda bir dastur boshqa dasturda qandaydir usulni chaqirishi mumkin, bu boshqa shaharda yoki hatto mamlakatda joylashgan kompyuterda ishga tushirilishi mumkin. Bularning barchasi RPC (Remote Procedure Calling) deb qisqartiriladi. Masalan, CORBA texnologiyalari va Java uchun - RMI (Remote Method Invoking). Va ularda hamma narsa yaxshi ko'rinadi, ayniqsa CORBAda, chunki ... Siz u bilan har qanday dasturlash tilida ishlashingiz mumkin, ammo nimadir etishmayotgan edi. Menimcha, CORBA ning kamchiligi shundaki, u har qanday xavfsizlik devoriga mos keladigan oddiy HTTP o'rniga o'zining ba'zi tarmoq protokollari orqali ishlaydi. Veb-xizmatning g'oyasi HTTP paketlariga kiritiladigan RPC yaratish edi. Shunday qilib, standartni ishlab chiqish boshlandi. Ushbu standartning asosiy tushunchalari qanday:
  1. Sovun. Masofaviy protsedurani chaqirishdan oldin, siz ushbu qo'ng'iroqni SOAP formatidagi XML faylida tasvirlashingiz kerak. SOAP veb-xizmatlarda qo'llaniladigan ko'plab XML belgilaridan biridir. Biz HTTP orqali biror joyga yubormoqchi bo'lgan hamma narsa avval XML SOAP tavsifiga aylantiriladi, so'ngra HTTP paketiga to'ldiriladi va TCP/IP orqali tarmoqdagi boshqa kompyuterga yuboriladi.
  2. WSDL. Veb-xizmat mavjud, ya'ni. usullarini masofadan chaqirish mumkin bo'lgan dastur. Ammo standart ushbu dasturga "ha, siz haqsiz - bu haqiqatan ham veb-xizmat va siz undan falon usullarni chaqirishingiz mumkin" degan tavsif bilan birga bo'lishini talab qiladi. Ushbu tavsif boshqa formatga ega bo'lgan boshqa XML fayli, ya'ni WSDL bilan ifodalanadi. Bular. WSDL shunchaki veb-xizmatni tavsiflovchi XML fayli va boshqa hech narsa emas.
Nega bunchalik qisqa so'rayapsiz? Aniqroq gapira olmaysizmi? Ehtimol, bu mumkin, ammo buning uchun siz T. Mashnin, "Java Web Services" kabi kitoblarga murojaat qilishingiz kerak bo'ladi. U erda birinchi 200 sahifada SOAP va WSDL standartlarining har bir tegining batafsil tavsifi mavjud. Buni qilishga arziydimi? Menimcha, yo'q, chunki ... bularning barchasi Java-da avtomatik ravishda yaratiladi va siz faqat masofadan chaqirilishi kerak bo'lgan usullarning mazmunini yozishingiz kerak. Shunday qilib, Java-da JAX-RPC kabi API paydo bo'ldi. Agar kimdir bilmasa, Java-da falon API borligini aytishsa, bu ko'rib chiqilayotgan texnologiyani o'z ichiga olgan sinflar to'plamiga ega paket mavjudligini anglatadi. JAX-RPC vaqt o'tishi bilan versiyadan versiyaga rivojlandi va oxir-oqibat JAX-WS ga aylandi. WS, shubhasiz, WebService degan ma'noni anglatadi va siz bu RPC nomini bugungi kunda mashhur so'z sifatida o'zgartirish deb o'ylashingiz mumkin. Bu haqiqat emas, chunki Endi veb-xizmatlar asl g'oyadan uzoqlashdi va sizga nafaqat masofaviy usullarga qo'ng'iroq qilish, balki SOAP formatida hujjat xabarlarini yuborish imkonini beradi. Bu nima uchun kerakligini hali bilmayman; bu erda javob "kerak bo'lganda" bo'lishi dargumon. Men o'zim ham tajribali o'rtoqlardan o'rganmoqchiman. Va nihoyat, keyin JAX-RS RESTful veb-xizmatlari uchun paydo bo'ldi, ammo bu alohida maqola mavzusi. Kirish shu yerda tugashi mumkin, chunki... Keyinchalik JAX-WS bilan ishlashni o'rganamiz.

Umumiy yondashuv

Veb-xizmatlarda har doim mijoz va server mavjud. Server bizning veb-xizmatimiz bo'lib, ba'zan so'nggi nuqta deb ataladi (masalan, mijozdan SOAP xabarlari yetib boradigan oxirgi nuqta). Biz quyidagilarni qilishimiz kerak:
  1. Veb-xizmatimizning interfeysini tasvirlab bering
  2. Ushbu interfeysni amalga oshiring
  3. Veb-xizmatimizni ishga tushiring
  4. Mijozni yozing va kerakli veb-xizmat usuliga masofadan qo'ng'iroq qiling
Siz veb-xizmatni turli yo'llar bilan ishga tushirishingiz mumkin: asosiy usul bilan sinfni tavsiflang va veb-xizmatni to'g'ridan-to'g'ri server sifatida ishga tushiring yoki uni Tomcat yoki boshqa har qanday serverga o'rnating. Ikkinchi holda, biz o'zimiz yangi serverni ishga tushirmaymiz va kompyuterda boshqa portni ochmaymiz, shunchaki Tomcat servlet konteyneriga aytamiz: "biz bu erda veb-xizmat darslarini yozganmiz, iltimos, siz bilan bog'langan har bir kishi buni qila olishi uchun ularni nashr eting. bizning veb-xizmatimizdan foydalaning." Veb-xizmatni ishga tushirish usulidan qat'i nazar, bizda bir xil mijoz bo'ladi.

Server

Keling, IDEA ni ishga tushiramiz va yangi loyiha yaratamiz Yangi loyiha yaratish. Keling, ismni ko'rsatamiz HelloWebService va tugmani bosing Keyingisi, keyin tugmani bosing Tugatish. Jildda src paket yarataylik ru.javarush.ws. Ushbu paketda biz HelloWebService interfeysini yaratamiz: ru paketi. javarush. ws; // bu izohlar, ya'ni. sinflarimiz va usullarimizni belgilash usuli, // veb-xizmat texnologiyasi bilan bog'liq import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. sovun. SOAPBinding; // bizning interfeysimiz veb-xizmat sifatida ishlashini aytamiz@WebService // biz veb-xizmat usullarini chaqirish uchun ishlatilishini aytamiz@SOAPBinding (uslub = SOAPBinding. Style. RPC) umumiy interfeysi HelloWebService ( // biz bu usulni masofadan turib chaqirish mumkinligini aytamiz@WebMethod public String getHelloString(String nomi); ) Ushbu kodda WebService va WebMethod sinflari izohlar deb ataladi va bizning interfeysimiz va uning usulini veb-xizmat sifatida belgilashdan boshqa hech narsa qilmaydi. Xuddi shu narsa SOAPBinding sinfiga ham tegishli. Yagona farq shundaki, SOAPBinding parametrlarga ega izohdir. Bunday holda, uslub parametri veb-xizmat hujjat xabarlari orqali emas, balki klassik RPC sifatida ishlashini ko'rsatadigan qiymat bilan ishlatiladi, ya'ni. usulni chaqirish. Keling, interfeys mantiqimizni amalga oshiramiz va paketimizda HelloWebServiceImpl sinfini yaratamiz. Aytgancha, Impl bilan sinfni tugatish Java-dagi konventsiya bo'lib, unga ko'ra interfeyslarni amalga oshirish shunday belgilanadi (Impl - amalga oshirish so'zidan, ya'ni amalga oshirish). Bu shart emas va siz o'zingiz xohlagan sinfga nom berishingiz mumkin, lekin yaxshi odob-axloq buni talab qiladi: paket ru. javarush. ws; // interfeysni tavsiflashda bir xil izoh, import javax. jws. WebService; // lekin bu erda u endpointInterface parametri bilan ishlatiladi, // veb-xizmatimizning interfeys sinfining to'liq nomini ko'rsatgan holda@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") umumiy klassi HelloWebServiceImpl HelloWebService ( @Override public String getHelloString (String nomi) ( // shunchaki salomlashishni qaytaring"Salom, " + nom + "!" ; ) ) Keling, veb-xizmatimizni mustaqil server sifatida ishga tushiraylik, ya'ni. har qanday Tomcat va dastur serverlarining ishtirokisiz (bu alohida muhokama uchun mavzu). Buning uchun papkadagi loyiha tuzilishida src Keling, ru.javarush.endpoint paketini yaratamiz va unda biz asosiy usul bilan HelloWebServicePublisher sinfini yaratamiz: package ru. javarush. oxirgi nuqta; // veb-serverni veb-xizmatlari bilan ishlatish uchun sinf import javax. xml. ws. Oxirgi nuqta; // veb-xizmatimiz klassi import ru. javarush. ws. HelloWebServiceImpl; umumiy sinf HelloWebServicePublisher ( umumiy statik bekor asosiy (String... args) ( // 1986 portida veb-serverni ishga tushiring // va birinchi argumentda ko'rsatilgan manzilga, // ikkinchi argumentda berilgan veb-xizmatni ishga tushiring Yakuniy nuqta. nashr qilish ( "http://localhost:1986/wss/hello", yangi HelloWebServiceImpl ()); ) ) Endi bu sinfni bosish orqali ishga tushiramiz Shift+F10. Konsolda hech narsa ko'rinmaydi, lekin server ishlayapti. Buni brauzeringizda http://localhost:1986/wss/hello?wsdl qatorini kiritish orqali tekshirishingiz mumkin. Ochilgan sahifa, bir tomondan, bizning kompyuterimizda (localhost) 1986-portda ishlaydigan veb-server (http://) mavjudligini isbotlaydi va boshqa tomondan, veb-xizmatimizning WSDL tavsifini ko'rsatadi. Agar siz dasturni to'xtatsangiz, veb-xizmatning o'zi kabi tavsif mavjud bo'lmaydi, shuning uchun biz buni qilmaymiz, lekin mijozni yozishga o'tamiz.

Mijoz

Loyiha papkasida src Keling, ru.javarush.client to'plamini yarataylik va unda asosiy usul bilan HelloWebServiceClient sinfi: ru paketi. javarush. mijoz; // wsdl tavsifini olish uchun kerak va u orqali // veb-xizmatning o'ziga kirish import java. to'r. URL; // bu istisno URL obyekti bilan ishlashda yuzaga keladi import java. to'r. MalformedURLException; // wsdl tavsifi bilan xmlni tahlil qilish uchun sinflar // va undagi xizmat yorlig'iga kiring import javax. xml. nom maydoni. QName; import javax. xml. ws. Xizmat; // veb-xizmatimizning interfeysi (bizga ko'proq kerak) import ru. javarush. ws. HelloWebService; umumiy sinf HelloWebServiceClient ( umumiy statik bekor asosiy (String args) MalformedURLException ( // wsdl tavsifiga havola yarating URL url = yangi URL ( "http://localhost:1986/wss/hello?wsdl") ; // Biz WSDL tavsifining birinchi tegida keyingi konstruktorning parametrlarini ko'rib chiqamiz - ta'riflar // targetNamespace atributidagi 1-argumentga qarang // name atributidagi 2-argumentga qarang QName qname = yangi QName ("http://ws.site/" , "HelloWebServiceImplService" ); // Endi biz wsdl tavsifidagi xizmat yorlig'iga kirishimiz mumkin, Xizmat xizmati = Xizmat. yaratish (url, qname); // va undan keyin port yorlig'iga o'rnatilgan, shuning uchun // bizdan uzoqda joylashgan veb-xizmat ob'ektiga havola olish HelloWebService salom = xizmat. getPort (HelloWebService.class); // Xayr! Endi siz masofaviy usulni chaqirishingiz mumkin Tizim. tashqariga. println (salom. getHelloString ("JavaRush") ); ) ) Men ro'yxatdagi kodga maksimal izoh berdim. Menda qo'shadigan hech narsa yo'q, shuning uchun ishga tushamiz (Shift + F10). Biz konsolda matnni ko'rishimiz kerak: Salom, JavaRush! Agar siz buni ko'rmagan bo'lsangiz, ehtimol siz veb-xizmatni ishga tushirishni unutgansiz.

Xulosa

Ushbu mavzu veb-xizmatlarga qisqacha ekskursiyani taqdim etdi. Yana bir bor aytamanki, men yozganlarimning ko'pchiligi bu qanday ishlashi haqida mening taxminlarimdir va shuning uchun menga juda ko'p ishonmasligingiz kerak. Agar bilimdonlar meni tuzatsa, men minnatdor bo'lardim, chunki o'shanda men nimanidir o'rganaman. UPD.
Sizga maqola yoqdimi? Do'stlaringizga ulashing: