Вверх ↑
Этот топик читают: Гость
Ответов: 542
Рейтинг: 12
#16: 2009-02-02 11:35:43 ЛС | профиль | цитата
Alexbootch писал(а):
можно воспользоваться, например, компонентами OLEdb и выгрузить что нужно из 1С

Очень интересно, а у меня попытка использования OLEdb для этой цели ни чем хорошим не закончилась
------------ Дoбавленo:

Справочник писал(а):
Структура таблиц 1С хранится в файле 1СV7.DDS
Находишь таблицу справочника SCXXX, а дальше в зависимости от ситуации...

1C это ж не просто база данных в обычном пониманиия, что бы обращатся кней как к базе нужно разбиратся со структурой базы отдаживать привильные SQL запросы с учетом структуры. Да и самы данные разнесены па разным файлам. лично у меня база 1С занимает 2Гига. в 144-х dbf файлах.
Поэтому лучще пользоватся OLE интерфейсом который предлагает сам 1С. Там и методы соотвествующие есть.

Вчера из Delphi у меня получилось все или почти все. Вот проблема корректно перенсти все в HiAsm
Например было бы удобно иметь компнент которому я перадаю имя справочника а он мне дает доступ к данным этого справочника и т.д.
или же вызиваю встроенный отчет по имены а он возвращает результат вычислении. Так что дотсуп просто как базе бесполезен.
Вот попытка подключения через OLEdb

#sha
Add(OLEdb,11788416,399,133)
{
Point(onError)
link(onConnect,11978735:doMessage,[(457,139)(457,111)])
link(Driver,13030624:Text,[])
link(onError,2469999:doMessage,[(443,146)(443,160)])
}
Add(Edit,13030624,399,77)
{
Left=20
Top=10
Width=735
Text="Provider=SQLOLEDB.1;User ID=Админ;Password=123;Initial Catalog=D:\Archiv\DB_Konf_090108_0810\;Data Source=t;Application Name=1C"
}
Add(Button,4202735,294,133)
{
Left=290
Top=115
link(onClick,11788416:doOpen,[])
}
Add(Message,11978735,483,105)
{
Caption="Ok"
}
Add(Message,2469999,483,154)
{
Caption="Error"
}

Почему то что в Delphi так просто написать, так трудно перенести в HiAsm

#pas
procedure TForm1.Button1Click(Sender: TObject);
Var
ResOpen : integer;
begin
Ole1C := Unassigned;
Ole1C := CreateOleObject(Edit1.Text);
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Items.Clear;
OleFizLica := Unassigned;
if not VarIsEmpty(Ole1C) then begin
OleFizLica:=Ole1C.CreateObject('Справочник.Номенклатура');
if not VarIsEmpty(OleFizLica) then begin
if OleFizLica.ВыбратьЭлементы>0 then begin
while OleFizLica.ПолучитьЭлемент>0 do
begin
ListBox1.Items.Add(OleFizLica.Код+' '+OleFizLica.Наименование);
end;
end;
end;
end;
OleFizLica := Unassigned;
end;
------------ Дoбавленo:

После того как удалось создать компонент подключения к 1С, Сылка на объект подключения хранится в типе
[i] private
Ole1C : OleVariant;[/i]
в области private первого компонента а каким образом еге передать в следующий компонент что бы через него обращатся к данным 1С
В другом компоненте нужно выполнять команду такого типа OleFizLica:=Ole1C.CreateObject('Справочник.Номенклатура');
карма: 0

0
Ответов: 8887
Рейтинг: 823
#17: 2009-02-02 12:49:58 ЛС | профиль | цитата
afandi, наверное, вывести его Handle на нижнюю точку, а в другом компоненте это значение считывать ?
карма: 19

0
Ответов: 542
Рейтинг: 12
#18: 2009-02-02 12:52:12 ЛС | профиль | цитата
Но у точек компонетов нет такого типа как OleVariant
карма: 0

0
Ответов: 1161
Рейтинг: 160
#19: 2009-02-02 12:57:56 ЛС | профиль | цитата
afandi, обычно Handle типа Integer
карма: 0

0
Ответов: 542
Рейтинг: 12
#20: 2009-02-02 12:59:00 ЛС | профиль | цитата
Но вывести надо не integer а OleVariant
карма: 0

0
Ответов: 8887
Рейтинг: 823
#21: 2009-02-02 13:10:16 ЛС | профиль | цитата
afandi, в моём смутном представлении Handle ничто иное, как физический адрес первой ячейки блока памяти где расположен объект, и, естественно, имеет формат integer ?
карма: 19

0
Ответов: 542
Рейтинг: 12
#22: 2009-02-02 13:26:55 ЛС | профиль | цитата
Леонид писал(а):
объект, и, естественно, имеет формат integer ?

а зачем мне integer если речь идет об OleVariant или он тоже на самом деле индентичен integer;?


карма: 0

0
Ответов: 1161
Рейтинг: 160
#23: 2009-02-02 13:30:03 ЛС | профиль | цитата
скажи мне, как я смог узнать имя программы только по его Handle?
code_11674.txt
карма: 0

1
файлы: 1code_11674.txt [319B] [398]
Голосовали:afandi
Разработчик
Ответов: 26061
Рейтинг: 2120
#24: 2009-02-02 13:48:02 ЛС | профиль | цитата
afandi писал(а):
Но у точек компонетов нет такого типа как OleVariant

И не будет

Используй преобразование VarToStr, больше ты не во что у нас не преобразуешь
карма: 22

1
Голосовали:afandi
Ответов: 542
Рейтинг: 12
#25: 2009-02-02 13:59:44 ЛС | профиль | цитата
nesco писал(а):
больше ты не во что у нас не преобразуешь

А обратно преобразовать можно потом как ни будь
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#26: 2009-02-02 14:10:52 ЛС | профиль | цитата
afandi писал(а):
А обратно преобразовать можно потом как ни будь

Прямым назначением
карма: 22

1
Голосовали:afandi
Ответов: 542
Рейтинг: 12
#27: 2009-02-02 16:08:33 ЛС | профиль | цитата
Nic, есть вопрос по твоим компонентам Automation и Invoke, возможно мне будет легче переделать их чем разрабытывать новые компоненты для 1С OLE.
Например используя Automation удается запустить 1С, но для полноценного запуска нужно еще передать параметры а как исправить Automation что передать параметры запуска. Ну вот скажем MS Access имеет режим запуска для периндексирования базы. как бы ты это сделал с помощью твоих компонентов?

карма: 0

0
Ответов: 3655
Рейтинг: 69
#28: 2009-02-02 16:11:18 ЛС | профиль | цитата
afandi писал(а):
Automation

Вроде у меня небыло такого компонента.
Посмотри автора в ИНИ файле.
карма: 0

0
Ответов: 542
Рейтинг: 12
#29: 2009-02-02 17:01:40 ЛС | профиль | цитата
Извини Вячеслав,
Version=1.0
Author=Nic

Это же ты писал?
[i]KOL не может напрямую работать с OLE.
Вообщем для работы с OLE объектом надо в коде прописать,
инициализацию OLE объекта.
Как это сделать можешь посмотреть в кодах компонентов для работы с
Вордом.[/i](набор моих компонентов)
------------ Дoбавленo:

nesco писал(а):
Используй преобразование VarToStr, больше ты не во что у нас не преобразуешь

Это в исходном компоненте:

#pas
private
Ole1C : OleVariant;
r:string;

procedure THIRun_1C_OLE._var_ParamConnect;
begin
r:= VarToStr(Ole1C);
dtString(_data, r);
end;

такое конвертирования проходит без ошибки RunTime

Это во втором InlineCode:

#pas
type
THiAsmClass = class(TDebug)
private

public
Ole1C : OleVariant;
OleFizLica : OleVariant;
ID :THI_Event;
procedure doProcess(var _Data:TData; Index:Word);
end;

procedure THiAsmClass.doProcess(var _Data:TData; Index:Word);
Var
s : string;
t : Variant;
begin
s:= ReadString(_data,ID,');
end;
А воб обратное преобразование с помощью присваивания не проходит, сообщается ошибка RunTime
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#30: 2009-02-02 17:13:46 ЛС | профиль | цитата
afandi, я в упор не вижу, где ты t чего-то присваиваешь
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)