Имя: Пароль:
1C
1С v8
Двусторонний обмен между 1С и Веб сервисом на PHP
,
0 ChunLee
 
19.07.16
05:41
Доброго времени суток и низкий поклон всем магистрам данного форума. У себя на работе столкнулся с проблемой интеграции 1С и веб сервисом на PHP. Как я понял она заключается в сложности структуры обмена (массив в массиве). К сожалению 1С такую структуру wsdl файла не хочет понимать... Была предпринята попытка считать эту структуру в c#. Но и эта идея закончилась ни чем. Да я понимаю что на всех форумах с такой проблемой в основном заставляют разработчиков изменить веб сервис. К сожалению наши разработчики стоят на своем и не хотят изменять свой веб сервис. По этому я пришел на этот форум чтобы задать великим из умов данный вопрос. "Как решить вопрос с таким обменом?" В голове летает вариант сделать чтобы java считала структуру с веб сервиса и была так сказать почтальоном между 1С и веб сервисом.
1 Azxcvbn
 
19.07.16
05:57
Ни разу не встречал такого, что бы 1с не схавала wsdl-ссылку. Наверное редко с таким встречался, можете дать wsdl-ссылку?
2 Garykom
 
гуру
19.07.16
06:07
1. 1Сник может все
2. Если 1С что то не может, исполните пункт 1 (поменяйте 1Сника)
3 Garykom
 
гуру
19.07.16
06:10
(2)+ любой веб сервис это обычный обмен по протоколу http "текстовыми данными" (xml, json)
всегда можно "вручную" обрабатывать эти файлы/данные читать/парсить их или формировать
4 2mugik
 
19.07.16
07:16
(3)Ты так пишешь как будто тебе это доставляет удовольствие.
5 Beretta
 
19.07.16
07:21
(4) Ему за это деньги платят. А ты в 1С по убеждениям пришел?
6 2mugik
 
19.07.16
07:24
(5)По интересам пришел. И парсить xml вручную  интереса никакого.
7 Beretta
 
19.07.16
07:27
(6) Понятно, бард-одиночка. Так и видится резолюция в жире - "will not fix, интереса никакого".
8 Mankubus
 
19.07.16
07:31
(0) тоже интересна ссылка на wsdl
9 Serginio1
 
19.07.16
07:53
Можно и на PHP делать с нормальными массивами
http://www.sanity-free.com/125/php_webservices_and_csharp_dotnet_soap_clients.html
10 Beretta
 
19.07.16
07:59
(0) Без примера wsdl разговор ни о чем. Очень сильно подозреваю, что кто-то просто не осилил работу с сложным xdto.
11 ChunLee
 
19.07.16
09:01
Ссылка на WSDL файл
https://cloud.mail.ru/public/DQj8/jacAS64fX
12 ChunLee
 
19.07.16
09:05
Один из 6-ти файлов. Мне бы просто отправить запрос с параметрами на веб сервис чтобы получить ответ от веб сервиса, дальше я уже думаю сам разберусь
13 Mankubus
 
19.07.16
09:17
(11) ссылка без проблем загрузилась в 1с. в чем проблема то?
14 Beretta
 
19.07.16
09:26
(11) версия платформы какая?
15 ChunLee
 
19.07.16
09:29
Чтобы понять проблему нужно либо прочитать структуру в wsdl и в 1С и сравнить их либо попробовать обратиться к серверу. Второй вариант вам не доступен так как сервер локальный, закрытый от внешки. Придется читать. Версия 1С:Предприятие 8.3 (8.3.7.2008)
Для справки, мы с Serginio1 пробовали воспользоваться C# для чтения структуры, чтобы запихать dll в 1С. Все закончилось тем же, не все переменные были считанны. Самый прикол 1С читает ту часть массивов которые не может прочитать c#, а c# считывает те массивы которые не может прочитать 1С.
16 ChunLee
 
19.07.16
09:31
(9) Видишь проблема в том что они не хотят менять свой веб сервис, так как там уже весят фирмы уже довольно долго.
17 Beretta
 
19.07.16
09:34
(15) А теперь еще раз и по-русски. Что вы там с чем сравниваете?
18 Serginio1
 
19.07.16
09:45
Там проблема вот в этих массивах

<xsd:complexType name="ArrayOfCorrespondent">
        <xsd:complexContent mixed="false">
          <xsd:restriction base="soap-enc:Array">
            <xsd:attribute wsdl:arrayType="tns:Correspondent[]" ref="soap-enc:arrayType" />
          </xsd:restriction>
        </xsd:complexContent>
      </xsd:complexType>


1С их вообще не определяет. А на .Net формируется такой класс

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/soap/encoding/";)]
    public partial class Array {
        
        private System.Xml.XmlElement[] anyField;
        
        private string arrayTypeField;
        
        private string offsetField;
        
        private bool offsetFieldSpecified;
        
        private string idField;
        
        private string hrefField;
        
        private System.Xml.XmlAttribute[] anyAttrField;
19 Garykom
 
гуру
19.07.16
10:49
(15) > Самый прикол 1С читает ту часть массивов которые не может прочитать c#, а c# считывает те массивы которые не может прочитать 1С.

На подобные случаи есть верная лошадка по имени Java...
20 Garykom
 
гуру
19.07.16
10:51
21 Serginio1
 
19.07.16
10:54
(20) Да им просто нужно привести к нормальному виду, что бы все могли читать
http://www.sanity-free.com/125/php_webservices_and_csharp_dotnet_soap_clients.html
22 ChunLee
 
19.07.16
12:31
Народ хотел спросить, а 1С может из своей оболочки на прямую запустить скрипт php без веб сервера?
23 Garykom
 
гуру
19.07.16
12:40
(22) качаешь http://php.net/downloads.php, ставишь и запускаешь пэхэпэ скрипты
но что оно сделает если нету веб сервера куда хотит ответ писать?

а так то php это просто язык обработки текстовых файликов/данных
24 ChunLee
 
19.07.16
14:04
Так установил. Теперь мне получается нужно запустить скрипт php.
25 ChunLee
 
19.07.16
14:05
нашел такую опесуху
Exec(<Путь>)  апускает на выполнение программу или скрипт. Возвращает объект типа WshScriptExec. Пример:

WshShell = Новый COMОбъект("WScript.Shell");
Процесс = WshShell.Exec("C:\Progra~1\Window~1\Access~1\wordpad.exe");
Рез = WshShell.AppActivate(Процесс.ProcessID);
26 Garykom
 
гуру
19.07.16
14:05
27 ChunLee
 
19.07.16
14:05
можно ли сделать так путь_до_пхп\php.exe test.php params
28 Garykom
 
гуру
19.07.16
14:07
(27) там же написано

echo OFF
"C:\php\php.exe" script.php %*
29 ChunLee
 
19.07.16
14:07
Или как-то так чтобы вызвать скрипт и передать параметр
30 Кирпич
 
19.07.16
14:45
чисто поржать. У меня есть Delphi 7 и она сожрала этот файл влет. Нарисовала вроде всё правильно. Там четыре типа массива?
31 ChunLee
 
19.07.16
14:58
Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

echo OFF
"C:\php\php.exe" script.php %*

Предполагая, что скрипт называется script.php и полный путь к CLI php.exe совпадает с C:\php\php.exe, приведенный пакетный файл запустит скрипт с переданными параметрами: script.bat echothis либо script.bat -h.

Подскажите 1. script.php должен лежать в корне папки php или я должен где то указать адрес?
2. Как я из 1с должен передать параметр? В WScript.Shell в описании нет указания куда нужно закидывать параметр, только адрес php.exe
32 ChunLee
 
19.07.16
14:59
получается в этой строке я должен все указать Процесс = WshShell.Exec("C:\Progra~1\Window~1\Access~1\wordpad.exe");
или нет?
33 Garykom
 
гуру
19.07.16
15:05
(31) 1. Полный путь укажи до "script.php"
2. Батник через %* передает все параметры которые в батник пришли

Батник совершенно не обязателен как и "WshShell.Exec" когда есть встроенные средства 1С.

А лучше наваять свой php прокси, поднять его на своем типа сервере с апачем и к нему из 1С штатно стучаться по http.
34 Garykom
 
гуру
19.07.16
15:06
(32) Поймите что для решения данной задачи не через одно место кто то пока имеет маловато опыта.
35 Garykom
 
гуру
19.07.16
15:07
(34)+ Это не к тому что не нуна решать, а блин подучите чуток чего нибудь сначала, азы же это эникейства.
36 ChunLee
 
19.07.16
15:11
Я пытаюсь разобраться, просто в темной комнате на ощупь разобраться довольно сложно, сами понимаете, по этому я прошу подсветить мне немного у кого есть свой факел.
37 Garykom
 
гуру
19.07.16
15:17
(36) Понимаете у вас есть уже свой факел и даже спички с инструкцией.

Но кто то не умеет пока спичками и факелами пользоваться - такая аналогия напрашивается.
Мы конечно можем подсветить = сделать все за вас но нафуя это нам? Или вам если цель научиться а не получить з/п.
38 ChunLee
 
21.07.16
06:08
(37) Для справки. Я сижу на окладе. Выполню я это задание или нет, на мне ни как не отобразится. Жалко много потраченного времени. Честно это задание уже дело принципа. Если вы человек который всегда доводит свои дела до конца, тогда вы понимаете о чем я говорю. До этого я уже делал обмен с сайтом. Там было все просто. Через XDTO структура строилась аж бегом. Примеров куча в интернете. Все сделал сам без чей либо помощи. А такая ситуация для меня нарисовалась впервые. Ни где нет нормального описания. На формумах переписка идет между людьми явно разбирающимися в веб программировании и мне часть слов вообще не понятна. Я уже несколько вариантов отработал, как видите не помогло. Сейчас хотим передать параметры через json и php скрипт. Разрабы веб сервиса только кидают идеи, а разбираться во всем приходится мне. Довольно сложно, когда вообще не знаешь синтаксиса другого языка. Я прошу помочь мне просто отправить пакет с параметрами на веб сервис и получить хоть какой-нибудь ответ. Вот и все! Там работы еще будет выше крыши. А отладка этого всего еще займет процентов 80 времени от создания самого обмена. Если вы на этом форуме чтобы только критиковать и унижать достоинства тех людей которые и не говорят что они мегамозги и велике умы, которые просто пришли попросить помощи, тогда прошу Вас проходить мимо данной темы. Спасибо
39 Serginio1
 
21.07.16
08:18
Пусть сделают HTTP сервис, дадут примеры. А ты кинешь их сюда.
Здесь специалисты по PHP переведут тебе на HTTPСоедиение HTTPЗапрос
40 Serginio1
 
21.07.16
08:19
там у них всего 2 метода с кучей параметров
41 ChunLee
 
21.07.16
09:07
Да ни хотят они ничего делать. В этом и проблема. Говорят от нас доступ к веб сервису. Остальное делайте сами. Они да же не могут дать готовую строку запроса, чтобы я пользовался ей как шаблоном. Сейчас я установил расширение php на свой веб сервер. Сделал обращение через 1с к нему. Ответ приходит  "Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'ad' : failed to load external entity" и дальше бла бла бла. Не понятно, я что-то перемудрил с параметрами или с index.php.
42 ChunLee
 
21.07.16
09:12
<?
$aValues = json_decode($argv[1], true);
$oSoapClient = new SoapClient('ad', array('login' => '', 'password' =>''));
$mResult = $oSoapClient->__soapCall('putIngoing', array($aValues));
echo json_encode($mResult);

вот такой код в index.php
43 ChunLee
 
21.07.16
09:13
Это разрабы дали сказали обращайся к нему из 1С передавай параметры, все будет работать
44 Serginio1
 
21.07.16
09:46
45 ChunLee
 
21.07.16
11:14
Ссылка классная, опять же потребует телодвижение от разрабов веб сервиса. Они не согласятся.
46 Serginio1
 
21.07.16
11:17
(45) Обратись к Fragster
он поможет тебе сделать прокси Вэб сервер
47 Serginio1
 
21.07.16
11:18
Что то тут любителей PHP не наблюдается.
48 ChunLee
 
25.07.16
13:54
Все решил вопрос. Сделал обращение на скрипт php c 1C. В 1С сделал формирование параметров и запихал в json. Общая картина такова. Из 1С отправляется json в php скрипт на локальный веб сервер. А php скрипт обращается в веб сервис и передает параметры. Веб сервис разбирает json. Для разрабов все обошлось малой кровью. Как закончу полностью обмен, соберусь мыслями и постараюсь объяснить по подробнее с исходным кодом. Serginio1 огромное спасибо за помощь и понимание.
49 Garykom
 
гуру
25.07.16
14:02
Ну в очередной раз убедился что есть гениальные программисты ради программирования, а есть кто просто проблемы решает.

Вот кто то хочет попасть в 1С но не берут, а кто то отказывается из нежелания пока менять место проживания.
50 Serginio1
 
25.07.16
15:01
(48) На здоровье! Главное получил решение.
51 Fragster
 
гуру
25.07.16
15:14
(0) http://fragster.ru/wsfor1c/ смотрел?
52 ttk
 
25.07.16
15:30
(1) у меня вот такой не хавается, пришлось сторонними методами
53 Fragster
 
гуру
25.07.16
15:35
почитал тему. (51) не поможет. я думал, у автора проблема сделать сервис на php, чтобы с ним взаимодействовать, а тут уже есть какой-то сервис...
в принципе, проблемы с "массивом в массиве" быть не должно, тот же (51) с подобным справляется. я бы на месте автора взял бы wsdl, посмтрел бы на него незамутненным взглядом, подергал из SoapUI и подредактировал таким образом, чтобы его схавала 1с. Если же во взаимодействии используются всякие soapheaders то тут сложнее, придется через httpзапрос общаться, но это тоже не сильно сложно, на самом деле
54 Fragster
 
гуру
25.07.16
15:35
ну и заставить "на той стороне" поменять определение до нужного состояния тоже можно
55 ChunLee
 
02.08.16
06:37
Тут нарисовалась еще одна проблема, теперь с обращением веб сервиса к 1С. В 1С я сделал не замысловатый код

Функция putCorrespondents(types)
CorrespondentsResponseТип = ФабрикаXDTO.Тип("TSD_WsPutReferenceModel", "putCorrespondentsResponse";);

CorrespondentsResponseP = ФабрикаXDTO.Создать(CorrespondentsResponseТип);
CorrespondentsResponseP.putCorrespondentsResult.Добавить("Ошибка создания корреспондента";);

возврат CorrespondentsResponseP;

КонецФункции

ответ из 1с выглядит вот так
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
<soap:Body>
<m:putCorrespondentsResponse xmlns:m="http://10.68.32.41/">;
<m:return xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
<putCorrespondentsResult xmlns="TSD_WsPutReferenceModel">Ошибка создания корреспондента</putCorrespondentsResult>
</m:return>
</m:putCorrespondentsResponse>
</soap:Body>
</soap:Envelope>

они хотят чтобы приходил ответ вот такой
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:ns1="http://10.68.32.41/ws_kazatomprom/tsoed/putreference"><SOAP-ENV:Body><ns1:putCorrespondentsResponse><putCorrespondentsResult>OK</putCorrespondentsResult></ns1:putCorrespondentsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>;

в частности задают вопрос. Что за return? Как всегда говорят что ничего не будут у себя менять и проблема в вашей 1С.
56 ChunLee
 
02.08.16
06:38
Не пойму, может я что-то настроил не так, что 1С выдает такой ответ.Может кто сталкивался с такой ситуацией? Можно ли как то ручками подкорректировать ответ 1С?
57 ChunLee
 
02.08.16
06:47
(54) Fragster ты пользовался данной библиотекой http://fragster.ru/wsfor1c/ Я уже думаю лучше создать веб сервис на php со своей стороны. Получится 1С > мой веб сервис на PHP > Конечный веб сервис. Если она реально рабочая я с помощью этой библиотеки смогу общаться со своим веб сервисом, а уж php c php смогут найти общий язык я думаю. Как считаешь такая идея имеет право на жизнь. Или все таки есть какой-то более простой вариант? Просто видишь разрабы менять в своем веб сервисе ничего не собираются потому что через него уже в течении года обмениваются другие организации, а ломать из-за нас одних они не собираются.
58 ChunLee
 
02.08.16
07:04
Ха вот прикол, это ты эту библиотеку запилил)))))) Сорян. Так, что проканает такая задумка как считаешь?
59 Fragster
 
гуру
03.08.16
17:31
(58) такой подход работает. единственное - http://fragster.ru/wsfor1c/ не работает с двоичными данными и не предназначен для передачи большого количества данных (ну, или настраивать php.ini надо на время скрипта и потребляемую память)
60 Fragster
 
гуру
03.08.16
17:37
в простейшем виде (где простыми операциями со строками можно добиться эффекта) эффективнее может быть подход, подобный http://catalog.mista.ru/public/348215/
61 denis_jj
 
03.08.16
19:27
(0) сталкивались с проблемами обмена 1С с разными WEB сервисами в разные стороны.
Обычно 1С читает все wsdl если они валидные. Проверить валидность можно SOAP-валидатором, например SOAPUI. Отдает 1С нормальные wsdl. Если принимающий не читает, то что-то в нем не так.
62 ChunLee
 
05.08.16
12:32
(61) У меня получилось подстроить 1С так чтобы строка return перестала выходить. теперь ответ такой
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
   <soap:Body>
      <m:putCorrespondentsResponse xmlns:m="directory3">
         <m:putCorrespondentsResult xsi:type="m:putCorrespondentsResponse" xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
            <m:putCorrespondentsResult xsi:type="xs:string">Ошибка создания корреспондента</m:putCorrespondentsResult>
         </m:putCorrespondentsResult>
      </m:putCorrespondentsResponse>
   </soap:Body>
</soap:Envelope>

теперь мне говорят что в ответе в начале нет <?xml version="1.0" encoding="UTF-8"?> Неужели это так принципиально?
63 denis_jj
 
05.08.16
13:09
(62) на SOAP есть стандарт. SOAPUI как раз проверяет соответствие со стандартом. Так что ориентируйтесь на него.
Отсутствие какого-либо блока, обязательного по стандарту, принципиально.
64 ChunLee
 
08.08.16
02:46
Тогда вопрос. Как затолкать в ответ 1С этот блок?
65 Serginio1
 
08.08.16
11:48
(64) А ты фиддлером смотришь?
Закон Брукера: Даже маленькая практика стоит большой теории.