Имя: Пароль:
1C
1С v8
ComConnector в Delphi
0 Andrey_sy4
 
02.07.18
19:52
Всем привет. Сразу скажу, что до сего момента в 1С не работал.
Задача следующая: Задать имя функции на форме в делфи и выполнить её в 1С базе. Для этого использую V83.COMConnector (Application).

  pDisp := CreateOleObject('V83.Application');
  sMethodName := 'Connect';
  OleCheck (pDisp.GetIDsOfNames (GUID_NULL, @sMethodName, 1,
LOCALE_SYSTEM_DEFAULT, @iDispId));
  vSet := 'File=C:\Users\Admin\Documents\InfoBase';
  FillChar (dpPutArgs, sizeof (dpPutArgs), 0);
  dpPutArgs.rgvarg := @vSet;
  dpPutArgs.cArgs := 1;
  dpPutArgs.cNamedArgs := 0;
  dpPutArgs.rgdispidNamedArgs := nil;
  OleCheck (pDisp.Invoke (iDispId, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, dpPutArgs, @VarResult, @ei, @iError));

  sMethodName := 'Тест1';
  OleCheck (pDisp.GetIDsOfNames (GUID_NULL, @sMethodName, 1,
GetThreadLocale, @iDispId));

  vParams[1] := 2;
  vParams[2] := 5;

  FillChar (dpPutArgs, sizeof (dpPutArgs), 0);
  dpPutArgs.rgvarg := @vParams;
  dpPutArgs.cArgs := num_params;
  dpPutArgs.cNamedArgs := 0;
  dpPutArgs.rgdispidNamedArgs := nil;
  OleCheck (pDisp.Invoke (iDispId, GUID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, dpPutArgs, @VarResult, @ei, @iError));

Этот код прекрасно работает, но как только я меняю строку V83.Application на V83.COMConnector, то вызывается ошибка (Неизвестное имя). Т.е. "Тест1" - не распознаётся и функция Getidsofnames не может получить её номер. Может быть с кодировками что-то не так?
Использую delphi xe 3 и 1C предприятие 8.3
1 H A D G E H O G s
 
02.07.18
19:59
Жесть какая.
2 Лефмихалыч
 
02.07.18
20:00
> до сего момента в 1С не работал

да может лучше и не надо?
3 H A D G E H O G s
 
02.07.18
20:01
Вам IDispatch для чего дали? Что мозг себе не страдать.
4 H A D G E H O G s
 
02.07.18
20:08
var
connect,Connection:OleVariant;
version:string;
begin

Connection:=CreateOleObject('V83.ComConnector');
connect:=Connection.Connect('File="E:\Projects\IEGAIS"; usr="Ежов Дмитрий"; pwd="128500"');
version:=connect.ОбщийМодульМой.ПолучитьВерсию();
ShowMessage(version);
5 H A D G E H O G s
 
02.07.18
20:08
У ОбщийМодульМой не забыть поставить галочку "ВнешнееСоединение", у функции Экспорт.
6 Andrey_sy4
 
02.07.18
20:14
Connection:=CreateOleObject('V83.ComConnector');
connect:=Connection.Connect('File="E:\Projects\IEGAIS"; usr="Ежов Дмитрий"; pwd="128500"');
version:=connect.ОбщийМодульМой.ПолучитьВерсию();
ShowMessage(version);

Это всё понятно и само собой разумеется. Но это решение не подходит, т.к. тут чётко в коде будет задаваться исполняемая функция. Мне же необходимо её вводить с клавиатуры. Поэтому и вожусь с поздним связыванием через Idispatch и Invoke
7 H A D G E H O G s
 
02.07.18
20:15
(6) Ну сделай Экспортную функцию в 1С да и вводи туда имя функции. Но вообще, идея бредовая, вводить функции в форме.
8 H A D G E H O G s
 
02.07.18
20:16
Процедура ЗапуститьВыполнение(Выражение) Экспорт
    Выполнить(Выражение);
КонецПроцедуры



version:=connect.ЗапуститьВыполнение("ПолучитьВерсию()");
9 Andrey_sy4
 
02.07.18
20:22
Думаю надо более чётко объяснить зачем я этим занимаюсь.
У меня задача стоит следующая: Написать внешнее ПО для запуска функций/процедур в базе 1С по регламенту.
Именно внешнее ПО. (И да, я знаю, что в 1с есть регламентные задачи, но из-за некоторых особенностей на предприятии - они не подходят). И в написанной программе пользователь должен будет выбирать нужную функцию для исполнения.
10 Andrey_sy4
 
02.07.18
20:23
Подход через connect.ОбщийМодуль.Функция - не подходит.
11 Dmitry1c
 
02.07.18
20:48
(9) в 1С есть веб-сервисы, через которые ты можешь вызывать необходимый тебе код
12 Сияющий в темноте
 
02.07.18
22:56
Что тут может быть сложного,подключились к базе,для этого создали коннектор,сформировали строку и вызвали подключить,у меня это даже нп Си прекрасно пишется.потом
получили строку для вычисления выражения и загнали ее в функцию.вот когдп нужно будет параметры передавать,придетсч думать,т.к.нн все в строку собирается.