Как правильно читать "Счета Фактур"

Тема в разделе "1C и всё что с ней связано", создана пользователем swordholder99, 4 май 2011.

  1. swordholder99

    swordholder99 Гость

    Есть у меня в 1С пункт "Счета-фактуры" в меню "Журналы"
    Как прочитать все данные из "счетов фактур" на C# .net используя OLE. Местоположение данных:"Журналы"->"Счета-фактуры выданные"

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

    Код (C++):
    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);


    if (!OK)
    {
    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);

    if (element != null)
    {
    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;
    }
     
  2. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    А какие реквизиты из Счета-фактуры нужно достать?

    в 1Ске создается объект СчетФактураВыданный, делается отборка за период и потом циклом можно получить значение всех интересующих реквизитов. Можно, конечно, значение реквизитов и запросом получить. Главное не забыть преобразовывать типы полученных данных.
     
  3. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Навреное должно быть вроде "Документ.СчетаФактурыВыданные"
     
  4. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    arg[0] = @"Журналы.Счета-фактуры выданные"; - Неправильно, надо Документ.СчетаФактурыВыданные

    Далее

    "ПорядокКодов" - это для справочников, для документов не надо
    @"ВыбратьЭлементы" - тоже для справочников - для документов Выбратьдокументы- кстати тут надо задать период выборки
    @"ПолучитьЭлемент" - тож для справочников, надо ПолучитьДокумент
    @"ТекущийЭлемент" - надо текущийдокумент
    @"Номер" если это номер документа, тогда надо НомерДок, если в счф есть реквизит с таким именем - тогда правильно.
     
  5. swordholder99

    swordholder99 Гость

    А как по датам можно запросить скажем с 01,01,2010 по 01,01,2011.
    И как преобразовать с __ComObject в String или int
    Кусочки подобного кода можете скинуть ?
    Спасибо заранее.
     
  6. swordholder99

    swordholder99 Гость

    Серия СФ,Номер СФ,Номер по журналу,Основная СФ - да/нет, Дополнительная СФ-да/нет, Экспортная СФ-да/нет, дата выписки, ИНН продавца, ЕИН продавца, Наименование, Адрес, Плательщик НДС- да/нет, Серия сертификата, дата выдачи сертификата, Номер сертификата, Директор, Бухгалтер, Наименование товара или услуги,ед.измерения, кол-во, освобожденный оборот, сумма облагаемой операции, Сумма акциза, ставка НДС, сумма ндс, общая сумма, ОБЩАЯ СУММА НДС ПО СФ, ОБЩАЯ СУММА ПО СФ

    Люди добрые - помогите кто чем может.
     
  7. swordholder99

    swordholder99 Гость

    Выдается исключение с сообщением "Неудачная попытка создания объекта (Документ.СчетаФактурыВыданные"
     
  8. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    в 1Ске создается объект следующим образом:
    Код ( (Unknown Language)):
    СФ = СоздатьОбъект("Документ.СчетФактураВыданный");
    СФ.ВыбратьДокументы(Дата("2010","01","01"),Дата("2011","01","01"));
    Пока СФ.ПолучитьДокумент() = 1 Цикл
    //в этом цикле перебираем все реквизиты например:
    НомерСФ = Число(СФ.НомерДок);//это числовой формат
    Контрагент = СокрЛП(СФ.Контрагент.ПолноеНаименование()); //это строковый формат
    КонецЦикла;
     
  9. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    "СчетФактураВыданный" надо. Это мы напутали.
     
  10. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Правильнее всего посмотреть в конфигураторе 1С, как называется документ, который вам нужен (имя присваивает разработчик). Там будет дерево объектов, ищи в ветке документы. Просто, базы МСФО под руками нет.
    Имена реквизитов надо тоже смотреть в конфигураторе. Для документов есть реквизиты шапки и табличной части.
     
  11. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    Тоже очень верный совет!
     
  12. swordholder99

    swordholder99 Гость

    А как нужно написать эту строку на каком нибудь языке используя OLE (например на C#'e) ?
     
  13. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    я не Сишник, но вот еще примерчик для анализа и проб. попробуй адаптировать под С#
    Код ( (Unknown Language)):
    ОЛЕ = CreateObject("V77.Application");
    Пользователь = "test";
    Пароль = "pass";
    Каталог = "C:\DB";
    СтрИницализации = " /d" + Каталог + " /n" + Пользователь + " /p" + Пароль;
    Если ОЛЕ.Initialize(ОЛЕ.RMTrade, СтрИницализации, "NO_SPLASH_SHOW") = 0 Тогда
    Предупреждение("Ошибка инициализации OLE МД! ");
    ОЛЕ = "";
    Возврат;
    КонецЕсли;

    СФ = ОЛЕ.CreateObject("Документ.СчетФактураВыданный");
    СФ.ВыбратьДокументы(Дата("2010","01","01"),Дата("2011","01","01"));
    Пока СФ.ПолучитьДокумент() = 1 Цикл
    //в этом цикле перебираем все реквизиты например:
    НомерСФ = Число(СФ.НомерДок);//это числовой формат
    Контрагент = СокрЛП(СФ.Контрагент.ПолноеНаименование()); //это строковый формат
    КонецЦикла;
     
  14. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    в 1С есть такая штука "Синтакс-помошник" типа МСДНа, описание методов, объектов и пр.
    Вот если зайти в 1С в конфигураторе в "Сервис-Параметры-Синтакс помошник" и поставить галку "Использовать оба языка", то потом можно будет по нажатию Ctrl-F1 поискать имена 1С-ный русскоязычных методов в английской нотации.
    Например:
    Код (Text):
    ВыбратьДокументы(<?>,)
    SelectDocuments(<?>,)
    Синтаксис:
    ВыбратьДокументы(<Дата1>,<Дата2>)
    Назначение:
    Открыть выборку документов в интервале дат.
    Возвращает:
    1 - если действие выполнено и в выборке есть хотя бы один документ;
    0 - если действие не выполнено или в выборке нет ни одного документа.
    Параметры:
    <Дата1> - дата, документ или позиция начала выборки документов. Если данный параметр опущен, то выборка начинается с самого первого существующего в системе документа.
    <Дата2> - дата, документ или позиция конца выборки документов. Если данный параметр опущен, то выборка заканчивается самым последним существующим в системе документом.
    Замечание:
    Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.
    и
    Код (Text):
    Дата(<?>,,)
    Date(<?>,,)
    Синтаксис:
    Дата(<Год>,<Месяц>,<Число>)
    Назначение:
    Преобразует переданные в качестве числовых параметров Год, Месяц, Число
    в значение типа 'Дата'. Год указывается 4-х значным числом (вместе с веком).
    Возвращает значение типа 'Дата'.
    Параметры:
    <Год> - числовое выражение.
    <Месяц> - числовое выражение.
    <Число> - числовое выражение.
    Следовательно:
    СФ.ВыбратьДокументы(Дата("2010","01","01"),Дата("2011","01","01"));
    Будет на шарпе выглядеть как-то так:
    SF.SelectDocuments(Date("2010","01","01"),Date("2011","01","01"));
    Конечно, SF надо предварительно инициализировать через CreateDocument()...
     
Загрузка...

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