Pavel Tchistov. Services Web 1c 8 services Web

Entreprise " 1C» développe activement la plateforme 1C:Enterprise et ajoute de nouvelles fonctionnalités à chaque version. Après le début du développement de la branche 8.3, de nombreux nouveaux produits ont commencé à apparaître et, en raison d'une activité constante, vous n'avez pas le temps de tous les essayer. Il n'y a pas longtemps, je comment développer une application mobile à part entière(oui, sur "1C:Enterprise"), et aujourd'hui j'aimerais parler de la création Services HTTP au moyen de la plateforme.

Possibilité d'aménagement Services HTTP apparu dans le cadre de la configuration de la version 8.3.5 . Pendant ce temps, le composant a été mis à jour plusieurs fois, et il est aujourd'hui tout à fait possible de l'utiliser sans craindre la présence d'erreurs « enfantines ». Je n'ai pas encore eu l'occasion d'utiliser les fonctionnalités de la plateforme 1C:Enterprise pour créer des services http en conditions réelles, jusqu'à présent mon expérience se limite à des projets pédagogiques. Cependant, je vois des perspectives d'utilisation du mécanisme des services http dans l'un des projets de travail en cours. Dans cette série de courtes notes, je vais essayer de montrer des exemples typiques d'utilisation services http dans les configurations pour la plateforme " 1C : Entreprise».

Création d'un service http simple dans 1C:Enterprise 8.3

Aujourd'hui, nous allons examiner un exemple du service http le plus simple, puis nous l'améliorerons et le compliquerons. Le but de la leçon est de comprendre et d'expérimenter la simplicité de la création services http basé sur la plateforme 1C:Enterprise 8.3.

Commençons par la formulation du problème. Le service créé dans le cadre de la note ne doit pouvoir faire que deux choses : accepter une requête GET et renvoyer une réponse au format JSON. La tâche est triviale et faire quelque chose de similaire en PHP/ASP .NET nécessite quelques lignes de code. Pour l'avenir, je dirai que dans 1C:Enterprise, nous aurons besoin d'à peu près le même montant (d'accord, ne vous moquez pas des bizarreries de la plateforme 1C).

Nous parlerons des cas d'utilisation des services http dans un article séparé, mais pour l'instant, nous allons simplement créer un nouveau service http. Pour plus de commodité, nous créerons une nouvelle base d'informations avec une configuration vide. Ajoutons-y un sous-système, que nous appellerons « Test des services HTTP" Ouvrons maintenant la section « Général » dans l'arborescence de configuration et trouvons le groupe « Services HTTP» et ajoutez le premier service web. Dans la fenêtre de création d'un nouveau service, remplissez les champs :

  • Nom-PremierWebService ;
  • Synonyme- Premier service Web ;
  • URL racine- Nos services;

Faites attention au terrain " URL racine" Le nom spécifié ici sera utilisé lors de l'accès au service. Il ne doit y avoir aucun espace ici et il est déconseillé d'utiliser l'alphabet cyrillique. Nous avons réglé ce problème, puis allez dans la section " Sous-systèmes" et ajoutez le service http au seul sous-système disponible.

L'étape suivante consiste à décrire le modèle d'URL. Allons dans l'onglet approprié et ajoutons un modèle avec le nom " Afficher la liste des services" Dans l'inspecteur de propriété, nous trouverons la propriété " Échantillon" et écris-y " /liste" En faisant cela, nous définirons le chemin le long duquel l'interaction avec le service http aura lieu. Le modèle peut contenir des caractères spéciaux qui permettent de préciser les paramètres passés (obligatoires et non), mais pour le premier exemple nous nous limiterons à un simple " /liste" En suivant ce chemin, notre seule méthode fonctionnera et donnera au client un ensemble de données.

Super, il y a un modèle, maintenant c'est à la méthode. Ajoutons pour notre modèle, que nous appellerons getServicesList. Dans l'inspecteur de propriétés, nous devons spécifier la méthode HTTP. La valeur spécifiée détermine à quels types de requêtes notre méthode répondra. La tâche actuelle permet de s’en sortir en utilisant le « OBTENIR”.

Notre service est presque prêt, il ne reste plus qu'à enregistrer un gestionnaire d'événements pour la méthode construite getServicesList. Vous pouvez créer un gestionnaire d'événements via l'inspecteur de propriétés. Dans le corps du handler on écrit :

Fonction OutputIndexgetServicesList(Request) ArrayServices = Nouveau tableau ; Tableau de services.Add(New Structure("titre, description", "Service n°1", "Description du service n°1")); Tableau de services.Add(New Structure("titre, description", "Service n°2", "Description du service n°2")); Tableau de services.Add(New Structure("titre, description", "Service n° 3", "Description du service n° 3")); Tableau de services.Add(New Structure("titre, description", "Service n°4", "Description du service n°4")); EntryJSON = Nouveau EntryJSON ; RecordJSON.SetString(); WriteJSON(WriteJSON,ArrayServices); StringForResponse = JSONRecord.Close(); Réponse = Nouvelle réponse HTTPService(200) ; Response.Headers.Insert("Content-type", "application/json; charset=utf-8"); Response.SetBodyFromString(StringForResponse, TextEncoding.UTF8, UseByteOrderMark.NotUse); Retourner la réponse ; FinFonction

Regardons le code ci-dessus plus en détail. Au tout début, je décris un tableau constitué de structures. Nous avons besoin de ce tableau uniquement à des fins de démonstration. Nous convertirons tout son contenu en JSON et le donnerons au client. Initialiser un objet de type Entrée JSON. Assurez-vous d'appeler la méthode EnsembleChaîne(), parce que nous devons mettre le texte JSON dans une variable de chaîne. Ensuite, nous appelons la méthode globale ÉcrireJSON(), auquel on passe un objet de type Entrée JSON et le tableau qui doit être converti. Ensuite, nous obtenons le résultat dans la variable " LignePourRéponse" et préparez une réponse HTTP.

En réponse nous ajoutons (voir méthode " DéfinirBodyFromString") le JSON résultant. Ça y est, le code démo est prêt et vous pouvez passer aux tests.

Publication d'un service HTTP dans 1C:Enterprise 8.3

Publions le service HTTP créé pour tester les résultats du travail effectué. Pour le test le plus simple, un serveur Web doit être installé sur votre système. Pour moi, le rôle d'un service Web est joué par Apache. Nous sauterons les étapes nécessaires à l'installation/configuration d'un serveur Web et passerons à la question de la publication d'un service HTTP.

Pour publier, vous devez vous rendre dans le menu « Administration » et sélectionner « Publication sur un serveur Web" Dans la fenêtre qui apparaît, renseignez :

  • Nom est le nom de notre solution. Il sera utilisé dans l'URL lors de l'accès aux informations de sécurité publiées. Par exemple, si vous spécifiez test ici, la sécurité de vos informations sera disponible sur http://localhost/test. Je suis satisfait de l'option de test.
  • serveur Web- Rempli automatiquement. J'utilise Apache 2.2 comme serveur Web ;
  • Catalogue– chemin d'accès au répertoire dans lequel sera placé le fichier de configuration du SI publié ;
  • Décochez le " Publier un client léger et un client Web», « Publier une interface OData standard», « Publier les services WEB par défaut»;
  • Dans l'onglet Services HTTP, cochez la case " Publier les services HTTP par défaut" et dans la section tabulaire, nous marquons le service créé.

Tester le service HTTP

Pour tester le service http créé, lançons un navigateur et essayons d'y accéder. Si vous avez répété toutes mes étapes, le chemin devrait ressembler à ceci :

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

Il vaut la peine de prêter attention au port 9090 , qui est spécifié par deux points après le nom d'hôte. Si vous avez installé Apache avec les paramètres par défaut, il écoutera sur le port 80, vous n'avez donc rien à spécifier. En conséquence, l'URL ressemblera à ceci :

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

Essayez de le parcourir, et si tout fonctionne correctement, vous recevrez une page avec des données au format JSON :

[ ( titre : « Service n°1 », description : « Description du service n°1 » ), ( titre : « Service n°2 », description : « Description du service n°2 » ), ( titre : « Service N°3", description : "Description du service N°3", ( titre : "Service N°4", description : "Description du service N°4") ]

C'est ici que nous pouvons terminer notre examen de l'exemple de démonstration, mais j'aimerais enfin analyser l'URL en ses éléments constitutifs afin qu'il soit clair pourquoi nous avons reçu exactement un tel lien.

Ainsi, la première partie devrait être claire : localhost. Il s'agit du nom d'hôte sur lequel le serveur Web est installé. Vient ensuite un lien (services) vers la sécurité des informations publiée. Vient ensuite hs, cet élément de chemin indique que nous souhaitons interagir avec le service http. Les deux derniers éléments sont l'URL racine de notre service et le modèle d'URL.

Au lieu d'une conclusion

« 1C : Entreprise 8.3» vous permet de créer des Services HTTP avec un minimum de coûts de main d'œuvre, ce dont vous auriez dû être convaincu après avoir lu cette courte note. La fonctionnalité élargit considérablement les options d'application de la plateforme. Dans les articles suivants, nous parlerons de cas pratiques d'utilisation de la technologie et envisagerons la mise en œuvre de diverses solutions dans la pratique.

services Web est l'un des mécanismes de plateforme utilisés pour l'intégration avec d'autres systèmes d'information. C'est un moyen de supporter la SOA (Service-Oriented Architecture), une architecture orientée services qui constitue un standard moderne d'intégration d'applications et de systèmes d'information.

Un avantage important de l'architecture orientée services est qu'elle vous permet de développer l'infrastructure de l'entreprise de manière uniforme, sans détruire les solutions existantes. Son utilisation vous permet de minimiser les coûts en intégrant des systèmes hétérogènes et existants dans le paysage d'entreprise moderne. Il vous permet d'implémenter des composants logiciels faiblement couplés afin de maximiser leur réutilisation.

L'architecture orientée services est intensivement développée et prise en charge par les principaux fournisseurs. Elle est construite sur la base de services, autonomes ou gérés en externe. La meilleure manière de les mettre en œuvre consiste à utiliser les services Web. Ils sont indépendants de la plateforme, autonomes et pris en charge partout.

La solution applicative 1C:Enterprise 8 peut être à la fois un fournisseur de services Web et un consommateur de services Web publiés par d'autres fournisseurs.

Les systèmes utilisant des plates-formes matérielles et logicielles arbitraires peuvent agir en tant que consommateurs. La technologie des services Web est indépendante de la plate-forme.


Implémentation technique des web services

Si la solution d'application est un fournisseur de services Web, alors dans les modes de fonctionnement fichier et client-serveur, l'interaction entre la solution d'application et les consommateurs de services Web s'effectue via le serveur Web, à l'aide du module d'extension de serveur Web.

Dans ce cas, lorsqu'un consommateur accède au service Web d'une solution applicative, le module de service Web est exécuté. Ce module est contenu dans la configuration et contient des procédures qui sont exécutées lors de l'appel de certaines opérations de service Web.

Dans le cas d'une version client-serveur du travail, ce module sera exécuté en cluster. Dans le cas de la version fichier du travail - dans le module d'extension du serveur Web.

Si la solution applicative est un consommateur d'un fournisseur de services Web tiers, alors dans ce cas, l'interaction entre la solution applicative et le fournisseur de services Web est effectuée

Je sais que sur Habré, ils n'aiment pas vraiment le 1C qui souffre depuis longtemps. Cependant, avec la sortie de la plate-forme 8.3 (avec des clients pour Linux), ils ont commencé à l'aimer un peu plus. À propos, tout récemment, l'interface de l'un des principaux développements 1C - la configuration Manufacturing Enterprise Management - a été entièrement traduite en anglais. Plusieurs fois, j'ai été confronté à des questions sur les raisons pour lesquelles ils n'écrivent pas sur 1C ici. La réponse est assez évidente : il existe de nombreuses ressources spécialisées où vous pouvez discuter rapidement de toutes les questions et lire quelque chose.

Il y a tout lieu de croire que cet article ne survivra pas ici, mais je prendrai quand même le risque, car il y a des choses intéressantes dans 1C qui valent la peine d'être évoquées.

Depuis quelques temps, 1C 8.x permet d'utiliser des services web : 1C peut agir à la fois en tant que fournisseur et en tant que consommateur. Dans cet article, je vais montrer comment utiliser 1C en tant que consommateur en utilisant l'exemple de réception des taux de change du serveur de la Banque centrale.

service Web

La Banque Centrale dispose d'un service web pour recevoir des données quotidiennes : taux de change, actualités, dynamique des taux de change, etc. Une description du service peut être trouvée ici http://www.cbr.ru/scripts/Root.asp?Prtid=DWS. Nous sommes intéressés par l'une des méthodes de ce service : GetCursOnDate(On_date)– obtenir les taux de change pour une date donnée. Un argument est passé à la méthode À la date– c'est la date à laquelle vous devez recevoir les cours. Le résultat est un XML contenant le tableau ValeurCursOnDate(les cours eux-mêmes et les informations associées).

Configuration

Pour le développement, j'ai pris 1C 8.2 (8.2.15.317 dans mon cas) et créé une configuration vide. Pour utiliser des services web externes, un objet lien WS est fourni, mais il n'est pas nécessaire de l'utiliser ; le service est accessible dynamiquement à partir du code. Je vais utiliser la première option, puis montrer comment vous pouvez utiliser la seconde. Dans la configuration, j'ai créé un traitement et je l'ai appelé « Chargement des taux de change CBR ». J'ai ajouté un formulaire (géré) et en ai fait le principal. J'ai créé les détails sur le formulaire et placé les contrôles comme indiqué sur la figure.

Maintenant, le plus important est de créer un lien vers la description du service web. Dans la configuration nous ajoutons un nouvel objet de type WS-link. Dans la fenêtre qui apparaît, indiquez le lien vers le WSDL (la description de ce format dépasse le cadre de l'article, vous pouvez en lire sur Wikipédia) : http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx ?WSDL.

Sur la base de la description reçue, 1C créera automatiquement une carte visuelle du service Web. Vous pouvez voir le nom du service Web, voir quelles opérations lui sont disponibles, ainsi que les types de données utilisés.

La configuration est presque terminée, il ne nous reste plus qu'à faire quelques touches pour rendre notre application plus esthétique. Faites un clic droit sur la racine de configuration et appelez le menu « Ouvrir l’interface de commande du bureau ». Dans la fenêtre qui apparaît, vous devez décocher le drapeau « Visibilité » à côté du traitement « Chargement des taux de change de la Banque centrale ». Cliquez sur le bouton OK. Ensuite, faites un clic droit sur la racine de configuration et appelez le menu « Ouvrir l'espace de travail du bureau », nous y effectuerons les réglages comme dans la figure :

Ces paramètres nous permettront d'afficher le formulaire de traitement directement sur le bureau (c'est-à-dire le bureau du programme 1C) en mode 1C Entreprise.

La programmation

Il ne reste plus qu'à donner du sens à notre traitement : lui faire recevoir des taux de change et l'afficher dans un tableau sur le formulaire. En mode d'édition de formulaire, vous devez ajouter une nouvelle commande de formulaire, appelons-la LoadCurrencies. Cette commande doit être associée à un bouton situé sur le formulaire. Remplissons l'action de la commande avec le code suivant (note de l'auteur : wow, le hub a une mise en évidence du code 1C, bien qu'il ne fonctionne pas correctement) :

&Sur la procédure client LoadCurrencies(Command) If NOT ValueFilled(DownloadDate) Then Report("Date de téléchargement non sélectionnée!", MessageStatus.Important); Retour; fin si; DevisesRatesTable.Clear(); LoadCurrencyRates(LoadDate); Fin de la procédure
Ici, nous vérifions d'abord si la date est renseignée (si elle n'est pas renseignée, alors nous en informons l'utilisateur et ne faisons rien d'autre). Ensuite, la table située sur le formulaire est effacée et la procédure LoadCurrencyRates() est appelée, à laquelle la date est transmise.

Code de la procédure LoadCurrencyRates(), les explications sont données dans les commentaires du code :

Procédure LoadCurrencyRates(fDataDownload) //Créez un proxy pour accéder à un service Web externe, //passez l'URI de l'espace de noms, le nom du service et le nom du port à la fonction. Proxy = WSLinks.CBR_DailyInfoWebServ.CreateWSProxy("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //Obtient le type du paramètre transmis à la méthode GetCursOnDate. TypeWSParameter = Proxy.FactoryXDTO.Packets.Get("http://web.cbr.ru/").Get("GetCursOnDate"); //Créez un paramètre basé sur le type et renseignez la valeur du paramètre On_Date. WSParameter = Proxy.XDTO Factory.Create(WSParameterType); WSParameter.On_Date = fLoadDate ; //Appelez la méthode du service Web, écrivez le résultat dans la variable Taux de change. Taux de change = Proxy.GetCursOnDate(WSParameter); // Parcourez la table ValuteCursOnDate, ajoutez chaque valeur de table // au tableau du formulaire (remplissez les colonnes avec les valeurs correspondantes). Pour chaque élément du cycle Rates.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate NewLineTK = CurrencyRatesTable.Add(); NewLineTK.CurrencyName = Element.Vname ; NewStringTZ.Nominal = Element.Vnom ; NewLineTK.DigitalCurrencyCode = Element.Vcode ; NewTZLine.CurrencyCode = Element.VChCode ; NewLineTZ.Currency Rate = Element.Vcurs ; Fin du cycle ; Fin de la procédure
Vous pouvez maintenant mettre à jour la configuration de la base de données (F7) et lancer 1C Enterprise (F5). Si vous avez tout fait correctement, vous devriez voir une fenêtre comme celle ci-dessous :

Pour vérifier le résultat, nous devons saisir la date pour laquelle nous souhaitons recevoir les taux de change et cliquer sur le bouton « Charger les devises ». Si la demande aboutit, le tableau du formulaire sera rempli avec les valeurs des tarifs :

Enfin, je souhaite montrer comment accéder dynamiquement à un service Web externe, c'est-à-dire sans ajouter d'objet lien WS. Ainsi, nous pouvons consommer de tels services Web à partir d'un traitement externe sans être liés à la configuration.

Dans la procédure LoadCurrencyRates(), une ligne

Définitions = New WSDefinitions("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); Proxy = Nouveau WSProxy(Définitions, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Nous créons d’abord ce que l’on appelle des définitions pour le service Web à partir de son WSDL. Ensuite, nous créons également un proxy pour y accéder.

Comme vous pouvez le constater, l'utilisation de services Web externes de 1C est généralement assez simple (même s'il y a quelques difficultés à comprendre la définition des types, y compris moi).

Si ce message trouve un écho ici, il y a quelques autres sujets à aborder.

30 juillet 2012 à 13h19

Utilisation de services Web externes dans 1C en utilisant l'exemple de chargement des taux de change

  • La programmation

Je sais que sur Habré, ils n'aiment pas vraiment le 1C qui souffre depuis longtemps. Cependant (avec les clients exécutant Linux), ils ont commencé à l'apprécier un peu plus. À propos, tout récemment, l'interface de l'un des principaux développements 1C - la configuration Manufacturing Enterprise Management - a été entièrement traduite en anglais. Plusieurs fois, j'ai été confronté à des questions sur les raisons pour lesquelles ils n'écrivent pas sur 1C ici. La réponse est assez évidente : il existe de nombreuses ressources spécialisées où vous pouvez discuter rapidement de toutes les questions et lire quelque chose.

Il y a tout lieu de croire que cet article ne survivra pas ici, mais je prendrai quand même le risque, car il y a des choses intéressantes dans 1C qui valent la peine d'être évoquées.

Depuis quelques temps, 1C 8.x permet d'utiliser des services web : 1C peut agir à la fois en tant que fournisseur et en tant que consommateur. Dans cet article, je vais montrer comment utiliser 1C en tant que consommateur en utilisant l'exemple de réception des taux de change du serveur de la Banque centrale.

service Web

La Banque Centrale dispose d'un service web pour recevoir des données quotidiennes : taux de change, actualités, dynamique des taux de change, etc. Une description du service peut être trouvée ici http://www.cbr.ru/scripts/Root.asp?Prtid=DWS. Nous sommes intéressés par l'une des méthodes de ce service : GetCursOnDate(On_date)– obtenir les taux de change pour une date donnée. Un argument est passé à la méthode À la date– c'est la date à laquelle vous devez recevoir les cours. Le résultat est un XML contenant le tableau ValeurCursOnDate(les cours eux-mêmes et les informations associées).

Configuration

Pour le développement, j'ai pris 1C 8.2 (8.2.15.317 dans mon cas) et créé une configuration vide. Pour utiliser des services web externes, un objet lien WS est fourni, mais il n'est pas nécessaire de l'utiliser ; le service est accessible dynamiquement à partir du code. Je vais utiliser la première option, puis montrer comment vous pouvez utiliser la seconde. Dans la configuration, j'ai créé un traitement et je l'ai appelé « Chargement des taux de change CBR ». J'ai ajouté un formulaire (géré) et en ai fait le principal. J'ai créé les détails sur le formulaire et placé les contrôles comme indiqué sur la figure.

Maintenant, le plus important est de créer un lien vers la description du service web. Dans la configuration nous ajoutons un nouvel objet de type WS-link. Dans la fenêtre qui apparaît, indiquez le lien vers le WSDL (la description de ce format dépasse le cadre de l'article, vous pouvez en lire sur Wikipédia) : http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx ?WSDL.

Sur la base de la description reçue, 1C créera automatiquement une carte visuelle du service Web. Vous pouvez voir le nom du service Web, voir quelles opérations lui sont disponibles, ainsi que les types de données utilisés.

La configuration est presque terminée, il ne nous reste plus qu'à faire quelques touches pour rendre notre application plus esthétique. Faites un clic droit sur la racine de configuration et appelez le menu « Ouvrir l’interface de commande du bureau ». Dans la fenêtre qui apparaît, vous devez décocher le drapeau « Visibilité » à côté du traitement « Chargement des taux de change de la Banque centrale ». Cliquez sur le bouton OK. Ensuite, faites un clic droit sur la racine de configuration et appelez le menu « Ouvrir l'espace de travail du bureau », nous y effectuerons les réglages comme dans la figure :

Ces paramètres nous permettront d'afficher le formulaire de traitement directement sur le bureau (c'est-à-dire le bureau du programme 1C) en mode 1C Entreprise.

La programmation

Il ne reste plus qu'à donner du sens à notre traitement : lui faire recevoir des taux de change et l'afficher dans un tableau sur le formulaire. En mode d'édition de formulaire, vous devez ajouter une nouvelle commande de formulaire, appelons-la LoadCurrencies. Cette commande doit être associée à un bouton situé sur le formulaire. Remplissons l'action de la commande avec le code suivant (note de l'auteur : wow, le hub a une mise en évidence du code 1C, bien qu'il ne fonctionne pas correctement) :

&Sur la procédure client LoadCurrencies(Command) If NOT ValueFilled(DownloadDate) Then Report("Date de téléchargement non sélectionnée!", MessageStatus.Important); Retour; fin si; DevisesRatesTable.Clear(); LoadCurrencyRates(LoadDate); Fin de la procédure
Ici, nous vérifions d'abord si la date est renseignée (si elle n'est pas renseignée, alors nous en informons l'utilisateur et ne faisons rien d'autre). Ensuite, la table située sur le formulaire est effacée et la procédure LoadCurrencyRates() est appelée, à laquelle la date est transmise.

Code de la procédure LoadCurrencyRates(), les explications sont données dans les commentaires du code :

Procédure LoadCurrencyRates(fDataDownload) //Créez un proxy pour accéder à un service Web externe, //passez l'URI de l'espace de noms, le nom du service et le nom du port à la fonction. Proxy = WSLinks.CBR_DailyInfoWebServ.CreateWSProxy("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //Obtient le type du paramètre transmis à la méthode GetCursOnDate. TypeWSParameter = Proxy.FactoryXDTO.Packets.Get("http://web.cbr.ru/").Get("GetCursOnDate"); //Créez un paramètre basé sur le type et renseignez la valeur du paramètre On_Date. WSParameter = Proxy.XDTO Factory.Create(WSParameterType); WSParameter.On_Date = fLoadDate ; //Appelez la méthode du service Web, écrivez le résultat dans la variable Taux de change. Taux de change = Proxy.GetCursOnDate(WSParameter); // Parcourez la table ValuteCursOnDate, ajoutez chaque valeur de table // au tableau du formulaire (remplissez les colonnes avec les valeurs correspondantes). Pour chaque élément du cycle Rates.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate NewLineTK = CurrencyRatesTable.Add(); NewLineTK.CurrencyName = Element.Vname ; NewStringTZ.Nominal = Element.Vnom ; NewLineTK.DigitalCurrencyCode = Element.Vcode ; NewTZLine.CurrencyCode = Element.VChCode ; NewLineTZ.Currency Rate = Element.Vcurs ; Fin du cycle ; Fin de la procédure
Vous pouvez maintenant mettre à jour la configuration de la base de données (F7) et lancer 1C Enterprise (F5). Si vous avez tout fait correctement, vous devriez voir une fenêtre comme celle ci-dessous :

Pour vérifier le résultat, nous devons saisir la date pour laquelle nous souhaitons recevoir les taux de change et cliquer sur le bouton « Charger les devises ». Si la demande aboutit, le tableau du formulaire sera rempli avec les valeurs des tarifs :

Enfin, je souhaite montrer comment accéder dynamiquement à un service Web externe, c'est-à-dire sans ajouter d'objet lien WS. Ainsi, nous pouvons consommer de tels services Web à partir d'un traitement externe sans être liés à la configuration.

Dans la procédure LoadCurrencyRates(), une ligne

Définitions = New WSDefinitions("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); Proxy = Nouveau WSProxy(Définitions, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Nous créons d’abord ce que l’on appelle des définitions pour le service Web à partir de son WSDL. Ensuite, nous créons également un proxy pour y accéder.

Comme vous pouvez le constater, l'utilisation de services Web externes de 1C est généralement assez simple (même s'il y a quelques difficultés à comprendre la définition des types, y compris moi).

Si ce message trouve un écho ici, il y a quelques autres sujets à aborder.

Le titre du sujet est vraiment une question, parce que... Je ne sais pas moi-même ce que c'est et pour la première fois je vais essayer de travailler avec dans le cadre de cet article. La seule chose que je peux garantir, c'est que le code présenté ci-dessous fonctionnera, mais mes phrases ne seront que des hypothèses et des suppositions sur la façon dont je comprends moi-même tout cela. Alors allons-y...

Introduction

Nous devons commencer par pourquoi le concept de services Web a été créé. Au moment où ce concept est apparu dans le monde, il existait déjà des technologies permettant aux applications d'interagir à distance, où un programme pouvait appeler une méthode dans un autre programme, qui pouvait être lancée sur un ordinateur situé dans une autre ville ou même un autre pays. Tout cela est abrégé en RPC (Remote Procedure Calling). Les exemples incluent les technologies CORBA et pour Java - RMI (Remote Method Invoking). Et tout semble aller bien chez eux, surtout à CORBA, parce que... Vous pouvez travailler avec n'importe quel langage de programmation, mais il manquait encore quelque chose. Je pense que l'inconvénient de CORBA est qu'il fonctionne via certains de ses propres protocoles réseau au lieu du simple HTTP, qui passe à travers n'importe quel pare-feu. L'idée du service Web était de créer un RPC qui serait inséré dans les paquets HTTP. Ainsi commença le développement de la norme. Quels sont les concepts de base de cette norme :
  1. SAVON. Avant d'appeler une procédure distante, vous devez décrire cet appel dans un fichier XML au format SOAP. SOAP est simplement l'un des nombreux balises XML utilisées dans les services Web. Tout ce que nous voulons envoyer quelque part via HTTP est d'abord converti en une description XML SOAP, puis inséré dans un paquet HTTP et envoyé à un autre ordinateur du réseau via TCP/IP.
  2. WSDL. Il existe un service Web, c'est-à-dire un programme dont les méthodes peuvent être appelées à distance. Mais la norme exige que ce programme soit accompagné d'une description indiquant que "oui, vous avez raison, il s'agit en réalité d'un service Web et vous pouvez appeler telle ou telle méthode à partir de celui-ci". Cette description est représentée par un autre fichier XML, qui a un format différent, à savoir WSDL. Ceux. WSDL n'est qu'un fichier XML décrivant un service Web et rien de plus.
Pourquoi demandez-vous si brièvement ? Tu ne peux pas être plus précis ? C’est probablement possible, mais pour ce faire, vous devrez vous tourner vers des livres tels que T. Mashnin, « Java Web Services ». Là, sur les 200 premières pages, on trouve une description détaillée de chaque balise des standards SOAP et WSDL. Est-ce que ça vaut la peine de le faire ? A mon avis non, parce que... tout cela est créé automatiquement en Java, et il vous suffit d'écrire le contenu des méthodes censées être appelées à distance. Ainsi, une API telle que JAX-RPC est apparue en Java. Si quelqu'un ne le sait pas, quand on dit que Java a telle ou telle API, cela signifie qu'il existe un package avec un ensemble de classes qui encapsulent la technologie en question. JAX-RPC a évolué au fil du temps de version en version et est finalement devenu JAX-WS. WS signifie évidemment WebService et vous pourriez penser qu'il s'agit simplement d'un changement de nom de RPC en tant que mot à la mode populaire de nos jours. Ce n'est pas vrai, parce que Désormais, les services Web se sont éloignés de l'idée originale et vous permettent non seulement d'appeler des méthodes distantes, mais également d'envoyer simplement des messages de documents au format SOAP. Je ne sais pas encore pourquoi cela est nécessaire ; il est peu probable que la réponse ici soit « juste au cas où cela serait nécessaire ». J'aimerais moi-même apprendre de camarades plus expérimentés. Et enfin, JAX-RS est apparu pour les services Web dits RESTful, mais cela fait l'objet d'un article séparé. L'introduction peut s'arrêter ici, car... Nous apprendrons ensuite à travailler avec JAX-WS.

Approche générale

Dans les services Web, il y a toujours un client et un serveur. Le serveur est notre service Web et est parfois appelé le point de terminaison (comme dans le point de terminaison auquel parviennent les messages SOAP du client). Nous devons faire ce qui suit :
  1. Décrire l'interface de notre service web
  2. Implémenter cette interface
  3. Lancez notre service web
  4. Écrivez un client et appelez à distance la méthode de service Web souhaitée
Vous pouvez lancer un service web de différentes manières : soit décrire une classe avec la méthode main et lancer le service web directement en tant que serveur, soit le déployer sur un serveur comme Tomcat ou tout autre. Dans le second cas, nous ne lançons pas nous-mêmes un nouveau serveur et n'ouvrons pas un autre port sur l'ordinateur, mais disons simplement au conteneur de servlet Tomcat que « nous avons écrit ici des classes de service Web, veuillez les publier afin que tous ceux qui vous contactent puissent utilisez notre service Web." Quelle que soit la méthode de lancement du service web, nous aurons le même client.

Serveur

Lançons IDEA et créons un nouveau projet Créer un nouveau projet. Indiquons le nom BonjourWebService et appuyez sur le bouton Suivant, puis le bouton Finition. Dans le dossier src créons un package ru.javarush.ws. Dans ce package nous allons créer l'interface HelloWebService : package ru. javarush. c'est à dire; // ce sont des annotations, c'est-à-dire un moyen de marquer nos cours et nos méthodes, // en relation avec la technologie des services Web importer javax. jws. Méthode Web ; importer javax. jws. Service Web; importer javax. jws. savon. SOAPReliure ; // on dit que notre interface fonctionnera comme un service web@Service Web // on dit que le service web sera utilisé pour appeler des méthodes@SOAPBinding (style = SOAPBinding. Style. RPC) interface publique HelloWebService ( // on dit que cette méthode peut être appelée à distance@WebMethod public String getHelloString(String name) ; ) Dans ce code, les classes WebService et WebMethod sont ce qu'on appelle des annotations et ne font rien d'autre que marquer notre interface et sa méthode comme un service Web. La même chose s'applique à la classe SOAPBinding. La seule différence est que SOAPBinding est une annotation avec des paramètres. Dans ce cas, le paramètre style est utilisé avec une valeur indiquant que le service Web ne fonctionnera pas via des messages de document, mais comme un RPC classique, c'est-à-dire pour appeler une méthode. Implémentons notre logique d'interface et créons une classe HelloWebServiceImpl dans notre package. À propos, je note que terminer une classe par Impl est une convention en Java selon laquelle l'implémentation des interfaces est ainsi désignée (Impl - du mot implémentation, c'est-à-dire implémentation). Ce n'est pas une exigence et vous êtes libre de nommer la classe comme vous le souhaitez, mais les bonnes manières l'exigent : package ru. javarush. c'est à dire; // la même annotation que lors de la description de l'interface, importer javax. jws. Service Web; // mais ici il est utilisé avec le paramètre endpointInterface, // indiquant le nom complet de la classe d'interface de notre web service@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") la classe publique HelloWebServiceImpl implémente HelloWebService ( @Override public String getHelloString (String name) ( // renvoie simplement le message d'accueil return "Bonjour, " + nom + " !" ; ) ) Lançons notre service Web en tant que serveur indépendant, c'est-à-dire sans la participation de Tomcat et des serveurs d'applications (il s'agit d'un sujet pour une discussion distincte). Pour cela, dans la structure du projet dans le dossier src Créons un package ru.javarush.endpoint, et dans celui-ci nous créerons une classe HelloWebServicePublisher avec la méthode principale : package ru. javarush. point final ; // classe pour exécuter un serveur Web avec des services Web importer javax. XML. c'est à dire. Point final ; // classe de notre service web importer ru. javarush. c'est à dire. BonjourWebServiceImpl; classe publique HelloWebServicePublisher ( public static void main (String... args) ( // démarre le serveur web sur le port 1986 // et à l'adresse indiquée dans le premier argument, // démarre le service web passé en deuxième argument Point final. publier( "http://localhost:1986/wss/bonjour", nouveau HelloWebServiceImpl () ); ) ) Lançons maintenant cette classe en cliquant sur Maj+F10. Rien n'apparaîtra dans la console, mais le serveur est en cours d'exécution. Vous pouvez le vérifier en tapant la ligne http://localhost:1986/wss/hello?wsdl dans votre navigateur. La page qui s'ouvre, d'une part, prouve que nous avons un serveur Web (http://) fonctionnant sur le port 1986 sur notre ordinateur (localhost), et, d'autre part, montre une description WSDL de notre service Web. Si vous arrêtez l'application, la description deviendra indisponible, tout comme le service Web lui-même, nous ne le ferons donc pas, mais passons à l'écriture du client.

Client

Dans le dossier du projet src Créons un package ru.javarush.client , et dedans la classe HelloWebServiceClient avec la méthode principale : package ru. javarush. client; // nécessaire pour obtenir la description wsdl et à travers celle-ci // atteint le service Web lui-même importer Java. filet. URL ; // cette exception se produira lorsque vous travaillerez avec un objet URL importer Java. filet. MalformedURLException ; // classes pour analyser XML avec description wsdl // et atteignez le numéro de service qu'il contient importer javax. XML. espace de noms. QNom ; importer javax. XML. c'est à dire. Service; // interface de notre service web (il nous en faut plus) importer ru. javarush. c'est à dire. BonjourWebService ; classe publique HelloWebServiceClient ( public static void main (String args) lance MalformedURLException ( // crée un lien vers la description wsdl URL url = nouvelle URL ( "http://localhost:1986/wss/hello?wsdl") ; // On regarde les paramètres du constructeur suivant dans la toute première balise de la description WSDL - définitions // regarde le 1er argument dans l'attribut targetNamespace // regarde le 2ème argument dans l'attribut name QName qname = nouveau QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // Nous pouvons maintenant accéder au service tag dans la description wsdl, Service service = Service. créer (url, nomq) ; // puis jusqu'à la balise de port qui y est imbriquée, de sorte que // récupère un lien vers un objet de service Web distant de nous HelloWebService bonjour = service. getPort(HelloWebService.class); // Hourra ! Vous pouvez maintenant appeler la méthode distante Système. dehors. println (bonjour. getHelloString ( "JavaRush" ) ) ; ) ) J'ai donné un maximum de commentaires sur le code dans le listing. Je n'ai rien à ajouter, alors courons (Maj+F10). Nous devrions voir le texte dans la console : Bonjour, JavaRush ! Si vous ne l'avez pas vu, vous avez probablement oublié de démarrer le service Web.

Conclusion

Ce sujet a fourni une brève excursion dans les services Web. Encore une fois, je dirai qu'une grande partie de ce que j'ai écrit n'est que ma supposition quant à la façon dont cela fonctionne, et par conséquent, vous ne devriez pas trop me faire confiance. Je serais reconnaissant si des personnes bien informées me corrigeaient, car j'apprendrais alors quelque chose. MISE À JOUR.
Avez-vous aimé l'article? Partager avec des amis: