7.7 Получение данных с помощью .NET

Тема в разделе "Обмен данными в "1С:Предприятие 7.7"", создана пользователем swordholder, 4 май 2011.

  1. TopicStarter Overlay
    swordholder
    Offline

    swordholder

    Регистрация:
    30 мар 2011
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Как можно данные с 1С можно вытаскивать используя OLE (C# .NET)
    А если быть точно то мне нужно вытащить список Счет Фактур (Журналы -> Счета-фактуры выданные).

    База: МСФО
    Версия 1С: 7.7
    расширение файлов БД .dbf
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
  3. TopicStarter Overlay
    swordholder
    Offline

    swordholder

    Регистрация:
    30 мар 2011
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Есть у меня в 1С пункт "Счета-фактуры" в меню "Журналы"
    Как прочитать все данные из "счетов фактур" на C# .NET используя OLE. Местоположение данных:"Журналы"->"Счета-фактуры выданные".

    Версия 1C: 7.7
    База: МСФО
    Тип базы: dBase

    Код:
    Type t = null;
    Object obj = null;    // Ссылка на COM сервер 1С 
    Object objVal = null; // Ссылка на документ в базе 
    Object objDoc = null; // Ссылка на объект документ 
    Boolean OK = false;
    string userCatPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    object v77 = null;
    object retVal = null;
    
    
    try
    {                              
    t = Type.GetTypeFromProgID(txtApplication.Text);
    obj = System.Activator.CreateInstance(t);
    
    Object[] arg = new Object[3];
    arg[0] = obj.GetType().InvokeMember(@"RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod, null,obj, null);
    arg[1] = @"/d" + txtDbPath.Text + @" /n /p";
    
    OK = (Boolean)obj.GetType().InvokeMember(@"Initialize", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, obj, arg);
    
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/if')">if (!OK)</span>
    {
    MessageBox.Show("Не удалось соедениться с программой 1C ","Ошибка !!!", MessageBoxButtons.OK,MessageBoxIcon.Error);
    return;
    }
    
    arg = new Object[1];
    arg[0] = @"Журналы.Счета-фактуры выданные";
    
    //вот здесь выдает ошибку, unknown element не распознает "Журналы.Счета-фактуры выданные"
    object book = obj.GetType().InvokeMember(@"CreateObject",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, arg);
    
    if (book == null)
    Console.WriteLine(@"Ошибка создания счетов фактур");
    else
    {
    book.GetType().InvokeMember(@"ПорядокКодов",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, book, null);
    
    Double result = (Double)book.GetType().InvokeMember(@"ВыбратьЭлементы",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, book, null);
    
    if (result == 1) OK = true; else OK = false;
    
    if (OK)
    {
    result = 0;
    Int32 counter = 0;
    
    do
    {
    result = (Double)book.GetType().InvokeMember(@"ПолучитьЭлемент",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, book, null);
    
    if (result == 1)
    {
    object element = book.GetType().InvokeMember(@"ТекущийЭлемент",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, book, null);
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/if')">if (element != null)</span>
    {
    counter++;
    String name = (String)element.GetType().InvokeMember(@"Номер",
    BindingFlags.Public | BindingFlags.GetProperty, null, element, null);
    
    MessageBox.Show(counter.ToString() + @": " + name );
    
    }
    }
    }
    while (result == 1);
    }
    }               
    
    }
    catch (Exception ee)
    {
    MessageBox.Show(ee.Message);
    }
    finally
    {
    
    Marshal.Release(Marshal.GetIDispatchForObject(obj));
    Marshal.ReleaseComObject(obj);
    obj = null;
    }
    
    
    
    Когда этим же самым путем вытаскиваю список Валют ("Справочники"->"Валюты") без проблем вытаскиваются. А вот счета фактур не распознается.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Какая ошибка?

    Ну думаю что "СчетаФактурыВыданные", только я уже честно говоря забыл как в 77 работать с журналом документов. Может проще выбрать документы типа счет-фактура?
    Код:
    Док = СоздатьОбъект("Документ.СчетФактура"); //<--Уточнить как документ в базе называется, под рукой ТиС нет.
    Док.ВыбратьДокументы(Дата1, Дата2);
    Пока Док.ПолучитьДокумент()=1 Цикл
    ...
    КонецЦикла;
    
    
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Рабочий пример:
    Код:
            static void Main(string[] args)
    {
    
    string userCatPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    
    
    Type oType = Type.GetTypeFromProgID("V77.Application");
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/if')">if (oType != null)</span>
    {
    object V77 = Activator.CreateInstance(oType);
    bool connectionOK;
    try
    {
    object[] arg = new object[3];
    arg[0] = oType.InvokeMember("RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod, null, V77, new object[] { });
    arg[1] = @"/d" + ... + @" /n... /p..."; //<- подставить то что надо
    arg[2] = "NO_SPLASH_SHOW";
    
    connectionOK = (bool)oType.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod, null, V77, arg);
    }
    catch (Exception e)
    {
    Marshal.ReleaseComObject(V77);
    Console.WriteLine(e.Message);
    Console.WriteLine(e.InnerException.ToString());
    return;
    }
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/if')">if (!connectionOK)</span>
    {
    Marshal.ReleaseComObject(V77);
    Console.WriteLine("Не удалось подключиться к базе");
    return;
    }
    
    object book;
    try
    {
    book = oType.InvokeMember("CreateObject", BindingFlags.Public | BindingFlags.InvokeMethod, null, V77, new object[] { "Документ.СчетФактураВыданный" });
    }
    catch (Exception e)
    {
    Marshal.ReleaseComObject(V77);
    Console.WriteLine(e.Message);
    return;
    }
    
    try
    {
    oType.InvokeMember("ВыбратьДокументы", BindingFlags.Public | BindingFlags.InvokeMethod, null, book, new object[] { });
    
    StringBuilder sb = new StringBuilder();
    int counter = 0;
    while ((double)oType.InvokeMember("ПолучитьДокумент", BindingFlags.Public | BindingFlags.InvokeMethod, null, book, new object[] { }) == 1.0)
    {
    counter++;
    
    object element = oType.InvokeMember("ТекущийДокумент", BindingFlags.Public | BindingFlags.InvokeMethod, null, book, new object[] { });
    object name = oType.InvokeMember("НомерДок", BindingFlags.Public | BindingFlags.GetProperty, null, element, new object[] { });
    object date = oType.InvokeMember("ДатаДок", BindingFlags.Public | BindingFlags.GetProperty, null, element, new object[] { });
    
    sb.Length = 0;
    sb.Append(counter);
    sb.Append(": счет-фактура №");
    sb.Append(name);
    sb.Append(" от ");
    sb.Append(date);
    Console.WriteLine(sb.ToString());
    }
    
    }
    catch (Exception e)
    {
    Console.WriteLine(e.Message);
    }
    finally
    {
    Marshal.ReleaseComObject(book);
    Marshal.ReleaseComObject(V77);
    }
    }
    
    Console.WriteLine("\nPress any key...");
    Console.ReadKey();
    
    }
    
    
  6. TopicStarter Overlay
    swordholder
    Offline

    swordholder

    Регистрация:
    30 мар 2011
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Спасибо за ваш ответ.
    Компилятор выдает исключение: {"Неудачная попытка создания объекта (Документ.СчетФактураВыданный): 0 "}

    Как быть ? Есть какие нибудь идеи на счет такого рода ошибок ?
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Значит такого вида документа в конфе нет.
    Озвучте название конфы к которой подключаетесь. МСФО это что - бюджетка?
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пример был для подключения к ТиС. Бухгалтерский угодник правильно сказал, уточните в конфигураторе название объекта счет-фактура.
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Если это бухгалтерия (ОСНО или бюджетка) попробуйте
    Документ.СчетФактура

Поделиться этой страницей