Maison / Bon à savoir / 1c Chaîne de connexion aux sources de données externes. Sources de données externes. Exemple de chaîne de connexion

1c Chaîne de connexion aux sources de données externes. Sources de données externes. Exemple de chaîne de connexion

Pourquoi cette opportunité suscite un tel intérêt ? Toute personne qui a programmé en 1C est assez familière avec SQL et au moins en termes généraux familiers avec l'architecture et les principes de développement d'autres plates-formes technologiques pour les applications métier vous dira avec certitude ce qu'il aime le plus en 1C. Bien sûr, le générateur de requêtes est le mécanisme le plus pratique et le plus réfléchi pour écrire des requêtes afin d'obtenir des données à partir de structures relationnelles que j'ai personnellement rencontrées. Et maintenant, 1C nous a donné une merveilleuse opportunité de l'utiliser non seulement avec 1C, mais aussi avec n'importe quelle autre table. Voici juste un tas de "mouche dans la pommade" versé dans ce "tonneau de miel". Tout dans l'ordre :

1) Configuration et utilisation- sans "danser avec un tambourin" ne fonctionnera pas
a) Ajouter une source de données externe - cela ne semble pas compliqué
b) cochez la case "Sélectionner dans la liste" - c'est nécessaire - cela est nécessaire pour vérifier les performances au début et vous éviter des problèmes inutiles
c) - assurez-vous d'appuyer sur "..." - la connexion est ODBC. Pas OLEDB comme nous en avons tous l'habitude, mais un niveau plus bas

D) Soyez TRÈS PRUDENT ici.

Il s'agit d'un pilote ODBC - si vous utilisez la version client-serveur, il doit être sur le serveur. Si vous développez sur un seul système, et version de travail d'autre part (comme c'est généralement le cas) assurez-vous qu'il n'y a pas de surprises en réserve pour vous. Une recommandation étrange, mais choisissez le pilote le plus ancien ou le plus courant si vous n'êtes pas particulièrement soucieux de la vitesse et que vous n'avez pas l'intention d'aller au-delà des limites de la norme SQL92. Cela vous fournira meilleure compatibilité. Par exemple pour SQL Server 2008 le meilleur chauffeur il y aura SQL Server Native Client 11, mais je recommande de choisir uniquement SQL Server, sinon ce client très natif devra être installé soit sur le serveur, soit sur toutes les machines clientes (dans le cas de l'utilisation de la version fichier), et il ne donne pas beaucoup de gain pour des tâches simples.
e) Boîtes de dialogue de sélection de serveur standard

E) Je recommande de répondre "oui" à la question de l'enregistrement du mot de passe, sinon cela ne fonctionnera pas pour démarrer cette entreprise.
g) Choisissez une table et des détails... une excellente opportunité - vous pouvez immédiatement la renommer comme vous le souhaitez (et les détails aussi), tandis que dans les propriétés, vous verrez les noms des champs de la source de données

H) Et maintenant vous exécutez, ouvrez le concepteur de requêtes - vous sélectionnez bêtement tous les enregistrements de la table et l'OPA - une erreur. Que faire? Si vous avez une interface managée, regardez dans le menu service, et si vous en avez une normale...
J'ai personnellement utilisé ce code :
Code 1C v 8.x Paramètres = ExternalDataSources.DAX.GetCommonConnectionParameters();
Paramètres.AuthenticationStandard = true ;
Paramètres.UserName = "sa" ;
Paramètres.Password = "pas" ;
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database" ;
Paramètres.DBMS = "MSSQLServer" ;

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameters);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();
Peut-être que certaines pièces ne sont pas nécessaires, mais cela fonctionne.
Vous devez exécuter le code UNE FOIS. Après cela, il se connectera normalement ... le mysticisme bien sûr - pourquoi c'était nécessaire n'est pas clair ...

2) Sources de données en lecture seule- Oui, les miracles ne se produisent pas ... mais parfois vous voulez ....

