Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Метод извлечь данные из базы 1С

Anna | 17.06.2014 | нет комментариев
Хочу поделиться методом выгрузки данных из 1С на основе COM-соединения. Данный вариант дозволено назвать альтернативным применению стандартных и нестандартных обработок 1С. Для примера взят язык C#, а выгрузка выполняется в один огромный XML-файл.

Где дозволено применить

Для эксперта обмен данными между двумя системами труден в том плане, что необходимо разбираться и в своей работе, и в неизвестной среде. Если вам необходимы данные из 1С, но постижение 1С не является для вас многообещающим направлением, как вариант предлагаю метод приобретения данных через внешнее соединение вообще без визуального открытия 1С.
Испробовать применить данный метод дозволено в различных задачах:

  • загрузить в иную базу данных произвольного формата;
  • перейти с 1С на иную систему учета (миграция данных);
  • направить поток данных в базу для обзора (OLAP);
  • иметь архивную копию данных в открытом виде.

Сразу хочу сказать о недостатке данного метода. В 1С написано много обработок выгрузки данных под различные цели. Применение обработок 1С дозволено назвать самым официальным методом приобретения данных. Нормальная обработка не только выгружает данные из базы, но и комфортным образом их преобразует и компонует через соединения в запросах и путем проведения расчетов на встроенном языке. Выгружая данные описанным в статье методом вы получаете только первичные таблицы, сохраненные в базе данных, и может понадобиться их последующая обработка.

Подробнее о итоге

Что мы получим?

Через внешнее соединение дозволено выгрузить данные в файл произвольного формата либо передать полученные записи в иную базу данных вообще не сберегая промежуточный файл. Тут выгрузка в xml-файл сделана как демонстрация самой вероятности выгрузки.
Данные извлекаются из базы 1С и помещаются в один xml-файл. Вот пример получаемого файла.

<?xml version="1.0" encoding="utf-8"?>
<database>
  <catalog name="Контрагенты">
    <item>
      <attribute name="Ссылка" value="0cc56775-0daa-11e3-bf95-f46d04eec7f5" />
      <attribute name="ВерсияДанных" value="AAAAAQAAAAA=" />
      <attribute name="ПометкаУдаления" value="false" />
      <attribute name="Предопределенный" value="false" />
      <attribute name="Код" value="000000001" />
      <attribute name="Название" value="Торговый дом" />
      <attribute name="ИНН" value="1111111111" />
      <attribute name="КПП" value="222222222" />
    </item>
    <item>
      <attribute name="Ссылка" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" />
      <attribute name="ВерсияДанных" value="AAAAAwAAAAA=" />
      <attribute name="ПометкаУдаления" value="false" />
      <attribute name="Предопределенный" value="false" />
      <attribute name="Код" value="000000002" />
      <attribute name="Название" value="Магазин" />
      <attribute name="ИНН" value="3333333333" />
      <attribute name="КПП" value="444444444" />
    </item>
  </catalog>
  <catalog name="Номенклатура">
    <item>
      <attribute name="Ссылка" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" />
      <attribute name="ВерсияДанных" value="AAAAAgAAAAA=" />
      <attribute name="ПометкаУдаления" value="false" />
      <attribute name="Предопределенный" value="false" />
      <attribute name="Код" value="000000001" />
      <attribute name="Название" value="Телевизор" />
      <attribute name="Цена" value="15000" />
    </item>
    <item>
      <attribute name="Ссылка" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" />
      <attribute name="ВерсияДанных" value="AAAAAwAAAAA=" />
      <attribute name="ПометкаУдаления" value="false" />
      <attribute name="Предопределенный" value="false" />
      <attribute name="Код" value="000000002" />
      <attribute name="Название" value="Ноутбук" />
      <attribute name="Цена" value="25000" />
    </item>
  </catalog>
  <document name="Счет">
    <attribute name="Ссылка" value="0cc56779-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="ВерсияДанных" value="AAAAAQAAAAA=" />
    <attribute name="ПометкаУдаления" value="false" />
    <attribute name="Номер" value="000000001" />
    <attribute name="Дата" value="2013-08-25T21:19:56" />
    <attribute name="Проведен" value="true" />
    <attribute name="Контрагент" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="Строки">
      <line>
        <attribute name="Ссылка" value="0cc56779-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="НомерСтроки" value="1" />
        <attribute name="Номенклатура" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="число" value="1" />
        <attribute name="Цена" value="25000" />
        <attribute name="Сумма" value="25000" />
      </line>
    </attribute>
  </document>
  <document name="Счет">
    <attribute name="Ссылка" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="ВерсияДанных" value="AAAAAwAAAAA=" />
    <attribute name="ПометкаУдаления" value="false" />
    <attribute name="Номер" value="000000002" />
    <attribute name="Дата" value="2013-08-25T21:22:49" />
    <attribute name="Проведен" value="true" />
    <attribute name="Контрагент" value="0cc56775-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="Строки">
      <line>
        <attribute name="Ссылка" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="НомерСтроки" value="1" />
        <attribute name="Номенклатура" value="0cc56778-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="число" value="1" />
        <attribute name="Цена" value="25000" />
        <attribute name="Сумма" value="25000" />
      </line>
      <line>
        <attribute name="Ссылка" value="0cc5677a-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="НомерСтроки" value="2" />
        <attribute name="Номенклатура" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="число" value="2" />
        <attribute name="Цена" value="15000" />
        <attribute name="Сумма" value="30000" />
      </line>
    </attribute>
  </document>
  <document name="Убыточная">
    <attribute name="Ссылка" value="0cc5677b-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="ВерсияДанных" value="AAAAAgAAAAA=" />
    <attribute name="ПометкаУдаления" value="false" />
    <attribute name="Номер" value="000000001" />
    <attribute name="Дата" value="2013-08-25T21:23:10" />
    <attribute name="Проведен" value="true" />
    <attribute name="Контрагент" value="0cc56776-0daa-11e3-bf95-f46d04eec7f5" />
    <attribute name="Кладовщик" value="Сидоров С.С." />
    <attribute name="Строки">
      <line>
        <attribute name="Ссылка" value="0cc5677b-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="НомерСтроки" value="1" />
        <attribute name="Номенклатура" value="0cc56777-0daa-11e3-bf95-f46d04eec7f5" />
        <attribute name="число" value="15000" />
        <attribute name="Цена" value="15000" />
        <attribute name="Сумма" value="15000" />
      </line>
    </attribute>
  </document>
</database>
Какие данные выгружаются

Числовые и строковые типы сохраняются в выгружаемом файле в обыкновенном строковом виде. Поля ссылок, которые отображаются в формах с кнопкой выбора с тремя точками «…», выгружаются как значения GUID. Скажем, в счете указан признак «Контрагент» со значением «0cc56776-0daa-11e3-bf95-f46d04eec7f5». В справочнике контрагентов пbr/>
Приведу код C# класса установки соединения с базой 1С и выгрузки данных, а также пример применения данного класса.

using System;
using System.Text;
using System.Xml;

namespace ConsoleApplication
{
    class Export1C
    {
        dynamic Connection;

        public void Connect(string path, string user = "", string password = "")
        {
            dynamic connector = Activator.CreateInstance(Type.GetTypeFromProgID("V82.COMConnector"));
            string connectionString = "File=""   path   """;
            if (user != "")
                connectionString  = ";Usr=""   user   """;
            if (password != "")
                connectionString  = ";Pwd=""   password   """;
            Connection = connector.Connect(connectionString);
        }

        public void Export(string path)
        {
            XmlTextWriter xml = new XmlTextWriter(path, Encoding.UTF8);
            xml.Formatting = Formatting.Indented;
            xml.WriteStartDocument();
            xml.WriteStartElement("database");

            // Catalogs
            foreach (dynamic catalog in Connection.Metadata.Catalogs)
            {
                xml.WriteStartElement("catalog");
                xml.WriteAttributeString("name", catalog.Name);
                dynamic query = Connection.NewObject("Query");
                query.Text = "select * from catalog."   catalog.Name;
                dynamic items = query.Execute().Unload();
                for (int i = 0; i < items.Count(); i  )
                {
                    xml.WriteStartElement("item");
                    for (int j = 0; j < items.Columns.Count(); j  )
                    {
                        xml.WriteStartElement("attribute");
                        xml.WriteAttributeString("name", items.Columns.Get(j).Name);
                        xml.WriteAttributeString("value", Connection.XMLString(items.Get(i).Get(j)));
                        xml.WriteEndElement();
                    }
                    xml.WriteEndElement();
                }
                xml.WriteEndElement();
            }

            // Documents
            foreach (dynamic document in Connection.Metadata.Documents)
            {
                dynamic query = Connection.NewObject("Query");
                query.Text = "select * from document."   document.Name;
                dynamic table = query.Execute().Unload();
                for (int i = 0; i < table.Count(); i  )
                {
                    xml.WriteStartElement("document");
                    xml.WriteAttributeString("name", document.Name);
                    dynamic docref = null;
                    for (int j = 0; j < table.Columns.Count(); j  )
                    {
                        xml.WriteStartElement("attribute");
                        string field = table.Columns.Get(j).Name;
                        xml.WriteAttributeString("name", field);
                        dynamic tabular = document.TabularSections.Find(field);
                        if (tabular == null)
                        {
                            xml.WriteAttributeString("value", Connection.XMLString(table.Get(i).Get(j)));
                            if (field == "Ссылка")
                                docref = table.Get(i).Get(j);
                        }
                        else
                        {
                            dynamic subquery = Connection.NewObject("Query");
                            subquery.Text = "select * from document."   document.Name   "."   field  
                                            " as lines where lines.Ref=&Ref";
                            subquery.SetParameter("Ref", docref);
                            dynamic lines = subquery.Execute().Unload();
                            for (int line = 0; line < lines.Count(); line  )
                            {
                                xml.WriteStartElement("line");
                                for (int col = 0; col < lines.Columns.Count(); col  )
                                {
                                    xml.WriteStartElement("attribute");
                                    xml.WriteAttributeString("name", lines.Columns.Get(col).Name);
                                    string value = Connection.XMLString(lines.Get(line).Get(col));
                                    xml.WriteAttributeString("value", value);
                                    xml.WriteEndElement();
                                }
                                xml.WriteEndElement();
                            }
                        }
                        xml.WriteEndElement();
                    }
                    xml.WriteEndElement();
                }
            }
            xml.WriteEndElement();
            xml.WriteEndDocument();
            xml.Close();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Export1C export = new Export1C();
            export.Connect("D:\TestBase", "User", "pass");
            export.Export("D:\Export.xml");
        }
    }
}

Экспорт разбит на два блока: выгрузка справочников и выгрузка документов. Для приобретения видов справочников и видов документов выполняется обращение к метаданным.
Данные всякой таблицы извлекаются отдельными запросами. По документам также выгружаются табличные части. Для этого формируются подзапросы к табличным частям с отбором по ссылке на выгружаемый документ.
Для определенных задач, допустимо, придется вносить метаморфозы в код. Формируемые имена тегов xml-файла (catalog, document, attribute, name, value) выбраны произвольно. Если внести небольшие правки в код, конструкцию получаемого xml-файла дозволено изменить. Также дозволено ограничить выгружаемые данные только определенными таблицами и признаками, применяя данные в цикл

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB