একটি ওয়েব সেবা কি. Pavel Chistov 1c ওয়েব পরিষেবা কি?

বিষয় শিরোনাম সত্যিই একটি প্রশ্ন, কারণ... আমি নিজেও জানি না এটি কী এবং প্রথমবারের মতো আমি এই নিবন্ধের কাঠামোর মধ্যে এটির সাথে কাজ করার চেষ্টা করব। শুধুমাত্র আমি গ্যারান্টি দিতে পারি যে নীচে উপস্থাপিত কোডটি কাজ করবে, কিন্তু আমার বাক্যাংশগুলি শুধুমাত্র অনুমান এবং অনুমান হবে যে আমি নিজেই এই সমস্ত কিছু বুঝতে পারি। তাহলে এবার চল...

ভূমিকা

কেন ওয়েব পরিষেবার ধারণা তৈরি করা হয়েছিল তা দিয়ে আমাদের শুরু করতে হবে। এই ধারণাটি বিশ্বে আবির্ভূত হওয়ার সময়, প্রযুক্তিগুলি ইতিমধ্যেই বিদ্যমান ছিল যা অ্যাপ্লিকেশনগুলিকে দূরত্বে ইন্টারঅ্যাক্ট করার অনুমতি দেয়, যেখানে একটি প্রোগ্রাম অন্য প্রোগ্রামে কিছু পদ্ধতি কল করতে পারে, যা অন্য শহর বা এমনকি দেশে অবস্থিত কম্পিউটারে চালু করা যেতে পারে। এগুলিকে সংক্ষেপে RPC (রিমোট প্রসিডিউর কলিং) বলা হয়। উদাহরণগুলির মধ্যে রয়েছে CORBA প্রযুক্তি, এবং জাভা - RMI (রিমোট মেথড ইনভোকিং)। এবং তাদের মধ্যে সবকিছুই ভাল বলে মনে হচ্ছে, বিশেষ করে CORBA, কারণ... আপনি এটির সাথে যে কোনও প্রোগ্রামিং ভাষায় কাজ করতে পারেন, তবে কিছু এখনও অনুপস্থিত ছিল। আমি বিশ্বাস করি যে CORBA এর অসুবিধা হল যে এটি সাধারণ HTTP-এর পরিবর্তে তার নিজস্ব কিছু নেটওয়ার্ক প্রোটোকলের মাধ্যমে কাজ করে, যা যেকোনো ফায়ারওয়ালের মাধ্যমে ফিট হবে। ওয়েব পরিষেবাটির ধারণা ছিল একটি RPC তৈরি করা যা HTTP প্যাকেটে ঢোকানো হবে। এভাবে মান উন্নয়ন শুরু হয়। এই স্ট্যান্ডার্ডের মৌলিক ধারণাগুলি কী কী:
  1. সাবান. দূরবর্তী পদ্ধতিতে কল করার আগে, আপনাকে SOAP ফর্ম্যাটে একটি XML ফাইলে এই কলটি বর্ণনা করতে হবে। SOAP হল অনেকগুলি XML মার্কআপের মধ্যে একটি যা ওয়েব পরিষেবাগুলিতে ব্যবহৃত হয়৷ আমরা HTTP এর মাধ্যমে কোথাও যা পাঠাতে চাই তা প্রথমে একটি XML SOAP বিবরণে রূপান্তরিত হয়, তারপর একটি HTTP প্যাকেটে স্টাফ করা হয় এবং TCP/IP এর মাধ্যমে নেটওয়ার্কের অন্য কম্পিউটারে পাঠানো হয়।
  2. ডব্লিউএসডিএল. একটি ওয়েব পরিষেবা আছে, যেমন একটি প্রোগ্রাম যার পদ্ধতি দূরবর্তীভাবে বলা যেতে পারে। কিন্তু স্ট্যান্ডার্ডের জন্য প্রয়োজন যে এই প্রোগ্রামটির সাথে একটি বর্ণনা থাকতে হবে যা বলে যে "হ্যাঁ, আপনি ঠিক বলেছেন - এটি সত্যিই একটি ওয়েব পরিষেবা এবং আপনি এটি থেকে এই জাতীয় পদ্ধতিগুলি কল করতে পারেন।" এই বিবরণটি অন্য একটি XML ফাইল দ্বারা উপস্থাপিত হয়, যার একটি ভিন্ন বিন্যাস রয়েছে, যথা WSDL। সেগুলো. WSDL শুধুমাত্র একটি XML ফাইল যা একটি ওয়েব পরিষেবা বর্ণনা করে এবং এর বেশি কিছু নয়।
কেন এত সংক্ষেপে জিজ্ঞাসা? আপনি আরো নির্দিষ্ট হতে পারে না? এটি সম্ভবত সম্ভব, তবে এটি করার জন্য আপনাকে টি. মাশনিন, "জাভা ওয়েব সার্ভিসেস" এর মতো বইগুলিতে যেতে হবে৷ সেখানে, প্রথম 200 পৃষ্ঠায়, SOAP এবং WSDL মানগুলির প্রতিটি ট্যাগের একটি বিশদ বিবরণ রয়েছে। এটা কি মূল্যবান? আমার মতে, না, কারণ... এই সবগুলি জাভাতে স্বয়ংক্রিয়ভাবে তৈরি হয়, এবং আপনাকে শুধুমাত্র সেই পদ্ধতিগুলির বিষয়বস্তু লিখতে হবে যা দূরবর্তীভাবে বলা হবে। সুতরাং, একটি API যেমন JAX-RPC জাভাতে উপস্থিত হয়েছে। যদি কেউ না জানে, যখন তারা বলে যে জাভাতে এমন একটি এপিআই আছে, তার মানে হল একটি প্যাকেজ রয়েছে যার একটি সেট ক্লাস রয়েছে যা প্রশ্নবিদ্ধ প্রযুক্তিকে এনক্যাপসুলেট করে। JAX-RPC সময়ের সাথে সাথে সংস্করণ থেকে সংস্করণে বিবর্তিত হয়েছে এবং অবশেষে JAX-WS হয়ে গেছে। WS স্পষ্টতই WebService-এর জন্য দাঁড়ায় এবং কেউ ভাবতে পারে যে এই দিনগুলিতে একটি জনপ্রিয় বাজওয়ার্ড হিসাবে এটি কেবল RPC-এর একটি নামকরণ। এই সত্য নয়, কারণ এখন ওয়েব পরিষেবাগুলি মূল ধারণা থেকে দূরে সরে গেছে এবং শুধুমাত্র দূরবর্তী পদ্ধতিতে কল করার অনুমতি দেয় না, বরং SOAP ফর্ম্যাটে নথি বার্তা পাঠানোরও অনুমতি দেয়। আমি জানি না কেন এটির প্রয়োজন আছে; এটা অসম্ভাব্য যে এখানে উত্তর হবে "যদি এটি প্রয়োজন হয়।" আমি নিজে আরও অভিজ্ঞ কমরেডদের কাছ থেকে শিখতে চাই। এবং শেষ পর্যন্ত, তারপরে JAX-RS তথাকথিত RESTful ওয়েব পরিষেবাগুলির জন্য উপস্থিত হয়েছিল, তবে এটি একটি পৃথক নিবন্ধের বিষয়। ভূমিকা এখানেই শেষ হতে পারে, কারণ... এরপর আমরা JAX-WS এর সাথে কাজ করা শিখব।

সাধারণ পদ্ধতির

ওয়েব পরিষেবাগুলিতে সর্বদা একটি ক্লায়েন্ট এবং একটি সার্ভার থাকে। সার্ভারটি আমাদের ওয়েব পরিষেবা এবং কখনও কখনও এটিকে শেষ পয়েন্ট বলা হয় (যেমন, শেষ বিন্দু যেখানে ক্লায়েন্ট থেকে SOAP বার্তা পৌঁছায়)। আমাদের নিম্নলিখিতগুলি করতে হবে:
  1. আমাদের ওয়েব সার্ভিসের ইন্টারফেস বর্ণনা করুন
  2. এই ইন্টারফেস বাস্তবায়ন
  3. আমাদের ওয়েব পরিষেবা চালু করুন
  4. একটি ক্লায়েন্ট লিখুন এবং দূরবর্তীভাবে পছন্দসই ওয়েব পরিষেবা পদ্ধতিতে কল করুন
আপনি বিভিন্ন উপায়ে একটি ওয়েব পরিষেবা চালু করতে পারেন: হয় প্রধান পদ্ধতি সহ একটি ক্লাস বর্ণনা করুন এবং ওয়েব পরিষেবাটিকে সরাসরি একটি সার্ভার হিসাবে চালু করুন, অথবা এটিকে টমক্যাট বা অন্য কোনও সার্ভারে স্থাপন করুন৷ দ্বিতীয় ক্ষেত্রে, আমরা নিজেরা একটি নতুন সার্ভার চালু করি না এবং কম্পিউটারে অন্য পোর্ট খুলি না, তবে কেবল টমক্যাট সার্লেট কন্টেইনারকে বলি যে "আমরা এখানে ওয়েব পরিষেবা ক্লাস লিখেছি, দয়া করে সেগুলি প্রকাশ করুন যাতে যারা আপনার সাথে যোগাযোগ করে তারা প্রত্যেকে তা করতে পারে। আমাদের ওয়েব পরিষেবা ব্যবহার করুন।" ওয়েব সার্ভিস চালু করার পদ্ধতি যাই হোক না কেন, আমাদের একই ক্লায়েন্ট থাকবে।