3) NE PAS LES UTILISER AVEC DES SOURCES DE DONNÉES INTERNES
Personnellement, ce fait m'a tué sur le coup.

Comment est-ce ... ce qu'ils attendaient et déjà imaginé et léché comment nous combinons maintenant nos données avec 1C dans une seule demande, les retournons - les regroupons, les insérons dans le rapport, mais ce n'était pas là .. .
Mais bien sûr, cela n'arrête pas les personnes expérimentées ... quelle pensée vous est venue à l'esprit? C'est vrai - tables temporaires :

4) NE PAS LES UTILISER AVEC DES TABLES TEMPORAIRES

Mais cela ne ressemble plus à des difficultés technologiques, mais cela ressemble beaucoup à ce qu'ils veulent que nous fassions "pour que la vie ne ressemble pas à un paradis" :).

5) Ne peut être utilisé que dans les connexions SKD
Pour ceux qui ne le savent pas, c'est dans l'ACS sur l'onglet "Dataset Links". À quelle fréquence les utilisez-vous ? À l'aise? Apparemment, ils veulent nous forcer à les utiliser plus souvent. Mais il y a une colonne "Condition de lien" et "Paramètre de lien". Je n'ai trouvé aucun exemple de leur utilisation dans une configuration typique, dans la documentation et dans Khrustaleva également, d'une manière ou d'une autre, tout n'est pas transparent. Quelqu'un peut-il m'expliquer comment fonctionne la "condition de lien". Si vous y écrivez SourceAttribute = ReceiverRevision, cela ne fonctionne pas. Bien sûr, la condition peut être écrite dans le champ "Expression" - dans la plupart des cas, cela suffit ... mais d'une manière ou d'une autre, ce n'est pas très facile.

Au total, ce problème a déjà été résolu quelque part comme ceci :
Code 1C v 8.x Fonction InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value ;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value ;
Si DateCon > "20100101" Alors
DateCon = "20100101" ;
Fin si;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

NuméroTableau = Nouveau Tableau();
ArrayNumber.Add(Type("Number"));

ArrayString = Nouveau tableau();
ArrayString.Add(Type("String"));

ArrayData = Nouveau tableau();
ArrayDate.Add(Type("Date"));

//Nous renseignerons le coût comptable dans le tableau
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//table pour charger les données depuis SQL
TK = Nouvelle Table de Valeurs();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add("Période", TypeDate);

TK.Indices.Add("Période");

// Connexion à SQL
ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports" ;
Connexion = New COMObject("ADODB.Connexion");
Commande = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Date="" ;
Tentative
Connexion.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Connexion ;
Command.CommandText = "S_elect * from PH where period >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" et point<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Exception
Retour des savoirs traditionnels ;
fin de tentative ;

Tandis que RecordSet.EOF = fausse boucle
String = TK.Add();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value ;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value ;
String.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value ;
RecordSet.MoveNext();
FinCycle ;

Demande = Nouvelle demande();
VrTable = NewTempTableManager();
Query.SetParameter("vDataTable", TK);
Requête.SetParameter("StartDate", StartDate);
Requête.SetParameter("DateCon", DateCon);
Requête.Texte = "SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Period
|PUT Table de données
| DEPUIS
| &vrDataTable AS vrDataTable
| OÙ
| vrDataTable.Period >= &DateStart
| Et vrDataTable.Period<= &ДатаКон";
Request.Execute();
TK = Non défini ;

Demande = Nouvelle demande ;
Query.TempTableManager = VrTable ;
Query.Text = "Voici une requête impliquant une table temporaire" ;

Résultat = Request.Run();
Retourner le résultat ;

EndFunctions

OuterSet = InitializeDataSource();
DataSet = Nouvelle Structure();
DataSet.Insert("SQL Table", ExternalSet);
GenericReports.Generate GenericReport(ThisObject, Result, Decryption Data, OutputToReportForm,DataSet);

