Création d'un système de reporting pour 1C: ERP basé sur OLAP et Excel

Les programmeurs et les utilisateurs savent combien de temps et les rapports difficiles sont créés dans 1C. Cependant, nous pouvons proposer pour examen une solution non standard - il s'agit de charger des données dans OLAP. OLAP - reporting analytique en ligne pour les entreprises avec la possibilité de créer des tableaux et des graphiques. Pour ceux qui l'ont essayé, il s'est avéré être un outil extrêmement pratique pour créer des rapports analytiques dans Microsoft Excel, comme on dit, de la manière habituelle pour les utilisateurs ordinaires dans les entreprises utilisant 1C: ERP.



Dans notre exemple, nous utiliserons Visual Studio C #, 2 bases de données Microsoft SQL Server - l'une est 1C: ERP et la seconde pour les rapports analytiques OLAP, ainsi que les tableaux croisés dynamiques dans Microsoft Excel.


Pour obtenir des informations sur les tables et la structure de la base de données 1C: ERP, nous utiliserons un traitement prêt à l'emploi qui se trouve déjà sur Internet (GetDatabaseStructure.epf ou base_structure.epf).




En utilisant un tel outil, nous verrons une liste de champs pour les objets 1C (répertoires, documents, lignes de document, énumérations, etc.) et leur objectif, cela nous sera utile à l'avenir pour programmer le chargement des données dans OLAP. Sur la base des données obtenues, nous préparerons des tableaux dans notre base de données séparée pour les rapports analytiques dans Microsoft SQL.


Dans Visual Studio, ajoutez la structure de table 1C à Linq to SQL




Nous ajouterons également la structure de table de notre base de données analytique dans Linq à SQL et créerons les relations entre eux.




Créer une classe dans Visual Studio pour recharger les données de la structure 1C vers la structure OLAP


public class DocProductionImporter { DataClasses1DataContext dataContext; s1_DataClasses1DataContext dataContextS1; public DocProductionImporter() { dataContext = new DataClasses1DataContext(); dataContextS1 = new s1_DataClasses1DataContext(); } .... } 

Nous chargeons en mémoire la liste des identifiants de documents 1C déjà disponibles dans la base de données OLAP. L'unicité des documents dans 1C est principalement prise en charge par IDRRef et Version. Tuple nous aidera à créer un index composite, si nécessaire.


Remplissez les index de la table SQL de la base de données OLAP


  HashSet<Tuple<System.Data.Linq.Binary, // IDRRef, Version System.Data.Linq.Binary>> fndDocVer = new HashSet<Tuple<System.Data.Linq.Binary, System.Data.Linq.Binary>>(); foreach (DocProduction doc in docs) { fndDocVer.Add(Tuple.Create(doc.IDRRef, doc.Version)); } 

Nous sélectionnons les documents de 1C: ERP et vérifions leur disponibilité dans notre base de données OLAP. Le champ _Version contient une valeur pour réconcilier la modification du document dans 1C


  var prodDocs = from c in dataContextS1._Document581s where c._Posted == posted select c; int i = 0; foreach (_Document581 doc in prodDocs) { if (fndDocVer.Contains(Tuple.Create(doc._IDRRef, doc._Version)) == true) { i++; continue; } .... 

Créer un nouveau ou mettre à jour un document existant


  // NEW DocProduction dp = new DocProduction(); dp.NumberPrefix = doc._NumberPrefix; dp.DocNumber = doc._Number; 

Dans la boucle du document, nous sélectionnons des liens vers des répertoires et d'autres objets à partir de dictionnaires préremplis.


Remplissez le dictionnaire pour les recherches ultérieures en mémoire (accélère considérablement le processus par rapport à la recherche à partir des tables de base de données SQL)


  Dictionary<System.Data.Linq.Binary, Int64> fndDepartments = new Dictionary<System.Data.Linq.Binary, Int64>(); var fDepartments = from g in dataContext.DimDepartments select g; foreach (DimDepartments fd in fDepartments) { fndDepartments.Add(fd.IDRRef, fd.ID); //   1    OLAP } 

Nous sélectionnons l'élément de répertoire dans le processus de téléchargement de documents


  if (fndDepartments.ContainsKey(doc._Fld15867RRef)) { Int64 val; fndDepartments.TryGetValue(doc._Fld15867RRef, out val); dp.DepartmentID = val; } else throw new Exception(); //      

À la fin du cycle, enregistrez le document dans la base de données OLAP


  dp.IDRRef = doc._IDRRef; dp.Version = doc._Version; if (doc._Posted == posted) //     1 dp.Active = true; else dp.Active = false; dataContext.DocProductions.InsertOnSubmit(dp); dataContext.SubmitChanges(); 

Sur cela, le travail dans Visual Studio sur le remplissage des plaques est terminé, nous nous tournons vers les tableaux croisés dynamiques dans Excel. Ajouter un nouveau tableau croisé dynamique



Nous dessinons le tableau dans Excel en ajoutant les champs nécessaires à la partie tabulaire, le résultat doit être le suivant (exemple)




Nous avons examiné un bref exemple de chargement de données dans une base de données SQL distincte pour générer des rapports analytiques dans OLAP et Excel à partir de toutes les configurations 1C. L'ensemble de tranches et d'indicateurs obtenus au cours d'un tel développement est prêt à être utilisé par l'utilisateur final dans le tableau croisé dynamique Microsoft Excel, générant toutes les options de rapport qui conviennent à l'utilisateur.


Examinez de plus près le code source pour des exemples sur GitHub

Source: https://habr.com/ru/post/fr449264/


All Articles