সার্ভার

আসুন আইডিইএ চালু করি এবং একটি নতুন প্রকল্প তৈরি করি নতুন প্রকল্প তৈরি করুন. এর নাম নির্দেশ করা যাক হ্যালোওয়েবসার্ভিসএবং বোতাম টিপুন পরবর্তী, তারপর বোতাম শেষ করুন. ফোল্ডারে srcআসুন একটি প্যাকেজ তৈরি করি ru.javarush.ws. এই প্যাকেজে আমরা HelloWebService ইন্টারফেস তৈরি করব: package ru। javarush ws; // এগুলো টীকা, যেমন আমাদের ক্লাস এবং পদ্ধতি চিহ্নিত করার একটি উপায়, // ওয়েব পরিষেবা প্রযুক্তির সাথে সম্পর্কিত javax আমদানি করুন। jws ওয়েব পদ্ধতি; javax আমদানি করুন। jws একটি বন্ধু পূর্ণ নাম লিখুন; javax আমদানি করুন। jws সাবান SOAPBinding; // আমরা বলি যে আমাদের ইন্টারফেস একটি ওয়েব পরিষেবা হিসাবে কাজ করবে@একটি বন্ধু পূর্ণ নাম লিখুন // আমরা বলি যে ওয়েব পরিষেবা কল পদ্ধতি ব্যবহার করা হবে@SOAPBinding (স্টাইল = SOAPBinding। শৈলী। RPC) পাবলিক ইন্টারফেস HelloWebService ( // আমরা বলি যে এই পদ্ধতিটি দূরবর্তীভাবে বলা যেতে পারে@WebMethod পাবলিক স্ট্রিং getHelloString(স্ট্রিং নাম); ) এই কোডে, WebService এবং WebMethod ক্লাসগুলি তথাকথিত টীকা এবং আমাদের ইন্টারফেস এবং এর পদ্ধতিকে ওয়েব পরিষেবা হিসাবে চিহ্নিত করা ছাড়া কিছুই করে না। একই SOAPBinding ক্লাসে প্রযোজ্য। শুধুমাত্র পার্থক্য হল যে SOAPBinding পরামিতি সহ একটি টীকা। এই ক্ষেত্রে, স্টাইল প্যারামিটারটি এমন একটি মান সহ ব্যবহার করা হয় যা নির্দেশ করে যে ওয়েব পরিষেবাটি নথি বার্তাগুলির মাধ্যমে নয়, একটি ক্লাসিক RPC হিসাবে কাজ করবে, যেমন একটি পদ্ধতি কল করতে। আসুন আমাদের ইন্টারফেস লজিক বাস্তবায়ন করি এবং আমাদের প্যাকেজে একটি HelloWebServiceImpl ক্লাস তৈরি করি। যাইহোক, আমি লক্ষ্য করেছি যে Impl দিয়ে একটি ক্লাস শেষ করা জাভাতে একটি কনভেনশন, যা অনুসারে ইন্টারফেসের বাস্তবায়নকে এত মনোনীত করা হয়েছে (Impl - শব্দটি বাস্তবায়ন থেকে, অর্থাত্ বাস্তবায়ন)। এটি একটি প্রয়োজনীয়তা নয় এবং আপনি যা চান ক্লাসের নাম দিতে স্বাধীন, তবে ভাল আচরণের জন্য এটি প্রয়োজন: প্যাকেজ রু। javarush ws; // ইন্টারফেস বর্ণনা করার সময় একই টীকা, javax আমদানি করুন। jws একটি বন্ধু পূর্ণ নাম লিখুন; // কিন্তু এখানে এটি endpointInterface প্যারামিটারের সাথে ব্যবহার করা হয়, // আমাদের ওয়েব সার্ভিসের ইন্টারফেস ক্লাসের পুরো নাম নির্দেশ করে@ওয়েবসার্ভিস(এন্ডপয়েন্ট ইন্টারফেস= "ru.javarush.ws.HelloWebService") পাবলিক ক্লাস HelloWebServiceImpl HelloWebService প্রয়োগ করে ( @Override public String getHelloString (স্ট্রিং নাম) ( // শুধু অভিবাদন ফিরিয়ে দিনফিরুন "হ্যালো, " + নাম + "!" ; ) ) আসুন একটি স্বাধীন সার্ভার হিসাবে আমাদের ওয়েব পরিষেবা চালু করি, যেমন কোন টমক্যাট এবং অ্যাপ্লিকেশন সার্ভারের অংশগ্রহণ ছাড়াই (এটি একটি পৃথক আলোচনার জন্য একটি বিষয়)। এটি করার জন্য, ফোল্ডারে প্রকল্প কাঠামোতে srcআসুন একটি প্যাকেজ ru.javarush.endpoint তৈরি করি, এবং এতে আমরা একটি HelloWebServicePublisher ক্লাস তৈরি করব প্রধান পদ্ধতি: প্যাকেজ ru। javarush শেষপ্রান্ত; // ওয়েব পরিষেবাগুলির সাথে একটি ওয়েব সার্ভার চালানোর জন্য ক্লাস javax আমদানি করুন। xml ws শেষপ্রান্ত; // আমাদের ওয়েব পরিষেবার ক্লাসআমদানি ru. javarush ws HelloWebServiceImpl; পাবলিক ক্লাস HelloWebServicePublisher ( পাবলিক স্ট্যাটিক ভ্যায়েড মেইন (স্ট্রিং... args) ( // 1986 পোর্টে ওয়েব সার্ভার শুরু করুন // এবং প্রথম আর্গুমেন্টে উল্লেখিত ঠিকানায়, // দ্বিতীয় যুক্তিতে পাস করা ওয়েব পরিষেবা শুরু করুনশেষপ্রান্ত. প্রকাশ ( "http://localhost:1986/wss/hello", নতুন HelloWebServiceImpl () ); ) ) এখন ক্লিক করে এই ক্লাস রান করা যাক Shift+F10. কনসোলে কিছুই প্রদর্শিত হবে না, কিন্তু সার্ভার চলছে। আপনি আপনার ব্রাউজারে http://localhost:1986/wss/hello?wsdl লাইনটি টাইপ করে এটি যাচাই করতে পারেন। যে পৃষ্ঠাটি খোলে, তা একদিকে প্রমাণ করে যে আমাদের কম্পিউটারে (স্থানীয় হোস্ট) পোর্ট 1986-এ চলমান একটি ওয়েব সার্ভার (http://) রয়েছে এবং অন্যদিকে, আমাদের ওয়েব পরিষেবার একটি WSDL বিবরণ দেখায়৷ আপনি যদি অ্যাপ্লিকেশনটি বন্ধ করেন, তবে বিবরণটি অনুপলব্ধ হয়ে যাবে, যেমন ওয়েব পরিষেবা নিজেই হবে, তাই আমরা এটি করব না, তবে ক্লায়েন্ট লেখার দিকে এগিয়ে যান।

ক্লায়েন্ট

প্রকল্প ফোল্ডারে srcআসুন একটি প্যাকেজ তৈরি করি ru.javarush.client , এবং এতে HelloWebServiceClient ক্লাসটি প্রধান পদ্ধতি সহ: প্যাকেজ ru। javarush ক্লায়েন্ট; // wsdl বিবরণ পেতে এবং এর মাধ্যমে প্রয়োজন // নিজেই ওয়েব পরিষেবাতে পৌঁছানজাভা আমদানি করুন। নেট URL; // একটি URL অবজেক্টের সাথে কাজ করার সময় এই ব্যতিক্রম ঘটবেজাভা আমদানি করুন। নেট বিকৃত URL ব্যতিক্রম; // wsdl বিবরণ সহ xml পার্স করার জন্য ক্লাস // এবং এটিতে পরিষেবা ট্যাগে পৌঁছান javax আমদানি করুন। xml নামস্থান QName; javax আমদানি করুন। xml ws সেবা; // আমাদের ওয়েব পরিষেবার ইন্টারফেস (আমাদের আরও প্রয়োজন)আমদানি ru. javarush ws হ্যালোওয়েবসার্ভিস; পাবলিক ক্লাস HelloWebServiceClient ( পাবলিক স্ট্যাটিক ভ্যাইড মেইন (স্ট্রিং আর্গস) ম্যালফর্মডইউআরএলএক্সেপশন ( // wsdl বর্ণনার একটি লিঙ্ক তৈরি করুন URL url = নতুন URL ( "http://localhost:1986/wss/hello?wsdl") ; // আমরা WSDL বর্ণনা - সংজ্ঞার প্রথম ট্যাগে পরবর্তী কনস্ট্রাক্টরের পরামিতিগুলি দেখি // টার্গেটনেমস্পেস অ্যাট্রিবিউটে ১ম আর্গুমেন্টটি দেখুন // নামের বৈশিষ্ট্যে ২য় আর্গুমেন্টটি দেখুন QName qname = নতুন QName ("http://ws.site/" , "HelloWebServiceImplService" ); // এখন আমরা wsdl বিবরণে পরিষেবা ট্যাগে পৌঁছাতে পারি,সেবা সেবা = সেবা। তৈরি করুন (url, qname); // এবং তারপর পোর্ট ট্যাগ পর্যন্ত এটি নেস্টেড, যাতে // আমাদের কাছ থেকে দূরবর্তী একটি ওয়েব পরিষেবা বস্তুর একটি লিঙ্ক পানহ্যালোওয়েবসার্ভিস হ্যালো = সার্ভিস। getPort(HelloWebService.class); // হুররে! আপনি এখন দূরবর্তী পদ্ধতিতে কল করতে পারেনপদ্ধতি. আউট println (হ্যালো। getHelloString ( "JavaRush" ) ); ) ) আমি তালিকার কোডে সর্বাধিক মন্তব্য দিয়েছি। আমার যোগ করার কিছু নেই, তাই চলুন (Shift+F10) চালাই। আমাদের কনসোলে লেখাটি দেখতে হবে: হ্যালো, জাভারাশ! আপনি যদি এটি না দেখে থাকেন তবে আপনি সম্ভবত ওয়েব পরিষেবা শুরু করতে ভুলে গেছেন।

উপসংহার

এই বিষয়টি ওয়েব পরিষেবাগুলিতে একটি সংক্ষিপ্ত ভ্রমণ প্রদান করেছে। আবারও, আমি বলব যে আমি যা লিখেছি তার বেশিরভাগই এটি কীভাবে কাজ করে তা আমার অনুমান, এবং তাই আপনার আমাকে খুব বেশি বিশ্বাস করা উচিত নয়। জ্ঞানী লোকেরা আমাকে সংশোধন করলে আমি কৃতজ্ঞ হব, কারণ তখন আমি কিছু শিখব। ইউপিডি।

ডেটা বিনিময় সাধারণত এক প্রোগ্রাম থেকে ফাইল আপলোড করে অন্য প্রোগ্রামে লোড করার মাধ্যমে সংগঠিত হয়। কিছু প্রোগ্রামার 1C SQL ডাটাবেসে অ্যাক্সেস সহ তৃতীয় পক্ষের প্রোগ্রামগুলি প্রদান করে (যা দৃঢ়ভাবে নিরুৎসাহিত বলে মনে হয়)।

"ডেটা এক্সচেঞ্জ" শব্দটি সবসময় কাজের জন্য উপযুক্ত নয়; উদাহরণস্বরূপ, একটি বাহ্যিক প্রোগ্রামকে সনাক্ত করতে হবে যে এই ধরনের একটি ক্লায়েন্ট 1C এবং এর ভারসাম্যে বিদ্যমান কিনা।

1C ডেটাতে অ্যাক্সেস প্রদান করা ডেটা নিরাপত্তার কারণে ভুল। আরও ব্যালেন্স রিটার্ন সহ নাম এবং পাসওয়ার্ড দ্বারা একটি যাচাইকরণ পদ্ধতির প্রয়োজন।

এই পদ্ধতিটিকে একটি পরিষেবা পদ্ধতি বলা হয়, যখন প্রোগ্রামটি ডেটা সরবরাহ করে না, তবে একটি পরিষেবা যা আপনাকে ক্লায়েন্টকে সনাক্ত করতে এবং তার ভারসাম্য খুঁজে বের করতে দেয়।

কিভাবে এটা কাজ করে?

SOAP প্রোটোকল ব্যবহার করে একটি অনুরোধের মাধ্যমে বাইরে থেকে ফাংশনগুলিকে ডাকা হয় (লঞ্চ করা হয়)৷

পরামিতি এবং ফলাফল পাস করতে ব্যবহৃত হয়। ওয়েব পরিষেবাগুলির সাথে কাজ করার জন্য, আপনার অবশ্যই একটি প্রাথমিক ধারণা থাকতে হবে৷

ওয়েব পরিষেবা 1C

1C ওয়েব পরিষেবা হল এমন একটি পদ্ধতি যার মাধ্যমে আপনি 1C ডাটাবেসের বাইরে কিছু 1C ফাংশন চালু করার অনুমতি দিতে পারেন, অন্যান্য প্রোগ্রাম বা অন্যান্য 1C ডাটাবেস থেকেও।

এটি 1C ডেটাতে সরাসরি অ্যাক্সেস দেওয়ার চেয়ে ভাল, যেহেতু 1C ওয়েব পরিষেবার একটি পদ্ধতি (ফাংশন) কল করার সময়, বাহ্যিক প্রোগ্রামের ডেটাতে অ্যাক্সেস থাকে না। 1C ভাষার একটি ফাংশন স্বাধীনভাবে পাস করা প্যারামিটারের (উদাহরণস্বরূপ, নাম এবং পাসওয়ার্ড) উপর ভিত্তি করে একটি নির্দিষ্ট পরিমাণ ডেটা পাওয়ার জন্য একটি বহিরাগত প্রোগ্রামের অধিকার নির্ধারণ করে।

অনেক ক্ষেত্রে, আপনি নিজের XDTO প্যাকেজ তৈরি করতে পারবেন না, তবে তালিকা থেকে www.sample-package.org প্যাকেজটি নির্বাচন করে ডিফল্টটি ব্যবহার করুন

1C ওয়েব পরিষেবা পদ্ধতি

এর পরে, আপনাকে ফাংশনগুলির একটি তালিকা যুক্ত করতে হবে (1C ওয়েব পরিষেবার পদ্ধতিগুলি) যা বাহ্যিকভাবে সরবরাহ করা হবে। তাদের ইংরেজিতে ডাকলে ভালো হয়। একটি ফাংশনের পরামিতি থাকতে পারে।

ব্যবহার করার জন্য মৌলিক প্রকার:

  • স্ট্রিং - স্ট্রিং
  • int বা পূর্ণসংখ্যা - পূর্ণ সংখ্যা
  • বাস্তব - ভগ্নাংশ সংখ্যা
  • তারিখ - তারিখ।

1C ওয়েব পরিষেবার প্রতিটি যুক্ত ফাংশনের জন্য, আপনাকে এটিকে বৈশিষ্ট্যগুলিতে তৈরি করতে হবে, ঠিক যেমন আমরা তৈরি করেছি, ইত্যাদি।

এটি এই 1C ফাংশন যা 1C ওয়েব পরিষেবা পদ্ধতিতে কল করার সময় কার্যকর করা হবে। ভুলে যাবেন না যে এটি 1C সার্ভারে সঞ্চালিত হবে। 1C ওয়েব পরিষেবাগুলির সাথে কাজ করার ফাইল মোড সুপারিশ করা হয় না।

একটি ফাংশন সাধারণত কিছু ডেটা ফেরত দেয়। সাধারণত টাইপটি স্ট্রিং এবং একটি XML স্ট্রিং ফেরত দেওয়া হয়।

একটি XML স্ট্রিং এর জন্য 1C ভাষা বস্তু ব্যবহার করে তৈরি করা যেতে পারে, অথবা আপনি কেবল একটি পাঠ্য স্ট্রিং তৈরি করতে পারেন যেখানে XML পাঠ্য সংরক্ষণ করা হয়।

একটি 1C ওয়েব পরিষেবা প্রকাশ করা হচ্ছে

যেমনটি আমরা আগেই বলেছি, অন্যান্য প্রোগ্রামগুলিকে অবশ্যই "জানে" যে 1C ওয়েব পরিষেবাটি বিদ্যমান, এই জাতীয় পদ্ধতির তালিকা রয়েছে ইত্যাদি।

বিবরণ ওয়েবসাইটে থাকা উচিত. এটি করার জন্য আপনার প্রয়োজন:

  • একটি ওয়েবসাইট আছে
  • 1C ওয়েব পরিষেবার বৈশিষ্ট্যগুলিতে, এক্সটেনশন 1cws সহ ফাইলের নাম উল্লেখ করুন, যা WSDL বিবরণের একটি লিঙ্ক
  • অ্যাডমিনিস্ট্রেশন/পাবলিশ অন ওয়েব সার্ভার মেনু আইটেম ব্যবহার করে কনফিগারেটে ওয়েবসাইটে এই ফাইলটি আপলোড করুন।

