Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обмен информацией по SOAP с 1С / 6 сообщений из 6, страница 1 из 1
30.01.2021, 02:06
    #40040035
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
Доброго времени!
Пишу до сих пор на Delphi 7.
Написал обмен с 1С . Все стандартно.
Автоматически в Delphi сгенерировал модуль обращения к внешнему серверу.
Немного подправил его, что бы русские пароли и пользователи воспринимались. В итоге:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
unit DataExchange1C;
//обмен данными с 1С
interface
uses InvokeRegistry, Rio, SOAPHTTPClient;
type  //не называть интерфейс очень длинно, идут ошибки при регистрации интерфейса
IDataExchange1cBuh = interface(IInvokable)
  ['{98B22E8D-6CE7-4E29-BB56-35107A1DA11B}']
    function LoadDataFrom1cBuh(const OperationID: integer; const PartNo: integer; const PartCount: integer;
      const InputData: string; out ResultData: string): string; stdcall;
  end;
  function GetServiceWebDataExchange1cBuh(const sUserName: string; const sPassword: string;
    const sHttpAddr: string; hRIO: THTTPRIO = nil): IDataExchange1cBuh;
implementation

function GetServiceWebDataExchange1cBuh(const sUserName: string; const sPassword: string;
  const sHttpAddr: string; hRIO: THTTPRIO): IDataExchange1cBuh;
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if hRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := hRIO;
  try
    Result := (RIO as IDataExchange1cBuh);
    RIO.HTTPWebNode.UserName := UTF8Encode(WideString(sUserName));
    RIO.HTTPWebNode.Password := UTF8Encode(WideString(sPassword));
    RIO.URL := sHttpAddr;
  finally
    if (Result = nil) and (hRIO = nil) then
    begin
      RIO.Free;
    end;
  end;
end;

initialization
  //все эти данные прописаны в конфигурации Web-сервиса 1С и являются константами
  InvRegistry.RegisterInterface(TypeInfo(IDataExchange1cBuh), 'urn:web:dataexchange1cbuh', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IDataExchange1cBuh), 'urn:web:dataexchange1cbuh#WebDataExchange1cBuh:LoadDataFrom1cBuh');
  InvRegistry.RegisterInvokeOptions(TypeInfo(IDataExchange1cBuh), ioDocument);
end.



В итоге, все заработало. Счастье. Обмен идет. Запускаю под Windows 10. Под любыми пользователями, хоть с правами админа, хоть без них. Работает.

Вот теперь нужно установить это на сервер, для ежедневного обновления этих данных.
Сервер windows 2016.
Радостно копирую прогу на сервер, запускаю и получаю Access violation at address 025880FD. Write of address 025880FD.

Ошибка происходит при вызове LoadDataFrom1cBuh, RIO и интерфейс - нормально создаются и не пустые.

Куда смотреть? Какие различия есть между серверной платформой и клиентской?
Я уже брандмауэр сервера выключал. Думал тут засада. но не помогло. Менял типы данных со String на WideString. Но все напрасно.

Подскажите куда копать?
Спасибо.
...
Рейтинг: 0 / 0
30.01.2021, 10:19
    #40040059
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
я бы не рекомендовал использовать SOAP, сейчас вроде есть возможность работы через http дергая функции 1с и используя json.
Ну и если по теме то рекомендую поставить какой-нибудь сниффер http протокола и посмотреть разницу в запросах из того места где работает и там где не работает.
...
Рейтинг: 0 / 0
30.01.2021, 14:14
    #40040099
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
Dmvrt
шибка происходит при вызове LoadDataFrom1cBuh,
Показали бы, как вы этот метод вызываете
Dmvrt
Access violation at address 025880FD. Write of address 025880FD.
Адреса совпадают. Если не ошибаюсь, то такое происходит при работе с коллбэками
...
Рейтинг: 0 / 0
30.01.2021, 14:17
    #40040100
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
Dmvrt
Код: pascal
1.
if (Result = nil) and (hRIO = nil) then

И здесь явная утечка. Должно быть
Код: pascal
1.
if hRIO = nil then
...
Рейтинг: 0 / 0
01.02.2021, 11:40
    #40040414
Dmvrt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
Здравствуйте!

энди
Ну и если по теме то рекомендую поставить какой-нибудь сниффер http протокола и посмотреть разницу в запросах из того места где работает и там где не работает.

Поставил Fiddler. При запуске на сервере 2016 до передачи по http вообще не доходит (Fiddler ничего не отображает).
Т.е. ошибка происходит раньше.
При запуске на win10, обмен соответственно отображается.

_Vasilisk_
Показали бы, как вы этот метод вызываете

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  aRIO1c: THTTPRIO;
  aIn: IDataExchange1cBuh;
  sStatus: string;
  sTmpData: sting;
begin
  aRIO1c := nil;
  aIn := GetServiceWebDataExchange1cBuh('LoadWeb', '1111', 'http://server/buh1C/ws/WebDataExchange1cBuh', aRIO1c);
  if Assigned(aIn) then
    sStatus := aIn.LoadDataFrom1cBuh(1, 1, 1, '', sTmpData); //тут ошибка
  ...



У меня так и не появилось мыслей об источнике ошибки.
Может как-то связано с регистрацией InvRegistry.RegisterInterface(TypeInfo(IDataExchange1cBuh), 'urn:web:dataexchange1cbuh', 'UTF-8'); на сервере?
Хотя если бы регистрация не прошла, то возникла бы ошибка, что интерфейс не поддерживается.

Может у кто с подобным сталкивался?
...
Рейтинг: 0 / 0
01.02.2021, 14:58
    #40040513
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обмен информацией по SOAP с 1С
ну что тут можно посоветовать, подробно логировать на сервере и затем внимательно рассматривать лог.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обмен информацией по SOAP с 1С / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]