Имя: Пароль:
1C
1С v8
Подключиться к 1С из Delphi
0 SHKoder
 
26.05.22
15:58
Помогите пожалуйста решить квест

Стоит задача, подключиться к 1С 8.3 из Delphi и отправить запрос:
ПолучитьСтруктуруХраненияБазыДанных()

Получить ответ в приложении Delphi в грид

Далее этот грид нужно будет разложить, но это я сделаю сам.

Основная проблема это подключиться к 1С, отправить запрос и получить ответ на запрос.

Использую Delphi 11, 1С 8.3

Я не программист на 1С, и в этом основная загвостка.

Спасибо за помощь

Подключение к 1С получилось, а вот дальше чего куда и как?


var
connect,Connection, Query, Rslt, Choose :OleVariant;
version:string;
SQL : string;
sel_res,res: variant;

Base1S, Sprav1S, Data1S :OleVariant;
begin
Connection:=CreateOleObject('V83.ComConnector.1');
connect := Connection.Connect('Srvr="server"; Ref="base"; Usr="user"; pwd="123"; ');
if not VarIsEmpty(connect) then begin
Mmo1.Lines.Add(trim(connect.СтрокаСоединенияИнформационнойБазы()));
...
1 Garykom
 
гуру
26.05.22
17:07
Это может хватит некрофилией заниматься?

Речь и про Олю и про Дельфи
2 Garykom
 
гуру
26.05.22
17:08
Публикуем базу 1С через иис или апач, юзаем встроенную OData или ваяем по быстрому свой http-сервис
Дергаем его откуда надо
3 Kassern
 
26.05.22
17:09
(2) Это что-то из области фантастики с учетом - "Я не программист на 1С, и в этом основная загвостка"
4 Kassern
 
26.05.22
17:10
хотя самый правильный вариант поднять сервис со стороны 1с и уже с ним любаться)
5 Garykom
 
гуру
26.05.22
17:13
(3) мануалов в инете дофига как опубликовать и простейший http сервис сделать на 1С
остается только туда засунуть вызов ПолучитьСтруктуруХраненияБазыДанных
6 Garykom
 
гуру
26.05.22
17:16
(0) Не используй больше V83.ComConnector - оно устарело
На реальных базах сейчас линукс или облако/фреш
Да и под виндой обычно глючит и не пашет и хрен админов заставишь чтобы заработало

Особенно обидно когда студент приходит лабу сдавать а оно не пашет...
7 Выпрь
 
26.05.22
17:26
(6) приходишь лабу сдавать, а веб сервис не поднят да и вообще вебсервера нет
8 Garykom
 
гуру
26.05.22
17:26
(7) тут все проще ибо веб-сервис легко проверяется
а почему com|ole глючит хрен поймешь
9 H A D G E H O G s
 
26.05.22
18:41
procedure TForm1.Button1Click(Sender: TObject);
var
  connect, Connection: OleVariant;
  DBStorageStructureInfo: OleVariant;
  DBStorageStructureInfoCount: Integer;
  DBStorageStructureInfoIndex: Integer;
  RowDBStorageStructureInfo: OleVariant;
  ИндексСтроки: Integer;
  РазмерТаблицы: Integer;

  StorageTableName: String;
  TableName: String;
  Metadata: String;
  Purpose: String;
  Fields: OleVariant;
  Indexes: OleVariant;
begin
  Connection := CreateOleObject('V83.ComConnector.1');
  connect := Connection.connect('Srvr="localhost"; Ref="Empty2"; Usr=""; pwd="";');
  if VarIsEmpty(connect) then
    raise Exception.Create('Не удалось подключиться к базе 1С');
  DBStorageStructureInfo := connect.ПолучитьСтруктуруХраненияБазыДанных();
  РазмерТаблицы := DBStorageStructureInfo.Количество();
  Mmo1.Lines.BeginUpdate();
  try
    Mmo1.Lines.Add('StorageTableName:TableName:Metadata:Purpose');
    for DBStorageStructureInfoIndex := 0 to РазмерТаблицы - 1 do
    begin
      RowDBStorageStructureInfo := DBStorageStructureInfo.Получить(DBStorageStructureInfoIndex);
      StorageTableName := RowDBStorageStructureInfo.ИмяТаблицыХранения;
      TableName := RowDBStorageStructureInfo.ИмяТаблицы;
      Metadata := RowDBStorageStructureInfo.Метаданные;
      Purpose := RowDBStorageStructureInfo.Назначение;
      Mmo1.Lines.Add(StorageTableName + ':' + TableName + ':' + Metadata + ':' + Purpose + ':');
      Fields := RowDBStorageStructureInfo.Поля;
      Indexes := RowDBStorageStructureInfo.Индексы;
    end;
  finally
    Mmo1.Lines.EndUpdate();
  end;

end;

Fields и Indexes обработаете сами, пример есть
10 H A D G E H O G s
 
26.05.22
18:47
(8) "а почему com|ole глючит хрен поймешь"

keyword "хрен поймешь"
11 ДедМорроз
 
26.05.22
20:01
Можно самому зашрузить Comcntr.dll и из нее вызвать функцию GetClassObject напрямую и не мучиться с тем,почему не работает,но нужно точно знать,как работает Com,чтобы не накосячить.
Особенно это касается Allocator.
12 Garykom
 
гуру
26.05.22
20:05
(11) под линукс?
13 yopQua
 
26.05.22
20:13
(12) про линукс речи не было же
(0) а на хуа?
14 yopQua
 
26.05.22
20:16
так то операция не каждодневная наверно, СОМом он уже подключился, зачем сейчас огород строить с сервисами
коннекшн.ПолучитьСтруктуруХраненияБазыДанных() вызывать, но вернет оно тоже ком, его перебирать и вытаскивать строки в грид, наверно получится
15 ДедМорроз
 
26.05.22
20:22
(12) Чистую dll с Com-объектом в Linux можно и загрузить и даже заставить работать,если правильно системные вызовы перехватить,а вот когда одна dll потом грузит другую - это намного сложнее.
Опять же,все вызовы kernel и user нужно правильно оттранслировать,а это сложно только один раз,потом для любой dll.
16 Жан Пердежон
 
26.05.22
21:57
(0) у тебя тупо типы разные в - Mmo1.Lines.Add() строка нужна, а функция тебе ком-объект возвращает