ব্রাউজারটির কিছু ধরণের XML ফাইল প্রদর্শন করা উচিত (এখানে একটি WSDL ফাইলের একটি উদাহরণ http://ru.wikipedia.org/wiki/WSDL), এবং কোনও ত্রুটি নয়, একটি ফাঁকা পৃষ্ঠা নয় এবং কোনও এনকোডিংয়ে অস্পষ্ট পাঠ্য নয়।

সফল প্রকাশনার পরে, 1C ওয়েব পরিষেবা ব্যবহার করা যেতে পারে। এটি করার জন্য, অন্য একটি প্রোগ্রামে আপনাকে 1C ওয়েব পরিষেবার লিঙ্কগুলির জন্য এই ইন্টারনেট ঠিকানাটি ব্যবহার করতে হবে।

উদাহরণস্বরূপ, ভিজ্যুয়াল স্টুডিও যেকোন ভাষাকে (C++, C#, ভিজ্যুয়াল বেসিক) এর WSDL বর্ণনা অনুযায়ী একটি প্রকল্পে 1C ওয়েব পরিষেবা অন্তর্ভুক্ত করতে এবং 1C ওয়েব পরিষেবা ব্যবহার করার জন্য একটি ক্লাস তৈরি করার অনুমতি দেয়।

আমরা মেকানিজম ব্যবহারের সাধারণ ধারণাগুলো দেখেছি « ওয়েব-সেবা".এর কিছু জ্ঞান রিফ্রেশ করা যাক.

ওয়েব পরিষেবাগুলি একটি সার্ভার এবং একটি ক্লায়েন্টের মধ্যে ডেটা বিনিময় করতে ব্যবহৃত হয়; এক্সএমএল ফর্ম্যাটটি যোগাযোগে উভয় পক্ষের মধ্যে পারস্পরিক বোঝাপড়ার জন্য ডেটা "প্যাকেজ" করতে ব্যবহৃত হয়।

অধ্যায়আমি

বাস্তবায়ন উদাহরণওয়েব- 1C: এন্টারপ্রাইজ সিস্টেমে পরিষেবা

টাস্ক:এটি একটি ওয়েব পরিষেবা তৈরি করা প্রয়োজন, যা অ্যাক্সেস করে ক্লায়েন্টরা তাদের অ্যাপ্লিকেশনগুলির সমস্ত প্রয়োজনীয় তথ্য নির্ধারণ করতে পারে।

কাজটি একটি প্রদর্শনী এবং প্রক্রিয়াটি বোঝার এবং শেখানোর জন্য শুধুমাত্র একটি উদাহরণ হিসাবে কাজ করেওয়েব-সেবা.

সমাধান:

ধাপ 1.আসুন একটি নতুন কনফিগারেশন বিকাশের জন্য কনফিগারেশন ছাড়াই একটি নতুন তথ্য ভিত্তি তৈরি করি।

ধাপ ২.কনফিগারেশনে বেশ কিছু নতুন অবজেক্ট যোগ করা যাক

ডিরেক্টরি "ক্লায়েন্ট";

নথি "আবেদন";

গণনা "রিকোয়েস্ট স্ট্যাটাস"।

ধাপ 3.আসুন একটি নতুন XDTO প্যাকেজ তৈরি করি।

কেন এবং কি উদ্দেশ্যে আমরা একটি XDTO প্যাকেজ তৈরি করছি? XDTO মেকানিজম ব্যবহার সম্পর্কে আরও তথ্য পাওয়া যাবে "অধ্যায় 16. বিকাশকারীর নির্দেশিকা" এবং৷

আসুন সংক্ষিপ্তভাবে উল্লেখ করি যে XDTO প্রক্রিয়া হল বিভিন্ন বাহ্যিক ডেটা উত্স এবং সফ্টওয়্যার সিস্টেমের সাথে মিথস্ক্রিয়া করার জন্য ডেটা উপস্থাপনের একটি সর্বজনীন উপায়।

আমাদের ক্ষেত্রে, ওয়েব পরিষেবার রিটার্ন মান বর্ণনা করার জন্য একটি XDTO প্যাকেজ তৈরি করা হয়েছে।

আসুন "সাধারণ" শাখাটি প্রসারিত করি → "এক্সডিটিও প্যাকেজ" → যোগ করুন...

XDTO প্যাকেজের নাম উল্লেখ করা যাক " ডকুমেন্টস ডেটা"এবং এর নামস্থান http://localhost/request বা http://192.168.1.76/request (বোঝা এবং শেখার প্রক্রিয়া সহজতর করার জন্য, আমরা কম্পিউটারের স্থানীয় আইপি ঠিকানা নির্দেশ করি যেখানে ওয়েব সার্ভার ইনস্টল করা আছে (সমর্থিত ওয়েব সার্ভার: আইআইএস বা অ্যাপাচি))। প্রতিটি ওয়েব পরিষেবা তার নাম এবং এটির অন্তর্গত নামস্থানের URI দ্বারা স্বতন্ত্রভাবে সনাক্ত করা যেতে পারে।

আমাদের প্যাকেজে দুটি ধরণের XDTO অবজেক্ট রয়েছে:

1) গ্রাহক- "ক্লায়েন্ট" ডিরেক্টরি উপাদান থেকে ডেটা স্থানান্তর করতে।

- নাম ;

2) দলিল- "অ্যাপ্লিকেশন" নথি থেকে ডেটা স্থানান্তর করতে

এই XDTO অবজেক্ট টাইপটিতে নিম্নলিখিত বৈশিষ্ট্য থাকবে:

- গ্রাহক- নামস্থান http://192.168.1.76/request থেকে গ্রাহকের প্রকার ; আমরা উপরে সংজ্ঞায়িত XDTO অবজেক্টের একটি রেফারেন্স উপস্থাপন করে;

- স্ট্যাটাস- নামস্থান http://www.w3.org/2001/XMLSchema থেকে স্ট্রিং টাইপ;

- সংখ্যাদার- নামস্থান http://www.w3.org/2001/XMLSchema থেকে স্ট্রিং টাইপ।

ধাপ 4।কনফিগারেশনে একটি নতুন ওয়েব পরিষেবা যোগ করা যাক

আসুন শাখা প্রসারিত করা যাক “সাধারণ” → “ওয়েব পরিষেবা” → যোগ করুন…

ওয়েব পরিষেবার জন্য, আমরা নিম্নলিখিত সম্পত্তি মানগুলি নির্দিষ্ট করি:

নাম - ডকুমেন্টস ডেটা

নামস্থান URI - http://192.168.1.76/request

XDTO প্যাকেজ - ডকুমেন্টস ডেটাবাhttp://192.168.1.76/request

প্রকাশনার ফাইলের নাম- অনুরোধ.1cws

ধাপ 5।তৈরি ওয়েব পরিষেবার জন্য আমরা অপারেশনটি সংজ্ঞায়িত করব " তথ্য নাও»

অপারেশন সম্পত্তি মান:

রিটার্নের ধরন- নথি (http://192.168.1.76/request)

সম্ভবত খালি মান - সত্য

পদ্ধতির নাম- তথ্য নাও.

ধাপ 6।অপারেশন এ তথ্য নাওআসুন নিম্নলিখিত সম্পত্তি মানগুলির সাথে গ্রাহক প্যারামিটার সংজ্ঞায়িত করি:

মান প্রকার - প্রকার স্ট্রিংনামস্থান http://www.w3.org/2001/XMLSchema থেকে;

স্থানান্তর দিক- ইনপুট.

ধাপ 7চলুন তৈরি করা ওয়েব পরিষেবাটির মডিউলটি খুলুন এবং এতে Get() ফাংশনটি রাখুন, যা এই ওয়েব পরিষেবাটি কল করার সময় কার্যকর করা হবে।

ফাংশন GetData(Customer) // XDTO অবজেক্টের প্রকারগুলি পান ClientType = FactoryXDTO.Type("http://192.168.1.76/request", "Customer"); RequestType = FactoryXDTO.Type("http://192.168.1.76/request", "নথিপত্র"); // ক্লায়েন্ট ক্লায়েন্টলিঙ্ক পান = Directories.Clients.FindByName(Customer); যদি ValueFilled(ClientRef) না হয় তাহলে Undefined রিটার্ন করুন; যদি শেষ; অনুরোধ = নতুন অনুরোধ; Request.Text = "শীর্ষ 1 নির্বাচন করুন | আবেদন. লিঙ্ক, | প্রতিনিধিত্ব(অ্যাপ্লিকেশন. স্ট্যাটাস) স্থিতি হিসাবে, | আবেদন. নম্বর | থেকে | নথি৷ আবেদন হিসাবে অনুরোধ | কোথায় | আবেদন৷ ক্লায়েন্ট = & ক্লায়েন্ট"; Request.SetParameter("ক্লায়েন্ট", ক্লায়েন্টলিঙ্ক); RequestResult = Request.Execute(); যদি QueryResult.Empty() তাহলে Undefined রিটার্ন করুন; যদি শেষ; নির্বাচন = QueryResult.Select(); নির্বাচন। পরবর্তী(); ডকুমেন্ট = Selection.Link.GetObject(); // অর্ডারের একটি XDTO অবজেক্ট তৈরি করুন Order = FactoryXDTO.Create(OrderType); Application.Numder = Sample.Number; ক্লায়েন্ট = FactoryXDTO.Create(ClientType); Client.Name = ClientLink.Name; Application.Customer = ক্লায়েন্ট; Application.Status = Selection.Status; // রিটার্ন রিটার্ন অ্যাপ্লিকেশান রিটার্ন করুন; এন্ড ফাংশন

ধাপ 8ওয়েব সার্ভারে তৈরি ওয়েব পরিষেবা প্রকাশ করা যাক।

মেনু আইটেম কনফিগারার: ​​"প্রশাসন" → "একটি ওয়েব সার্ভারে প্রকাশ"।

"ওয়েব পরিষেবাগুলি" ট্যাবে, "ওয়েব পরিষেবাগুলি প্রকাশ করুন" চেকবক্স সেট করুন এবং আমাদের নতুন ওয়েব পরিষেবার পাশের বাক্সটিও চেক করুন৷

অধ্যায়

আপিলের উদাহরণওয়েব- 1C: তৃতীয় পক্ষের আবেদন থেকে এন্টারপ্রাইজ সিস্টেম পরিষেবা

1C:এন্টারপ্রাইজ সিস্টেমে ওয়েব পরিষেবা ব্যবস্থার মূল উদ্দেশ্য হল তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলিতে প্রয়োজনীয় ডেটা স্থানান্তর করা।

আসুন এই নিবন্ধের প্রথম বিভাগ থেকে ডেলফিতে আমাদের ওয়েব পরিষেবাকে কল করার একটি অ্যাপ্লিকেশন বিকাশের একটি উদাহরণ দেখি।

ধাপ 1.আসুন একটি নতুন প্রকল্প তৈরি করি এবং ফর্মটিতে বেশ কয়েকটি নিয়ন্ত্রণ রাখি

পাঠ্য ক্ষেত্র - ওয়েব পরিষেবা থেকে প্রাপ্ত তথ্য প্রদর্শন করতে ব্যবহৃত হয়;

দুটি বোতাম - পাঠ্য ক্ষেত্র পরিষ্কার করা এবং ওয়েব পরিষেবা অ্যাক্সেস করা;

একটি ইনপুট ক্ষেত্র হল ওয়েব সার্ভিসে পাস করা একটি প্যারামিটার।

ধাপ ২.একটি WSDL ফাইল আমদানি করা হচ্ছে

ফলস্বরূপ, আমরা একটি নতুন মডিউল পেতে অনুরোধ(আমরা এই নামটি সরাসরি 1C তে সংজ্ঞায়িত করেছি)। এই মডিউলটিতে ওয়েব পরিষেবার সমস্ত প্রয়োজনীয় তথ্য রয়েছে।

ধাপ 3.আসুন একটি ওয়েব সার্ভিস কল হ্যান্ডলার লিখি

DocumentDataPortType ভেরিয়েবলটি ইতিমধ্যেই মডিউলে সংজ্ঞায়িত করা হয়েছে অনুরোধ

ধাপ 4।অ্যাপ্লিকেশন চালু করুন এবং পরীক্ষা চালান।

অধ্যায়III

আপিলের উদাহরণওয়েব-1C: এন্টারপ্রাইজ সিস্টেমে পরিষেবা

ধাপ 1.আসুন "WEB_Service" নামে একটি নতুন বাহ্যিক প্রক্রিয়াকরণ তৈরি করি

ধাপ ২.চলুন প্রক্রিয়াকরণের জন্য একটি নতুন ফর্ম সংজ্ঞায়িত করা যাক

ধাপ 3.আমরা ফর্মটিতে বেশ কয়েকটি বিবরণ নির্দেশ করব

ক্লায়েন্ট - টাইপ করুন "স্ট্রিং"

ক্লায়েন্ট রিটার্ন - টাইপ করুন "স্ট্রিং"

নম্বর রিটার্ন - টাইপ করুন "স্ট্রিং"

StatusReturn - "স্ট্রিং" টাইপ করুন।

আমরা ফর্মে বিস্তারিত প্রদর্শন করব।

ধাপ 4।আসুন একটি ফর্ম কমান্ড যোগ করি " তথ্য পেতে»

কমান্ড হ্যান্ডলার উল্লেখ করা যাক

&OnClient পদ্ধতি GetData(Command) GetDataOnServer(Client); পদ্ধতির সমাপ্তি GetDataOnServer(Client) // লিঙ্কের উপর ভিত্তি করে একটি WS প্রক্সি তৈরি করুন এবং Get() অপারেশন ডেফিনিশন = New WSD Definitions("http://192.168.1.76/WEB_Service/ws/request.1cws?wsdl") সম্পাদন করুন ; প্রক্সি = নতুন WSProxy(সংজ্ঞা, "http://192.168.1.76/request", "DocumentsData", "DocumentsDataSoap"); অ্যাপ্লিকেশন ডেটা = Proxy.GetData(ক্লায়েন্ট); যদি অ্যাপ্লিকেশন ডেটা = অনির্ধারিত তাহলে ClientReturn = "Undefined"; StatusReturn = "অনির্ধারিত"; ReturnNumber = "Undefined"; প্রত্যাবর্তন; যদি শেষ; CustomerReturn = Application Data.Customer.Name; StatusReturn = Application Data.Status; রিটার্ন নম্বর = Application Data.Numder; শেষ প্রক্রিয়া

1C: এন্টারপ্রাইজ সিস্টেম দুটি উপায়ে অন্যান্য প্রদানকারীদের দ্বারা প্রদত্ত ওয়েব পরিষেবাগুলি ব্যবহার করতে পারে:

ব্যবহার করে স্থিরকনফিগারেশন ট্রিতে তৈরি করা লিঙ্ক;

"প্লাস":উচ্চ গতি;

"মাইনাস":কনফিগারেশন ব্যবহার করে WSDL বিবরণ পুনরায় আমদানি করা এবং পরিবর্তিত কনফিগারেশন সংরক্ষণ করা।

ব্যবহার করে গতিশীলঅন্তর্নির্মিত ভাষা সরঞ্জাম দ্বারা তৈরি লিঙ্ক

(অনুসঙ্গে, গতিশীলদের জন্য স্ট্যাটিকগুলির "অপরাধ" হল "সুবিধা")

অধ্যায়IV

1C: এন্টারপ্রাইজ সিস্টেমে ডিবাগিং ওয়েব পরিষেবা

একটি স্থানীয় ওয়েব পরিষেবার জন্য আপনার প্রয়োজন:

ধাপ 1.ফাইলটি ক্লায়েন্টে রাখুন যেখানে 1C সিস্টেম চলে webservicecfg.xmlনিম্নলিখিত বিষয়বস্তু সঙ্গে

ধাপ ২.নথিতে ডিফল্ট. vrdকনফিগারেশন প্রকাশ লাইন যোগ করুন

ধাপ 3.কনফিগারেটে, মেনু আইটেমটি নির্বাচন করুন

"ডিবাগ" → "সংযোগ" → "স্বয়ংক্রিয় সংযোগ" → "সার্ভারে ওয়েব পরিষেবাদি"

ধাপ 4।"ঠিক আছে" বোতামে ক্লিক করুন

সার্ভার বিকল্পের জন্য, আপনাকে কী দিয়ে ডিবাগিং মোডে 1c সার্ভার চালাতে হবে /ডিবাগ

1C-তে ওয়েব পরিষেবাগুলির সাহায্যে, বিভিন্ন অ্যাপ্লিকেশন এবং পরিষেবাগুলির মধ্যে ডেটা বিনিময় সংগঠিত করা সম্ভব হয়েছিল। একই সময়ে, 1C যেকোন ডেটার (মূল্য তালিকা, ব্যালেন্স শীট, বোর্ড কম্পোজিশন, ইত্যাদি) এবং পরিষেবা এবং অন্যান্য সংস্থান থেকে তথ্যের প্রাপক হিসাবে উভয়ই কাজ করতে পারে:

  • ট্রেন, বাস, প্লেনের সময়সূচী;
  • বিনিময় হার;
  • একটি নির্দিষ্ট সংস্থান থেকে পণ্যের একটি তালিকা।

SOAP এর ভিত্তিতে ডেটা বিনিময় ঘটে, যেমন কাঠামোগত বার্তা ব্যবহার করে। বার্তাগুলি নিজেই XML স্কিমাগুলির উপর ভিত্তি করে এবং এই অভিব্যক্তিগুলির মান অনুসারে তৈরি করা হয়। ওয়েব সার্ভিস স্পেসিফিকেশন ভাষাও প্রমিত - WDSL।

HTTP প্রোটোকল ব্যবহার করে অ্যাপ্লিকেশন এবং সংস্থানগুলির মধ্যে বার্তা প্রেরণ করা হয়।

এই নীতি বাস্তবায়নের জন্য, একটি নতুন মেটাডেটা অবজেক্ট, ওয়েব পরিষেবা, কনফিগারেশনে যোগ করা হয়েছিল (চিত্র 1)

চিত্র থেকে দেখা যায়, আপনি "সাধারণ" ট্যাবে এই বস্তুটি খুঁজে পেতে পারেন।

একটি নতুন ওয়েব পরিষেবা তৈরি করা হচ্ছে

অন্যান্য মেটাডেটা অবজেক্টের মতো, কনফিগারটর থেকে একটি নতুন ওয়েব পরিষেবা যোগ করা হয়।

পরিষেবা তৈরির উইন্ডোটি চিত্র 2-এ দেখানো হয়েছে

চিত্র 2

  1. প্রথম ট্যাবে আপনাকে নতুন বস্তুর নাম এবং উপস্থাপনা সংজ্ঞায়িত করতে হবে;
  2. পরিষেবাটি কোন সাবসিস্টেমে অংশগ্রহণ করবে তা দ্বিতীয় ট্যাবে "সাবসিস্টেম"-এ নির্ধারিত হয়;
  3. পরিষেবা দ্বারা সম্পাদিত অপারেটরগুলির তালিকা এবং সংজ্ঞা "অপারেশনস" ট্যাবে দেখা যেতে পারে এখানে আমরা অপারেশন দ্বারা প্রত্যাবর্তিত মানের প্রকার এবং অ্যালগরিদম সম্পাদিত পদ্ধতি বর্ণনা করি;
  4. আপনি URI (ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার) স্ট্রিং, URI নেমস্পেস ব্যবহার করে একটি সংস্থান সনাক্ত করতে পারেন, সেইসাথে XDTO প্যাকেজের বিবরণ "অন্যান্য" ট্যাবে পাওয়া যেতে পারে।

এইভাবে, আমাদের ডাটাবেসে আমরা একটি ওয়েব পরিষেবা সংজ্ঞায়িত করি যা তৃতীয় পক্ষের সংস্থান থেকে অ্যাক্সেস করা যেতে পারে।

একটি ওয়েব পরিষেবা তৈরি এবং কনফিগার করার আগে গৃহীত পদক্ষেপগুলি৷

তৃতীয় পক্ষের অ্যাক্সেস সহ একটি ওয়েব পরিষেবা তৈরি করার আগে, আপনাকে অবশ্যই:

  • সার্ভার শুরু করুন;
  • "ওয়েব সার্ভিস" এক্সটেনশন মডিউল ইনস্টল করুন;
  • সম্পদে ডাটাবেস প্রকাশ করুন।

"হ্যালোবাই" পরিষেবা তৈরি করার সবচেয়ে সহজ উদাহরণ

এই প্রক্রিয়াটি কীভাবে কাজ করে তা প্রদর্শন করতে, আমরা একটি ওয়েব পরিষেবা তৈরি করব যা, একটি জমা দেওয়া অনুরোধের প্রতিক্রিয়া হিসাবে, তিনটি মানগুলির মধ্যে একটি প্রদান করে: "হ্যালো!", "বাই!", "আমি বুঝতে পারছি না":

যদি, ওয়েব সার্ভারে প্রকাশ করার পরে, আপনি আপনার ব্রাউজারে পরিষেবার জন্য নির্ধারিত ঠিকানায় যান ("ইউআরআই নেমস্পেস" বৈশিষ্ট্যে নির্দিষ্ট লাইন এবং আপলোড ফাইলের নামের সাথে লাইন থাকে), আপনি দেখতে পারেন স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে আমাদের প্রকল্পের জন্য প্ল্যাটফর্ম দ্বারা তৈরি.

একটি ওয়েব পরিষেবা প্রকাশ করা মেনু আইটেম Administration->একটি ওয়েব সার্ভারে প্রকাশনা থেকে ঘটে।

উপরের উদাহরণে আমরা সিরিলিক বর্ণমালা ব্যবহার করেছি এবং প্ল্যাটফর্মটি কোনও সতর্কতা জারি করেনি তা সত্ত্বেও, ল্যাটিন অক্ষরে পরিষেবার নাম, অপারেশনের সংজ্ঞা এবং প্যারামিটারের নাম লেখা অনেক বেশি সঠিক।

আপনি পরিষেবাটির কার্যকারিতা বাড়াতে পারেন, ডেটা সেটগুলিকে সংজ্ঞায়িত করতে পারেন যেখানে এটি অ্যাক্সেস সরবরাহ করে এবং XDTO সিস্টেমে নির্ধারিত প্যাকেজগুলি ব্যবহার করে এই প্রক্রিয়াটি ব্যবহারের দক্ষতা উল্লেখযোগ্যভাবে প্রসারিত করতে পারে।

আসুন আমাদের সংস্থান থেকে ডেটা পান

আপনি এই উদ্দেশ্যে বিশেষভাবে তৈরি করা একটি মেটাডেটা অবজেক্ট ব্যবহার করে অন্য ডাটাবেস থেকে আমাদের ওয়েব পরিষেবা অ্যাক্সেস করতে পারেন, যাকে বলা হয় WS লিঙ্ক।

1C তৃতীয় পক্ষের ওয়েব পরিষেবা অ্যাক্সেস করার জন্য দুটি বিকল্প প্রদান করে:

  • সরাসরি একটি নতুন WS-লিংক কনফিগারেশন অবজেক্ট তৈরি করে;
  • ডাটাবেস কাঠামোকে প্রভাবিত না করে প্রোগ্রাম্যাটিকভাবে একটি লিঙ্ক তৈরি করুন।

আসুন প্রথম বিকল্প বিবেচনা করা যাক।

আমাদের ওয়েব পরিষেবা "যোগাযোগ" তৈরি করার ফলস্বরূপ, আমরা আমাদের পরিচিত ঠিকানায় অবস্থিত একটি নির্দিষ্ট সংস্থান পেয়েছি। এই ঠিকানাটিই আমাদের একটি WS লিঙ্ক তৈরি করার সময় প্রদর্শিত ডায়ালগ বক্সে প্রবেশ করতে হবে (চিত্র 5)

চিত্র.5

আমাদের পরিষেবার একটি ভার্চুয়াল মানচিত্র স্বয়ংক্রিয়ভাবে তৈরি হবে এবং কনফিগার ট্রিতে প্রতিফলিত হবে। বিশেষ করে, "গ্রিটিং" অপারেশন এবং এর একমাত্র প্যারামিটার প্রদর্শিত হবে।

এখন আমাদের ডাটাবেস থেকে আমরা অন্য যেকোন অবজেক্টের মতো ওয়েব সার্ভিস অ্যাক্সেস করতে পারি। বিশেষ করে, রিপোর্ট এবং প্রক্রিয়াকরণে এটি ব্যবহার করুন।

সবচেয়ে সহজ কোড যা আপনাকে আমাদের ওয়েব পরিষেবা থেকে প্রতিক্রিয়া পেতে দেয় তা চিত্র 6-এ উপস্থাপন করা হয়েছে

কোডের প্রথম লাইনে আমরা সংযোগের পরামিতিগুলি তৈরি এবং সংজ্ঞায়িত করি, দ্বিতীয়টিতে আমরা এটিতে পাস করা প্যারামিটার দিয়ে অপারেশনটি চালু করি (আপনি এটি প্রবেশ করার জন্য একটি ফর্ম বৈশিষ্ট্য তৈরি করতে পারেন)।

কনফিগারেশনে পরিবর্তন না করে আমাদের পরিষেবা ব্যবহার করার জন্য, চিত্র 6-এ উপস্থাপিত কোডের প্রথম লাইন দুটি (চিত্র 7) দিয়ে প্রতিস্থাপন করা প্রয়োজন:

চিত্র 7

এইভাবে, আমরা একটি নতুন মেটাডেটা অবজেক্ট তৈরিকে এর সংজ্ঞা দিয়ে প্রতিস্থাপিত করেছি, এবং কর্মের ক্রম এবং অ্যালগরিদম একই রয়ে গেছে।

ফলস্বরূপ, আমরা একটি সম্পূর্ণ কার্যকরী ব্যবস্থা পেয়েছি যা আমাদের দুটি ডাটাবেসের মধ্যে তথ্য বিনিময় করতে দেয়;


কীওয়ার্ড: ওয়েব পরিষেবা, ওয়েব পরিষেবা, SOAP, WSDL, ws লিঙ্ক

দাবিত্যাগ এবং ব্যবহারের শর্তাবলী

এই নিবন্ধে ঘটনাক্রমে উল্লিখিত সমস্ত ট্রেডমার্ক তাদের নিজ নিজ মালিকদের অন্তর্গত।
এই নিবন্ধটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক 3.0 আনপোর্টেড লাইসেন্সের অধীনে প্রকাশিত হয়েছে। http://creativecommons.org/licenses/by-sa/3.0/

আরেকটি দাবিত্যাগ (অনেকবার পরে)

1C: এন্টারপ্রাইজ 8 প্ল্যাটফর্ম ক্রমাগত বিকশিত হচ্ছে। অতএব, এই নিবন্ধে উপস্থাপিত কোড প্ল্যাটফর্মের সর্বশেষ সংস্করণে একটি ত্রুটি তৈরি করবে। এটি ঘটে, বিশেষ করে, একটি ওয়েব পরিষেবা প্রক্সি অবজেক্টের কলিং পদ্ধতির ক্রম পরিবর্তিত হওয়ার কারণে: উদাহরণস্বরূপ, জটিল বস্তুগুলিকে সংশ্লিষ্ট পরিষেবার ফ্যাক্টরি ব্যবহার করে যথাযথ প্রকারের একটি XDTO অবজেক্টে স্পষ্টভাবে রূপান্তর করতে হবে। . আপনি আমাদের ফোরামে বা "1C: এন্টারপ্রাইজ ইন্টিগ্রেশন টেকনোলজিস" http://v8.1c.ru/metod/books/book.jsp?id=288 বইটিতে এটি সম্পর্কে পড়তে পারেন

ভূমিকা

যখন একটি সফ্টওয়্যার পণ্যের একটি নতুন সংস্করণ উপস্থিত হয়, স্বাভাবিকভাবেই, প্রথমত, আপনি এতে নতুন কী আছে তা বুঝতে চান। 1C: এন্টারপ্রাইজ 8.1 এর ক্ষেত্রে, ওয়েব পরিষেবাগুলি আমার জন্য এমন একটি নতুন "বৈশিষ্ট্য" হয়ে উঠেছে। ওয়েব পরিষেবাগুলি সম্পর্কে অনেক কিছু লেখা এবং বলা হয়েছে, যেহেতু এই প্রযুক্তিটি কম্পিউটারের মান অনুসারে দীর্ঘকাল ধরে বিদ্যমান। অতএব, আমি নিজেকে পুনরাবৃত্তি করব না; আমি তথ্যের জন্য সবাইকে ইয়ানডেক্সে রেফার করি। আমি শুধু বলব যে 1C:Enterprise 8.1 প্ল্যাটফর্মের নতুন সংস্করণ প্রকাশের সাথে সাথে, 1Snikov তাদের স্থানীয় পরিবেশে ওয়েব পরিষেবা প্রযুক্তি তৈরি এবং ব্যবহার করার সুযোগ পেয়েছে। এই নিবন্ধে আমি দেখাতে চাই কিভাবে আপনার উন্নয়নে বহিরাগত ওয়েব পরিষেবাগুলি ব্যবহার করতে হয়।

যারা সম্পূর্ণরূপে "লুপের বাইরে" তাদের জন্য: ওয়েব পরিষেবা সম্পর্কে "আপনার নখদর্পণে"

ঠিক আছে, বিশেষভাবে তোমার জন্যআমি আপনাকে একটি ওয়েব পরিষেবা কি এবং কেন ঠিক সে সম্পর্কে একটু বলার চেষ্টা করব এইএটি আমার কাছে প্ল্যাটফর্মের এমন একটি "সুস্বাদু" উদ্ভাবন বলে মনে হয়েছিল। সম্ভবত আপনি COM প্রযুক্তি সম্পর্কে জানেন বা OLE সম্পর্কে কিছু শুনেছেন? শীঘ্রই বা পরে, যে কোনও স্বতন্ত্র কর্মী এই প্রযুক্তিটি দেখতে পাবেন (বিশেষত যদি আপনাকে দ্রুত কিছু ডিরেক্টরি "কর্মচারী" স্থানান্তর করতে হয়, এবং এইচআর বিভাগ, সমস্ত 1,500 কর্মচারীকে আবার গাড়ি চালানোর প্রয়োজনের প্রত্যাশায়, আপনাকে প্রথমে ফাঁসানোর জন্য প্রস্তুত। উপযুক্ত পেরেক যা বরাবর আসে)।
হ্যাঁ, তাই, COM প্রযুক্তির কেন্দ্রবিন্দুতে এর ধারণা সম্ভাবনাঅন্য অ্যাপ্লিকেশন থেকে একটি অ্যাপ্লিকেশনের কলিং প্রোগ্রাম কোড (এবং ডেটা অ্যাক্সেস)। তাছাড়া, সম্ভাবনাএটি পৃথক পদ্ধতি এবং ফাংশনের স্তরে নয়, তবে নিষ্পত্তির মাধ্যমে করুন বস্তুআরেকটি আবেদন। OLE ব্যবহার করার সময়, আমরা আমাদের অ্যাপ্লিকেশনে একটি বস্তু তৈরি করি যা " প্রতিনিধি"অথবা, আপনি যদি চান," মোড়ক"অ্যাপ্লিকেশনের কিছু বস্তু যার সাথে আমরা ইন্টারঅ্যাক্ট করতে চাই (তথাকথিত "OLE অবজেক্ট" বা "COM অবজেক্ট")। এই "র্যাপার" অবজেক্টের মাধ্যমে, অন্য অ্যাপ্লিকেশনের বস্তুর বৈশিষ্ট্য এবং পদ্ধতি আমাদের কাছে উপলব্ধ হয় , এবং শুধুমাত্র যারা ডেভেলপার যাওঅ্যাপ্লিকেশানগুলি বর্ণনায় প্রকাশ করে আমাদের ব্যবহার করার অনুমতি দিয়েছে৷ ইন্টারফেস. (আচ্ছা, আমি আগাছায় যেতে চাইনি, তবে অন্য কোন উপায় নেই ...)
এখন এর কল্পনা করা যাক ঠিক একইঅ্যাপ্লিকেশনটি অন্য কম্পিউটারে অবস্থিত, এমনকি স্থানীয় নেটওয়ার্কেও নয় (DCOM, CORBA এবং অন্যান্য বিমূর্ত সংক্ষিপ্ত রূপগুলি এই ধরনের ক্ষেত্রে ভালভাবে পরিচালনা করে), কিন্তু ইন্টারনেটে কোথাও দূরে, অনেক দূরে। এখানেই ওয়েব পরিষেবাগুলি দৃশ্যে আসে (এছাড়াও বিমূর্ত সংক্ষিপ্ত শব্দগুলির সাথে সম্পূর্ণ: SOAP, WSDL, ইত্যাদি), যা আপনাকে এই ক্ষেত্রে অনুরূপ একটি "কৌশল" সম্পাদন করতে দেয়: যেমন ইন্টারনেটের অন্য প্রান্তে কম্পিউটারে চলমান একটি অ্যাপ্লিকেশন থেকে ডেটা গ্রহণ এবং বস্তুগুলিকে ম্যানিপুলেট করা।
অধীনে " বহিরাগত"ওয়েব পরিষেবা দ্বারা আমি বোঝাব কিছুকে দেওয়া একটি ওয়েব পরিষেবা৷ সরবরাহকারীপরিষেবা (অর্থাৎ আমাদের অ্যাপ্লিকেশন নয়।) তদনুসারে, "অভ্যন্তরীণ" দ্বারা - আমরা যে ওয়েব পরিষেবা প্রদান করব থেকে, বা, আরো সঠিকভাবে, ভিত্তিকআমাদের আবেদন। বাহ্যিক ওয়েব পরিষেবাগুলি ব্যবহার করার সময়, আমাদের অবশ্যই বুঝতে হবে যে যদিও "র্যাপার" অবজেক্টটি আমাদের "স্থানীয়" অ্যাপ্লিকেশনে তৈরি করা হয়েছে, তবে এই বস্তুর "নির্বাহী কোড" সম্ভবত পৃথিবীর অন্য দিকে অবস্থিত। একই সঙ্গে মধ্যে বিনিময় আমাদেরএবং তাদেরএখন সর্বব্যাপী XML-এ স্থান নেয়, যার সুপরিচিত "সুবিধা" (বহুমুখীতা এবং কাঠামো) এবং "কনস" (ব্লোট), এবং ভাল পুরানো HTTP "ট্রান্সমিশন লাইন" হিসাবে ব্যবহৃত হয়।
হ্যাঁ, এবং ইন্টারনেট ট্র্যাফিক সম্পর্কে ভুলবেন না! তাছাড়া এক্সটার্নাল ওয়েব সার্ভিসের ক্ষেত্রে এর বেশির ভাগই চালু থাকবে ইনকামিংউপাদান.
বাকি সবকিছু ইয়ানডেক্সে রয়েছে। চল এগোই...

পা কোথা থেকে এসেছে, যেমন ডানা বৃদ্ধি

ইয়ানডেক্সের মাধ্যমে ঘোরাঘুরি করার পরে, আমি অ্যারোফ্লট কোম্পানির কাছ থেকে একটি দুর্দান্ত ওয়েব পরিষেবা পেয়েছি, যা আপনাকে রিয়েল টাইমে বিমানের আগমন এবং প্রস্থান সম্পর্কে তথ্য পেতে দেয় এবং 1C: এন্টারপ্রাইজে এক ধরণের "এয়ারপোর্ট ডিসপ্লে" তৈরি করার সিদ্ধান্ত নিয়েছে। পরিষেবাটি নিজেই এখানে থাকে: http://webservices.aeroflot.ru/desc_flightinfo.asp

তিনি বললেন: "চলুন!"

শুরু করার জন্য, আমি "1C:Enterprise 8.1" এর একটি খালি কনফিগারেশন তৈরি করেছি (লেখার সময়, আমার হাতে প্ল্যাটফর্ম সংস্করণ 8.1.5.123 ছিল)। তারপর আমি আমার কনফিগারেশনে WS-লিংকের একটি নতুন অবজেক্ট যুক্ত করেছি। যখন আমদানি করা WSDL-এর URL লিখতে বলা হয়, আমি WSDL ফাইলের একটি লিঙ্ক প্রবেশ করিয়েছিলাম, যা পরিষেবা পৃষ্ঠায় তালিকাভুক্ত: http://webservices.aeroflot.aero/flightstatus.wsdl (WSDL ফাইলটি ওয়েব পরিষেবা বিশদ বিবরণের জন্য, ইয়ানডেক্সে যান ), এবং গর্বিতভাবে তৈরি করা সুবিধাটির নাম "Aeroflot"। এই বস্তুর উপর ডাবল ক্লিক করে, আমি ওয়েব পরিষেবার কাঠামোর সাথে একটি গাছ পেয়েছি।

এই গাছটি ওয়েব পরিষেবার একটি "প্রতিকৃতি" উপস্থাপন করে, যেমন 1Ska এটি দেখে। সবচেয়ে মজার বিষয় হল "ওয়েব সার্ভিস" শাখায়: এটি নামএবং বন্দরওয়েব পরিষেবাগুলি (আসলে, একটি WSDL ফাইল একটি নয়, বেশ কয়েকটি ওয়েব পরিষেবা বর্ণনা করতে পারে, তারপর প্রতিটি ওয়েব পরিষেবার নিজস্ব শাখা থাকবে), এবং তালিকাভুক্ত করা হয়েছে পদ্ধতিএকটি বন্ধু পূর্ণ নাম লিখুন. এইগুলি হল খুব "স্ট্রিং", যা টেনে আপনি ওয়েব পরিষেবা প্রদান করে এমন ডেটাতে অ্যাক্সেস দিতে পারেন। "ডেটা মডেল" শাখায় ডেটা টাইপ লাইব্রেরিগুলির একটি বিবরণ রয়েছে যা ওয়েব পরিষেবা দ্বারা ব্যবহৃত হয়।
ওয়েব পরিষেবাটি কীভাবে ব্যবহার করবেন তার একটি সংক্ষিপ্ত সারাংশ সাধারণত WSDL ফাইলের লিঙ্কের মতো একই জায়গায় পাওয়া যেতে পারে। Aeroflot এর ক্ষেত্রে, এটি হল http://webservices.aeroflot.aero/flightstatus.asmx পৃষ্ঠা

"এখন টেকঅফ, এখন ল্যান্ডিং..."

ওয়েব পরিষেবার সাথে কাজ করার জন্য, আমি কনফিগারেশনে "প্রস্থান ডিসপ্লে" প্রসেসিং যোগ করেছি এবং এটিতে - একটি ফর্ম, যা আমি প্রধান হিসাবে মনোনীত করেছি। ফর্মটিতে আমি নির্বাচনের ক্ষেত্র "বিমানবন্দর নির্বাচন", "ফ্লাইট তারিখ" ইনপুট ক্ষেত্র, "আগমন" এবং "প্রস্থান" দুটি পৃষ্ঠা সহ "টেবিলবোর্ড প্যানেল" প্যানেল রেখেছি, যখন আমি "পৃষ্ঠাগুলিতে বিতরণ করুন" পতাকাটি আনচেক করেছি। প্যানেলের বৈশিষ্ট্য এবং "টেবিলবোর্ড" টেবিল ক্ষেত্র "।
একটি ওয়েব পরিষেবার সাথে মিথস্ক্রিয়া "অনুরোধ-প্রতিক্রিয়া" নীতিতে ঘটে এবং ওয়েব পরিষেবার জন্য একটি বিশেষ মধ্যস্থতাকারী বস্তু তৈরি করা হয়। অতএব, আমি একটি কাস্টম প্রকারের "ServiceAeroflot" ফর্মের বিবরণ যোগ করেছি।
আপনি যদি যত্ন সহকারে পরিষেবাটির বিবরণ পড়েন তবে আপনি দেখতে পাবেন যে ওয়েব পরিষেবাটি যথাক্রমে আগমন এবং প্রস্থান পদ্ধতিতে কলের মাধ্যমে আগমন এবং প্রস্থানের ডেটা সরবরাহ করে। এই ক্ষেত্রে, উভয় পদ্ধতিই বিমানবন্দর কোড এবং পছন্দসই তারিখ পরামিতি হিসাবে গ্রহণ করে। এছাড়াও, ওয়েব পরিষেবাটি বিমানবন্দরগুলির একটি তালিকা পাওয়ার ক্ষমতা প্রদান করে যার জন্য সিস্টেমে ডেটা উপলব্ধ। একটি ওয়েব পরিষেবার সাথে মিথস্ক্রিয়া করার নিম্নলিখিত দৃশ্যটি বেশ সুস্পষ্ট:
1. বিমানবন্দরের একটি তালিকা পান;
2. পছন্দসই বিমানবন্দর এবং তারিখ নির্বাচন করুন;
3. আগমন বা প্রস্থানের তথ্য পান;
কিন্তু ওয়েব পরিষেবা অ্যাক্সেস করার আগে, আপনাকে একটি মধ্যস্থতাকারী বস্তু শুরু করতে হবে (যেমন WSProxy), যা আমি ফর্ম খোলার হ্যান্ডলারে করেছি:
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
প্রথম প্যারামিটার হল ওয়েব সার্ভিস নেমস্পেসের URI। আপনি WS লিঙ্ক ট্রিতে ওয়েব পরিষেবার বৈশিষ্ট্যগুলি খোলার মাধ্যমে এটি খুঁজে পেতে পারেন। দ্বিতীয় এবং তৃতীয় প্যারামিটার যথাক্রমে ওয়েব পরিষেবার নাম এবং পোর্ট প্রেরণ করে।
(টিসিপি/আইপি প্রোটোকলের আরও পরিচিত ধারণার সাথে ওয়েব পরিষেবাগুলিতে প্রয়োগ করা “নাম”, “বন্দর”, “প্রক্সি” ইত্যাদি ধারণাগুলিকে বিভ্রান্ত করবেন না। যদি তাদের মধ্যে একটি চিঠিপত্র থাকে তবে এটি বরং শব্দার্থিক সাধারণ ক্ষেত্রে আপনাকে বুঝতে হবে যে, একটি ওয়েব সার্ভিস পোর্ট এবং একটি TCP পোর্ট সম্পূর্ণ ভিন্ন জিনিস)।
এইভাবে, আমি WSProxy টাইপের ServiceAeroflot অবজেক্ট শুরু করেছি, যা মূলত ওয়েব পরিষেবার একটি "র্যাপার"। এটির মাধ্যমে, আমি প্ল্যাটফর্মের "নেটিভ" পদ্ধতি হিসাবে ওয়েব পরিষেবা পদ্ধতিগুলি অ্যাক্সেস করতে পারি।
প্রথমত, আমি বিমানবন্দরগুলির একটি তালিকা পেয়েছি এবং "বিমানবন্দর নির্বাচন করুন" নির্বাচন ক্ষেত্রের তালিকাটি পূরণ করেছি:

SelectionList=FormElements.AirportSelection.SelectionList; SelectionList.Clear(); AirportList=Aeroflot Service.AirportList().GetList("list"); TotalAirports=ListAirports.Count(); UI=0 থেকে TotalAirports-1 সাইকেল এয়ারপোর্ট=ListAirports.Get(ies); নির্বাচন তালিকা যোগ করুন(Airport.code, ""+Airport.city+" : "+Airport.name); এন্ডসাইকেল;
এখানে এয়ারপোর্ট লিস্ট = ServiceAeroflot.AirportList().GetList("list");
আসল বিষয়টি হল ওয়েব পরিষেবা পদ্ধতি দ্বারা প্রত্যাবর্তিত মানগুলি XDTO অবজেক্ট টাইপের অবজেক্ট দ্বারা প্ল্যাটফর্মে উপস্থাপন করা হয়। যেহেতু এক্সডিটিও প্রযুক্তির বিষয়টি এই নিবন্ধের সুযোগের বাইরে, আমি কেবল এটির জন্যই বলব রূপান্তরএই বস্তুটিকে একটি তালিকায় (যা এটি), আমি এর GetList() পদ্ধতি বলেছি। বিমানবন্দর কাঠামোর ক্ষেত্রগুলির নাম সহ বাকি কোডটি বেশ সুস্পষ্ট, যা আমি ওয়েব পরিষেবা বিবরণ পৃষ্ঠায় পেয়েছি।
এখন আপনি কনফিগারেশন চালাতে পারেন এবং নিশ্চিত করুন যে নির্বাচন ক্ষেত্রের তালিকাটি বিমানবন্দরের নামগুলির সাথে জনবহুল হয়েছে:

"প্রস্থানের দিন, আগমনের দিন..."

এখন আমার স্কোরবোর্ড ফাংশন করার জন্য প্রায় সবকিছুই প্রস্তুত আছে। যা অবশিষ্ট থাকে তা হল "এটি আঁকা এবং এটি ফেলে দেওয়া" :) আমি যা করব তা হল:

