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

  • Автор темы swordholder99
  • Дата начала
S

swordholder99

Гость
#1
Есть у меня в 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;
}
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#2
А какие реквизиты из Счета-фактуры нужно достать?

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

puh14

Well-Known Member
11.07.2008
1 412
0
#4
arg[0] = @"Журналы.Счета-фактуры выданные"; - Неправильно, надо Документ.СчетаФактурыВыданные

Далее

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

swordholder99

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

swordholder99

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

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

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#8
в 1Ске создается объект следующим образом:
Код:
СФ = СоздатьОбъект("Документ.СчетФактураВыданный");
СФ.ВыбратьДокументы(Дата("2010","01","01"),Дата("2011","01","01"));
Пока СФ.ПолучитьДокумент() = 1 Цикл
//в этом цикле перебираем все реквизиты например:
НомерСФ = Число(СФ.НомерДок);//это числовой формат
Контрагент = СокрЛП(СФ.Контрагент.ПолноеНаименование()); //это строковый формат
КонецЦикла;
 

Zab

Well-Known Member
07.08.2006
583
0
#10
Цитата:

(unknown181538 @ 4:05:2011 - 14:28) *



Навреное должно быть вроде "Документ.СчетаФактурыВыданные"




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

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#11
Правильнее всего посмотреть в конфигураторе 1С, как называется документ, который вам нужен (имя присваивает разработчик). Там будет дерево объектов, ищи в ветке документы. Просто, базы МСФО под руками нет.
Имена реквизитов надо тоже смотреть в конфигураторе. Для документов есть реквизиты шапки и табличной части.
Тоже очень верный совет!
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#13
я не Сишник, но вот еще примерчик для анализа и проб. попробуй адаптировать под С#
Код:
ОЛЕ = 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 Цикл
//в этом цикле перебираем все реквизиты например:
НомерСФ = Число(СФ.НомерДок);//это числовой формат
Контрагент = СокрЛП(СФ.Контрагент.ПолноеНаименование()); //это строковый формат
КонецЦикла;
 

Zab

Well-Known Member
07.08.2006
583
0
#14
Цитата:

(KiR @ 5:05:2011 - 05:38) *


СФ.ВыбратьДокументы(Дата("2010","01","01"),Дата("2011","01","01"));

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