En fait, il n'y a pas beaucoup de lignes de code et elles sont assez standard... dans ce cas, vous pouvez utiliser toutes les fonctionnalités du générateur de requêtes, et ne donner que la fonction DATA COMPOSITION dans l'ACS

Mais, bien sûr, ça a l'air un peu moins beau ... et en téléchargeant dans le tableau des valeurs chaque fois que vous devez écrire du code et vérifier si vous avez fait une erreur dans le nom des détails ... sinon, ce qui nous a été donné en 1C semble en quelque sorte sans enthousiasme. Je n'ai pas encore décidé lequel est le plus pratique à utiliser. Vous décidez, et écrivez sur vos décisions et ce qui vous a poussé à les prendre.

Informations tirées du site

Version 8.2.14.533 - enfin une version plus ou moins stable de la 14e version de la plateforme. Enfin, il y avait une chance d'essayer une merveilleuse opportunité - "les sources de données externes".

Pourquoi cette opportunité présente-t-elle un tel intérêt ? Toute personne qui a programmé en 1C est assez familière avec SQL et au moins en termes généraux familiers avec l'architecture et les principes de développement d'autres plates-formes technologiques pour les applications métier vous dira avec certitude ce qu'il aime le plus en 1C. Bien sûr, le générateur de requêtes est le mécanisme le plus pratique et le plus réfléchi pour écrire des requêtes afin d'obtenir des données à partir de structures relationnelles que j'ai personnellement rencontrées. Et maintenant, 1C nous a donné une merveilleuse opportunité de l'utiliser non seulement avec 1C, mais aussi avec n'importe quelle autre table. Voici juste un tas de "mouche dans la pommade" versé dans ce "tonneau de miel". Tout dans l'ordre :

1) Configuration et utilisation - sans "danser avec un tambourin", cela ne fonctionnera pas

A) Ajouter une source de données externe - cela ne semble pas compliqué
b) cochez la case "Sélectionner dans la liste" - c'est nécessaire - cela est nécessaire pour vérifier les performances au début et vous éviter des problèmes inutiles
dans)
(IMG : http://pics.livejournal.com/comol/pic/0000cr1r.png)
- assurez-vous d'appuyer sur "..." - la connexion est ODBC. Pas OLEDB comme nous en avons tous l'habitude, mais un niveau plus bas

Et être ici TRÈS À L'ATTENTION.

Il s'agit d'un pilote ODBC - si vous utilisez la version client-serveur, il doit se trouver sur le serveur. Si vous développez sur un système et travaillez sur un autre (comme c'est généralement le cas), assurez-vous de ne pas avoir de surprises. Une recommandation étrange, mais choisissez le pilote le plus ancien ou le plus courant si vous n'êtes pas particulièrement soucieux de la vitesse et que vous n'avez pas l'intention d'aller au-delà des limites de la norme SQL92. Cela vous donnera la meilleure compatibilité. Par exemple, pour SQL Server 2008, le meilleur pilote serait SQL Server Native Client 11, mais je recommande de choisir uniquement SQL Server, sinon ce client très natif devra être installé soit sur le serveur, soit sur toutes les machines clientes (dans le cas d'utiliser la version de fichier), et le gain est spécial pour simple, il ne vous donnera pas de travail.

E) Boîtes de dialogue de sélection de serveur standard

G) Choisissez une table et des détails ... une excellente opportunité - vous pouvez immédiatement la renommer comme vous le souhaitez (et les détails aussi), tandis que dans les propriétés, vous verrez les noms des champs de la source de données

H) Et maintenant vous exécutez, ouvrez le concepteur de requêtes - vous sélectionnez bêtement tous les enregistrements de la table et l'OPA - une erreur. Que faire? Si vous avez une interface managée, regardez dans le menu service, et si vous en avez une normale...
J'ai personnellement utilisé ce code :