পদ্ধতি FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("ফ্লাইট কোড", "ফ্লাইট কোড"); TableTableboard.Columns.Add(" এয়ারলাইন কোড", "এয়ারলাইন"); TableTable.Columns.Add("FlightNumber", "Number"); TableTable.Columns.Add(" এয়ারপোর্ট ট্রানজিট", "বিমানবন্দর পরিবহন"); TableTable.Columns.Add("Airport", "Airport"+?(Arivals,"departures,","Arivals")); TableTable.Columns.Add(" সময়সূচী", "সময়সূচীতে"); টেবিল টেবিলবোর্ড।কলাম। যোগ করুন(" সময় পরিকল্পিত", "পরিকল্পিত"); টেবিল টেবিলবোর্ড। কলাম। যোগ করুন(" সময় বাস্তব", "প্রকৃত"); TableTable.Columns.Add("Calculated Time", "calculated"); TableTable.Columns.Add("ল্যান্ডিং টাইম", ?(আগমন,"ল্যান্ডিং","টেকঅফ")); টেবিল টেবিল। কলাম যোগ করুন ("কম্বাইন্ড ফ্লাইট"), টেবিল টেবিল। যোগ করুন ("ল্যান্ডিং"); ServiceAeroflot.Departure(SelectAirport, FlightDate).GetList("list"); TotalRecords-1 Cycle Record=NewRow=TableTable.Add(); প্রতিষ্ঠান; NewLine.FlightNumber = Entry.flight_no; NewLine.AirportTransit = Entry.airport_inter; NewLine.Airport = Entry.airport; NewLine.TimeSchedule=Record.sched; NewLine.TimePlanned=Record.plan; NewLine.TimeActual=Record.fact; NewLine.TimeCalculated=Record.calc; NewLine.LandingTime=Record.real; NewLine.UnionFlight=Record.union_flight_no; NewRow.Status=Record.status; যদি আগমন না হয় তাহলে NewLine.Registration=Record.is_check; NewLine.Landing = Entry.is_board; যদি শেষ; এন্ডসাইকেল; শেষ প্রক্রিয়া

এটি কীভাবে কাজ করে তা পরীক্ষা করার জন্য, আমি ফর্মের কমান্ড প্যানেলে একটি সংশ্লিষ্ট ছবি সহ একটি "আপডেট" বোতাম যুক্ত করেছি এবং এর হ্যান্ডলারে আমি নিম্নলিখিতগুলি লিখেছি:

প্রসিডিউর CommandPanel1 আপডেট(Button) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arivals); শেষ প্রক্রিয়া
আমি সংরক্ষণ, রান, নির্বাচন, ক্লিক, পেতে:

আফটারওয়ার্ড

আশ্চর্যজনকভাবে, নিবন্ধটি লেখা এবং প্রকাশিত হওয়ার পরে, দেখা গেল যে সম্মানিত ZAV ইতিমধ্যে IT-Land-এ অনুরূপ উদাহরণ প্রকাশ করেছে: http://itland.ru/biblio/detail.php?ID=1060
চুরির সম্ভাব্য অভিযোগ এড়াতে, আমি দৃঢ়ভাবে সুপারিশ করি যে আপনি এই নিবন্ধটিও পড়ুন এবং লেখকদের পদ্ধতির তুলনা করুন।

শেয়ার করুন