![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi + 1Cv77 [D7, 1Cv77]
Dmitry_177 © (2007-08-02 11:18:00)Подскажите как можно считать все значения реквизитов из справочника?
делаю я так:
procedure TForm1.Button1Click(Sender: TObject); // Соединение с 1C
begin
Ole1C := CreateOleObject('V77.Application');
Ole1C.Initialize(Ole1C.RMTrade, '/DC:\1C_BUX\1SBDB', '');
end;
procedure TForm1.Button2Click(Sender: TObject); // Перечисляем все справочники в ListBox-е
var
CountSprav: Integer;
iSprav: Integer;
OleSprav: OleVariant;
Str: string;
begin
ListBox1.Items.Clear;
if VarIsEmpty(Ole1C) then
Exit;
CountSprav := Ole1C.Метаданные.Справочник * 1;
Application.ProcessMessages;
if CountSprav = 0 then
Exit;
for iSprav := 1 to CountSprav do
begin
OleSprav := Ole1C.Метаданные.Справочник(iSprav * 1);
if VarIsEmpty(OleSprav) then
Exit;
Str := Trim(OleSprav.Идентификатор) + ' (' + Trim(OleSprav.Синоним) + ')';
ListBox1.Items.Add(Str);
Application.ProcessMessages;
end;
end;
procedure TForm1.ListBox1Click(Sender: TObject); // При выборе справочника из списка во второй справочник вывожу все реквизиты и их значения
var
OleSprav: OleVariant;
OleSpravObj: OleVariant;
OleRecv: OleVariant;
CountCol: Integer;
iCol: Integer;
Str: string;
begin
ListBox2.Items.Clear;
OleSpravObj := Ole1C.CreateObject('Справочник.' + Trim(Ole1C.Метаданные.Справочник((ListBox1.ItemIndex + 1) * 1).Идентификатор));
if VarIsEmpty(OleSpravObj) then
Exit;
OleSprav := Ole1C.Метаданные.Справочник((ListBox1.ItemIndex + 1) * 1);
if VarIsEmpty(OleSprav) then
Exit;
CountCol := OleSprav.Реквизит * 1;
Application.ProcessMessages;
if CountCol = 0 then
Exit;
if OleSpravObj.ВыбратьЭлементы > 0 then
while OleSpravObj.ПолучитьЭлемент > 0 do
begin
Str := 'Наименование: ' + Trim(OleSpravObj.Наименование);
ListBox2.Items.Add(Str);
Application.ProcessMessages;
for iCol := 1 to CountCol do
begin
OleRecv := OleSprav.Реквизит(iCol * 1);
Str := Trim(OleRecv.Идентификатор) + ' (' + Trim(OleRecv.Синоним) + '): ';
Application.ProcessMessages;
if AnsiUpperCase(Trim(OleRecv.Тип)) = 'ЧИСЛО' then
Str := Str + FloatToStr(OleSpravObj.ПолучитьАтрибут(OleRecv.Идентификатор)); // вот здесь ошибка почему-то при считывании из 1С
if AnsiUpperCase(Trim(OleRecv.Тип)) = 'СТРОКА' then
Str := Str + Trim(OleSpravObj.ПолучитьАтрибут(OleRecv.Идентификатор));
if AnsiUpperCase(Trim(OleRecv.Тип)) = 'ДАТА' then
Str := Str + Trim(OleSpravObj.ПолучитьАтрибут(OleRecv.Идентификатор));
ListBox2.Items.Add(Str);
Application.ProcessMessages;
end;
ListBox2.Items.Add('');
end;
end;
Dmitry_177 (2007-08-03 10:16:00) [1]я уже разобрался :)
затык происходит на периодических реквизитах, надо так:
....
if CountCol = 0 then
Exit;
OleSpravObj.ИспользоватьДату(Date,1);
if OleSpravObj.ВыбратьЭлементы > 0 then
...
Сергей М. (2007-08-03 09:58:00) [2]
> вот здесь ошибка
Какая ?
Dmitry_177 (2007-08-03 09:21:00) [3]а кто-нибудь работал с 1С в качестве OLE-сервера?
dolmat (2007-08-02 12:17:00) [4]Я напрямую в базы лезу если надо
Dmitry_177 (2007-08-02 11:32:00) [5]пробовал так:
Str := Str + IntToStr(OleSpravObj.ПолучитьАтрибут(OleRecv.Идентификатор));
и так:
Str := Str + Trim(OleSpravObj.ПолучитьАтрибут(OleRecv.Идентификатор));
всеравно..
Dmitry_177 (2007-08-02 11:21:00) [6]пардон:
procedure TForm1.ListBox1Click(Sender: TObject); // При выборе справочника из списка во второй списоквывожу все реквизиты и их значения