Paramètres = ExternalDataSources.DAX.GetCommonConnectionParameters();
Paramètres.AuthenticationStandard = true ;
Paramètres.UserName = "sa" ;
Paramètres.Password = "pas" ;
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database" ;
Paramètres.DBMS = "MSSQLServer" ;

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameters);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();

Peut-être que certaines pièces ne sont pas nécessaires, mais cela fonctionne. Besoin d'exécuter du code UNE FOIS QUE. Après cela, il se connectera normalement ... le mysticisme bien sûr - pourquoi c'était nécessaire n'est pas clair ...

2) Sources de données en lecture seule
Oui, les miracles ne se produisent pas ... mais parfois vous voulez ....

3) NE PAS LES UTILISER AVEC DES SOURCES DE DONNÉES INTERNES
Personnellement, ce fait m'a tué sur le coup.

Comment est-ce ... ce qu'ils attendaient et déjà imaginé et léché comment nous combinons maintenant nos données avec 1C dans une seule demande, les retournons - les regroupons, les insérons dans le rapport, mais ce n'était pas là .. .

Mais bien sûr, cela n'arrête pas les personnes expérimentées ... quelle pensée vous est venue à l'esprit? C'est vrai - tables temporaires :

4) NE PAS LES UTILISER AVEC DES TABLES TEMPORAIRES

Mais cela ne ressemble plus à des difficultés technologiques, mais cela ressemble beaucoup à ce qu'ils veulent que nous fassions "pour que la vie ne ressemble pas à un paradis" (IMG :) .

5) Ne peut être utilisé que dans les connexions SKD

Pour ceux qui ne le savent pas, c'est dans l'ACS sur l'onglet "Dataset Links". À quelle fréquence les utilisez-vous ? À l'aise? Apparemment, ils veulent nous forcer à les utiliser plus souvent. Mais il y a une colonne "Condition de lien" et "Paramètre de lien". Je n'ai trouvé aucun exemple de leur utilisation dans une configuration typique, dans la documentation et dans Khrustaleva également, d'une manière ou d'une autre, tout n'est pas transparent. Quelqu'un peut-il m'expliquer comment fonctionne la "condition de lien". Si vous y écrivez SourceAttribute = ReceiverRevision, cela ne fonctionne pas. Bien sûr, la condition peut être écrite dans le champ "Expression" - dans la plupart des cas, cela suffit ... mais d'une manière ou d'une autre, ce n'est pas très facile.

Au total, ce problème a déjà été résolu quelque part comme ceci :

Fonction InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value ;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value ;
Si DateCon > "20100101" Alors
DateCon = "20100101" ;
Fin si;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

NuméroTableau = Nouveau Tableau();
ArrayNumber.Add(Type("Number"));

ArrayString = Nouveau tableau();
ArrayString.Add(Type("String"));

ArrayData = Nouveau tableau();
ArrayDate.Add(Type("Date"));

//Nous renseignerons le coût comptable dans le tableau
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//table pour charger les données depuis SQL
TK = Nouvelle Table de Valeurs();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add("Période", TypeDate);

TK.Indices.Add("Période");

// Connexion à SQL
ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports" ;
Connexion = New COMObject("ADODB.Connexion");
Commande = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Date="" ;
Tentative
Connexion.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Connexion ;
Command.CommandText = "Select * from PH where period >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" et period RecordSet = Command.Execute();
RecordSet.MoveFirst();
Exception
Retour des savoirs traditionnels ;
fin de tentative ;

Tandis que RecordSet.EOF = fausse boucle
String = TK.Add();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value ;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value ;
String.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value ;
RecordSet.MoveNext();
FinCycle ;

Demande = Nouvelle demande();
VrTable = NewTempTableManager();
Query.SetParameter("vDataTable", TK);
Requête.SetParameter("StartDate", StartDate);
Requête.SetParameter("DateCon", DateCon);
Requête.Texte = "SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Period
|PUT Table de données
| DEPUIS
| &vrDataTable AS vrDataTable
| OÙ
| vrDataTable.Period >= &DateStart
| Et vrDataTable.Period Query.Execute();
TK = Non défini ;

Demande = Nouvelle demande ;
Query.TempTableManager = VrTable ;
Query.Text = "Voici une requête impliquant une table temporaire" ;

Résultat = Request.Run();
Retourner le résultat ;

EndFunctions

OuterSet = InitializeDataSource();
DataSet = Nouvelle Structure();
DataSet.Insert("SQL Table", ExternalSet);
GenericReports.Generate GenericReport(ThisObject, Result, Decryption Data, OutputToReportForm,DataSet);

En fait, il n'y a pas beaucoup de lignes de code et elles sont assez standard... dans ce cas, vous pouvez utiliser toutes les fonctionnalités du générateur de requêtes, et ne donner que la fonction DATA COMPOSITION dans l'ACS

Mais, bien sûr, ça a l'air un peu moins beau ... et en téléchargeant dans le tableau des valeurs chaque fois que vous devez écrire du code et vérifier si vous avez fait une erreur dans le nom des détails ... sinon, ce qui nous a été donné en 1C semble en quelque sorte sans enthousiasme. Je n'ai pas encore décidé lequel est le plus pratique à utiliser. Vous décidez, et écrivez sur vos décisions et ce qui vous a poussé à les prendre.

[vous devez vous inscrire pour voir le lien]

Sources externes Les données 1C sont un objet de métadonnées relativement nouveau 1C 8.3 et 8.2, à l'aide duquel il est possible de connecter des sources de données externes à 1C: tables SQL, Excel, Access, FoxPro (dbf), une autre base de données 1C, Oracle, Paradox (db ), - et même la lecture de fichiers simples txt/csv.

Cela donne beaucoup d'occasions de travailler avec d'autres systèmes. Considérons plus en détail.

Configuration de sources de données externes dans 1C 8

La configuration des sources externes est individuelle pour chaque type de système. Mais, en règle générale, la partie commune du paramètre est la même - il s'agit de définir la chaîne de connexion :

Obtenez gratuitement 267 leçons vidéo 1C :

