powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обмен информацией по SOAP с 1С
6 сообщений из 6, страница 1 из 1
Обмен информацией по SOAP с 1С
    #40040035
Dmvrt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени!
Пишу до сих пор на 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
Обмен информацией по SOAP с 1С
    #40040059
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы не рекомендовал использовать SOAP, сейчас вроде есть возможность работы через http дергая функции 1с и используя json.
Ну и если по теме то рекомендую поставить какой-нибудь сниффер http протокола и посмотреть разницу в запросах из того места где работает и там где не работает.
...
Рейтинг: 0 / 0
Обмен информацией по SOAP с 1С
    #40040099
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
шибка происходит при вызове LoadDataFrom1cBuh,
Показали бы, как вы этот метод вызываете
Dmvrt
Access violation at address 025880FD. Write of address 025880FD.
Адреса совпадают. Если не ошибаюсь, то такое происходит при работе с коллбэками
...
Рейтинг: 0 / 0
Обмен информацией по SOAP с 1С
    #40040100
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmvrt
Код: pascal
1.
if (Result = nil) and (hRIO = nil) then

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

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


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