Si la chaîne de connexion est correcte, le système vous invite à sélectionner la table requise dans la base de données. En conséquence, nous obtiendrons un tableau prêt à l'emploi dans lequel vous pourrez spécifier le champ clé (champ unique) et le champ d'affichage (comment l'enregistrement sera reflété dans 1C):

Utilisation de sources de données externes dans 1C 8.3

Les sources de données externes dans 1C peuvent être utilisées comme d'autres tables de base de données. La plateforme génère automatiquement un formulaire pour eux si aucun n'est défini. Les requêtes peuvent également utiliser des données provenant de sources externes.

Dans la plate-forme version 8.3.5.1068 (et ultérieure), il est devenu possible d'ajouter, de modifier et de supprimer des données dans des sources externes outils logiciels 1C. Des exemples de cette fonctionnalité sont présentés dans cet article.

Afin de rendre possible l'enregistrement sur des sources externes, 1C a ajouté de nouvelles propriétés aux tables de données et aux champs de sources externes :

  • Pour toute la table - propriété Lecture seule. Lecture seule = Vrai signifie que la modification des données dans ce tableau n'est pas possible ;
  • Pour les champs de table individuels - propriétés Lecture seule, Permettre null et Valeur de remplissage:
    • Lecture seule = Vrai signifie que la modification des données dans ce champ n'est pas possible ;
    • AutoriserNull = Vrai signifie qu'une valeur peut être écrite dans ce champ NUL;
    • Valeur de remplissage contient la valeur par défaut de ce champ (s'il existe).

Vous (lors de la description manuelle des tables) ou la plateforme (lors de la création de tables avec le concepteur) pouvez utiliser ces propriétés de la manière suivante.

  • Lecture seule = Vrai défini, par exemple, pour les vues (vue), les tables obtenues sur la base d'une expression (résultat de la fonction) et similaires. Les données de ces tables ne peuvent pas être modifiées ;
  • Lecture seule = Vrai spécifier pour les champs définis automatiquement ( INCRÉMENTATION AUTOMATIQUE), champs calculés, etc. Les données de ces champs ne peuvent pas être modifiées ;
  • AutoriserNull = Vrai défini pour tous les champs, à l'exception des champs clés, et ceux qui sont décrits dans une source externe comme NON NUL;
  • Valeur de remplissage champs à définir dans le cas où la valeur standard de ce champ est précisée dans la source externe (valeur DÉFAUT).

Vous pouvez ajouter, modifier et supprimer des données dans des sources externes à l'aide du langage intégré ou de manière interactive. Dans le langage intégré, les méthodes suivantes du gestionnaire de tables sont utilisées pour cela :

  • Créer un jeu d'enregistrements()- pour les tables non-objet ;
  • Nouvelle méthode CréerObjet()- pour les tables d'objets.

En conséquence, les objets ExternalDataSourceTableRecordSet et ExternalDataSourceTableObjectExternalDataSourceTableObject de nouvelles méthodes sont apparues Écrire() et Effacer().

Ajout de données

Lorsque vous ajoutez des données à une source externe, vous créez un objet (ou un jeu d'enregistrements), définissez des valeurs de champ et écrivez. Cependant, certaines fonctionnalités sont utiles à connaître.

Par exemple, lorsque vous essayez de définir la valeur d'un champ qui a Lecture seule = Vrai, une erreur sera renvoyée. Et lors de l'écriture directement dans la base de données dans l'expression INSÉRER ces champs seront ignorés. Le reste des champs est rempli avec les valeurs que vous leur avez attribuées. Par conséquent, les valeurs Nul et les valeurs par défaut doivent être attribuées explicitement aux champs.

  • identifiant(AutoriserNull = Vrai);
  • Nom(AutoriserNull = Vrai);
mCharacteristic = ExternalDataSources.IM.Tables.shop_feature.CreateObject(); mCaractère.id = Code ; mCharacteristic.name = Nom ; mCharacteristic.Write();

Exécution de l'instruction Écrire() provoquera l'appel du gestionnaire d'événements en premier Avant l'enregistrement, puis une écriture physique est effectuée dans la table source externe ( INSÉRER), alors le gestionnaire d'événements sera appelé Lors de l'enregistrement.

Avec le champ clé de la table source externe, vous pouvez effectuer les opérations suivantes. Si le champ clé est modifiable, vous définissez "manuellement" sa valeur avant d'écrire. Si la modification du champ clé est interdite, la plateforme obtiendra indépendamment la clé dans INSÉRER ou juste après. Vous pouvez intervenir dans ce processus avec la méthode SetReferenceNew() avant l'enregistrement physique (dans le gestionnaire d'événements Avant l'enregistrement) ou directement après l'entrée physique (dans le gestionnaire d'événements Lors de l'enregistrement).

Modifier les données

Lorsque les données sont modifiées, les valeurs de tous les champs de la table qui ont Lecture seule = Faux.

MFeature = ExternalDataSources.IM.Tables.shop_feature.FindByField("id",code); mObject = mCharacteristic.GetObject(); mObject.name = Nom ; mObject.Write();

S'il est nécessaire d'enregistrer uniquement certains champs, vous pouvez spécifier leur liste directement depuis le langage intégré en utilisant les méthodes SetWritableFields() et GetWritableFields().

Suppression de données

La suppression de données supprime directement une ligne d'une table de base de données. Dans le même temps, les références à l'objet supprimé ne sont pas recherchées. Si une telle fonctionnalité est nécessaire, vous pouvez la programmer vous-même dans le gestionnaire d'événements AvantSuppression().

MFeature = ExternalDataSources.IM.Tables.shop_feature.FindByField("id",Code); mObject = mCharacteristic.GetObject(); mObject.Delete();

Transactions

La lecture de données provenant de sources externes, comme auparavant, est effectuée en dehors d'une transaction, et lors de l'écriture, la plate-forme ouvre une transaction implicite. En même temps, vous pouvez effectuer à la fois la lecture et l'écriture dans des transactions explicites à l'aide de méthodes d'objet ExternalDataSourceManager:

  • DébutTransaction();
  • CommitTransaction();
  • Annuler la transaction().

Serrures

  • Auto;
  • Géré;
  • Automatique et contrôlé.

ainsi que la propriété table source externe Niveau d'isolementTransactions:

De plus, vous pouvez définir indépendamment le niveau de verrouillage dans la méthode DébutTransaction().

J'ai complété l'article typique avec des exemples) Il y aura plus de temps - j'ajouterai plus d'exemples.

Dans la version 8 du programme 1C, les développeurs ont ajouté à la fonctionnalité la possibilité de connecter des bases de données tierces et d'obtenir des informations directement depuis le configurateur, sans utiliser Connexions COM et les objets OLE. Cette fonctionnalité est implémentée à l'aide d'un nouvel objet - "Sources de données externes"

Les sources de données externes dans 1C peuvent être utilisées de la même manière que le reste des tables système :

  1. Lors de la création de rapports et de calculs à l'aide d'un système de composition de données (ACS);
  2. Pour obtenir des liens vers des informations stockées dans des sources tierces ;
  3. Pour modifier les données stockées dans les tables ;
  4. Lors des demandes.

Il est important de savoir que ce mécanisme n'est pas conçu pour fonctionner avec d'autres bases de données 1C, car le modèle de fonctionnement 1C.Enterprise lui-même n'implique pas d'interférence avec les données au niveau des tables physiques.

Créer une nouvelle source

L'ajout d'une nouvelle source externe au programme s'effectue en mode "Configurateur". Il existe une branche correspondante dans l'arborescence de configuration (Fig. 1)

Vous devrez transpirer lors de la création d'une nouvelle source, malgré le fait que la forme du nouvel objet ne comporte que quatre onglets :

  1. De base;
  2. Données;
  3. Les fonctions;
  4. Droits.

Le premier onglet n'a qu'un seul paramètre intéressant - le mode de contrôle du verrouillage. Si vous ne posez pas de questions sur le blocage des données dans les transactions, sur les subtilités de la parallélisation flux d'informations vous pouvez laisser ce paramètre en mode de verrouillage automatique. Cependant, cette approche peut entraîner des restrictions excessives (par exemple, lorsqu'au lieu d'un seul enregistrement, le programme verrouille toute la table physique, privant les autres utilisateurs de la possibilité de travailler avec).

Les verrous gérés, contrairement aux verrous automatiques, utilisent le mécanisme de transaction inhérent au programme lui-même, et non au SGBD, ce qui vous permet de traduire les captures de table en beaucoup plus niveau faible.

En définissant ce paramètre sur "Automatique et géré", nous donnons au système la possibilité de déterminer le mode à utiliser en se référant directement à la propriété similaire de chaque table spécifique.

Onglet Données du formulaire des propriétés de la source externe

La forme de l'onglet "Données" est illustrée à la Fig. 2

Riz. 2

Ici, nous pouvons ajouter des tables et des cubes sources externes. Il existe deux manières d'ajouter un tableau :

  1. Manuellement, nous verrons ensuite le formulaire pour ajouter une table (Fig. 3);

Riz. 3

  1. Ou sélectionnez dans la liste des tables source physiques (Fig. 4), dans ce cas un constructeur spécial s'ouvre devant nous.

Riz. quatre

Examinons de plus près le formulaire d'ajout d'une table. La propriété "Name" permet d'identifier de manière unique un objet dans la configuration.

La comparaison de l'objet de métadonnées et de la table physique finale se fait via la propriété "Nom dans la source de données" située dans l'onglet "Complémentaire" (Fig. 5)

Riz. 5

Ensuite, il faut déterminer le type du tableau, ou plutôt son objectivité. Si les données stockées dans la structure peuvent être identifiées de manière unique via n'importe quel champ, la table peut être une table d'objets. Si l'identité de l'enregistrement est déterminée par un ensemble de champs clés, la table doit avoir un type non objet.

En comparant ces tables avec d'autres objets de métadonnées, nous pouvons établir l'analogie suivante :

  • Les tables d'objets sont des livres de référence ;
  • Les registres d'informations ne sont pas objectifs.

L'ensemble des champs clés est défini dans le paramètre de formulaire suivant ("Champs clés"). Ce champ est obligatoire, le laisser vide entraînera une erreur lors de l'enregistrement de la configuration.

Comme vous pouvez le voir sur la Fig.5, certains champs et boutons de formulaire ne peuvent pas être modifiés :

  • Expression dans la source de données ;
  • Type de données de tableau ;
  • Afficher le champ ;
  • Afficher les gestionnaires.

Ils ne peuvent être utilisés qu'après avoir rempli les champs du tableau, défini leur type et défini leurs identifiants (Fig. 6)

Riz. 6

Ici, vous devez faire attention à l'option "Autoriser Null", si cette case est cochée, un tel champ n'est pas souhaitable pour être utilisé comme clé.

Constructeur de tableaux

Peut-être le plus important et point intéressant travailler avec des sources externes consiste à créer une chaîne de connexion. Son constructeur s'ouvre lorsque vous cliquez sur le bouton avec trois points à côté du paramètre "Chaîne de connexion".

Tout d'abord, il nous sera demandé de décider du pilote qui sera utilisé pour se connecter (Fig. 7)

Riz. sept

Une mauvaise définition de ce paramètre ne vous permettra pas de vous connecter à un tiers base d'informations. Il faut également comprendre que tous les pilotes spécifiés dans la liste déroulante ne peuvent pas être utilisés pour générer automatiquement une chaîne de connexion. Si la plate-forme a donné une erreur (Fig. 8), la chaîne de connexion devra être écrite manuellement.

Fig.8

Riz. 9

La ligne elle-même est une construction strictement réglementée.

Exemple de chaîne de connexion

Considérez une base de données tierce créée dans Microsoft Access et situé à la racine du lecteur D. Pour connecter cette base, il faut utiliser le pilote approprié, mais le choisir dans le constructeur de ligne conduit à une erreur Fig.8.

Nous écrirons nous-mêmes les paramètres de connexion.

Driver=(Microsoft Access Driver (*.mdb)) - voici à quoi ressemble la première partie de la ligne. Entre accolades, nous avons défini le pilote.

Pour Fichiers Excelça ressemblera Microsoft Excel Pilote (*.xls)), pour les fichiers Excel créés dans Office antérieurs à 2003, la ligne de pilote ressemblera à (Pilote Microsoft Excel (*.xls, *.xlsx, *.xlsm, *.xlsb)).

En séparant ce paramètre du suivant par un point-virgule, nous devons écrire l'adresse de notre stockage (dans notre cas, DBQ=D:\Database1.mdb).

En ajoutant ces deux paramètres, nous obtenons Driver=(Microsoft Access Driver (*.mdb));DBQ=D:\Database1.mdb, en écrivant ce paramètre, nous obtenons l'accès aux structures internes de cette base de données.

Pour l'objet "Source externe", il ne suffit pas de le créer dans la configuration, il faut aussi le connecter en mode "Entreprises". Cela peut être fait à partir du menu "Toutes les fonctions"->Sources externes. Lorsque nous entrons pour la première fois dans notre table, nous devons écrire la même chaîne de connexion déjà en mode "Enterprise".