Web-сервисы из 1С в PHP или грабли, на которые я наступил.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. marsohod

    Везде 🙂

    Вот уже подошел 8.2.10.73 — и по-прежнему в Firefox блокируется буфер обмена. Соответственно, фирменная фишка «Переход по ссылке» не работает…

    Reply ↓
  2. Трактор

    1С довольно жёстко требует указания типов. Сколько при мне не пинали 1С они очень хорошо отсылают к стандарту где написано «так можно, а так нельзя». Вполне возможно что это ПХП вольно обращается со стандартами.

    Reply ↓
  3. awk

    Читал я стандарт. Там достаточно лояльные правила… Хотя PHP один из последних получил поддержку SOAP и не в лучшем виде. А во вторых, что мне не нравится в Microsoft и 1С — это то, как они стандарты понимают.. Почему-то они это делают ОЧЕНЬ по своему. И если Microsoft я могу понять(у них только один человек в компании имеет право читать чужие исходные тексты), то 1С???

    Reply ↓
  4. Elisy

    (3) А остался у вас где-нибудь «нерабочий 1С» веб-сервис на сервере? А то я хочу посмотреть лучше с ним справится .Net (http://infostart.ru/public/61457/) или нет…

    Reply ↓
  5. awk

    (4) В каком смысле лучше? Быстрее или надежней? Какие критерии?

    Reply ↓
  6. purtcer

    Связка 1с-.net-1c работает просто замечательно. никаких проблем не возникало и скорость приличная. на своем опыте опробовал… 😉

    Reply ↓
  7. igor-bts

    Возможно php не включает в сообщения поля которые могут быть не заполнены, а 1с их ожидает, вот и ошибка.

    С Netи даже с 1с, в качестве сервиса, может быть та же петрушка.

    Reply ↓
  8. Elisy

    (5) Сможет вызвать без ошибок, о которых в статье говорится, или нет

    Reply ↓
  9. awk

    (8) http://it.selenia.ru/services.php?wsdl Сейчас функция возвращает строковое значение. Проверял на нормальных клиентах. Входные параметры: 1. строка 2. шаблон в стиле перл(ради него в php и полез). Хотите поиграйтесь. Подключить без ошибки получилось. Вызвать нормально нет. Причем, сервис отрабатывает нормально. Для .Net надо IIS поднимать, VS скачивать. Лень если честно, но видно придется.

    Reply ↓
  10. Трактор

    (9) не всё у тебя хорошо. Вот ответ твоего сервиса приличному SOAP клиенту. Ненравится твоему сервису нормальный клиент.

    Warning:  preg_match() [function.preg-match]: Empty regular expression in /usr/local/www/it/services.php on line 31
    
    Warning:  implode() [function.implode]: Invalid arguments passed in /usr/local/www/it/services.php on line 33
    
    Warning:  Cannot modify header information — headers already sent by (output started at /usr/local/www/it/services.php:31) in /usr/local/www/it/lib/nusoap.php on line 4174
    
    Warning:  Cannot modify header information — headers already sent by (output started at /usr/local/www/it/services.php:31) in /usr/local/www/it/lib/nusoap.php on line 4174
    
    Warning:  Cannot modify header information — headers already sent by (output started at /usr/local/www/it/services.php:31) in /usr/local/www/it/lib/nusoap.php on line 4174
    
    Warning:  Cannot modify header information — headers already sent by (output started at /usr/local/www/it/services.php:31) in /usr/local/www/it/lib/nusoap.php on line 4174
    <?xml version=»1.0″ encoding=»ISO-8859-1″?><SOAP-ENV:Envelope xmlns:SOAP-ENV=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:SOAP-ENC=»http://schemas.xmlsoap.org/soap/encoding/»><SOAP-ENV:Body><ns1:pregMatchResponse xmlns:ns1=»http://it.selenia.ru»><return xsi:nil=»true» xsi:type=»xsd:string»/></ns1:pregMatchResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

    Показать

    Reply ↓
  11. awk

    (10) До обработки «не правильных» параметров, я даже не добрался… Попробуй:

    Первый параметр aaa, второй /aaa/i.

    Reply ↓
  12. Трактор

    (11) э-э-э-э. Ошибку даёт при открытии браузером http://it.selenia.ru/services.php

    Parse error: syntax error, unexpected T_ELSE in /usr/local/www/it/services.php on line 34

    Reply ↓
  13. Трактор

    (11) Не помогает.

    Reply ↓
  14. awk

    (10) Все… Теперь нет ошибки при неправильном шаблоне… Спасибо, за найденную ошибку..

    Reply ↓
  15. awk

    (13) (12) Я просто исправлял код… Щас поставлю VS web IIS опробую на них..

    Reply ↓
  16. awk

    Для тех кто верит в .Net:

    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.ComponentModel
    
    ‘ Чтобы разрешить вызывать веб-службу из сценария с помощью ASP.NET AJAX, раскомментируйте следующую строку.
    ‘ <System.Web.Script.Services.ScriptService()> _
    <System.Web.Services.WebService(Namespace:=»http://it.selenia.ru/»)> _
    <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <ToolboxItem(False)> _
    Public Class services
    Inherits System.Web.Services.WebService
    
    <WebMethod()> _
    Public Function pregMatch(ByVal str As String, ByVal tmpl As String) As ArrayList
    Dim c As ArrayList
    c = New ArrayList
    c.Add(str)
    c.Add(tmpl)
    Return c
    End Function
    
    End Class

    Показать

    Вылетело… (6)(7)(13)

    Reply ↓
  17. Трактор

    SoapUI работает с сервисом. 1С не хочет. Подробно не колупал. Работа свалилась.

    Reply ↓
  18. purtcer

    ну может еще таблицу значений из 1с попытаться в net передать… 😀

    определяешь в 1с структуру данных, в net ее читаешь из 1с, заполняешь и обратно в 1с передаешь, вот тебе и будет твой массив.

    Reply ↓
  19. awk

    (18)

    1. Я прекрасно понимаю, что для реализации веб сервиса требуется гораздо меньше усилий, чем для реализации клиента. Не надо только ловить меня на этом. Для пользователя(конечного программиста) вроде меня все просто. А для того кто пишет уровнем ниже (1С или Microsoft) все сложнее. Генерация описания — гораздо проще реализовать, чем его адекватное чтение. Я просто не понимаю как можно объявлять о полной (сервера и клиента) поддержке веб сервисов, если она только реализована для серверной части. Ну не можете летать, так не декларируйте этого. Или опишите ограничения. Летаем в пятницу, в качестве эксперимента, если будет дождь. По моему так.

    2. А почему нет? Что должно помешать? И зачем передавать массив если он изначально пустой и нужен мне как результат работы? XML предполагает множественные значения.

    Reply ↓
  20. purtcer

    (19)

    Да, мои разработки не летают, от них этого не требуеся. Я же не в NASA и даже не ЦУПе работаю… 😀

    2. Почему я пишу Ответ = Истина и в то же время в той же 1с Запрос = Новый Запрос. Ну зачем его объявлять? Она жесама 1с, неужто такая тупая не поймет что мне запрос и нужен? Зачем в С# объявлять размерность массива, вдруг он изменится.

    Любая система предполагает определенные правила работы с ней. Не желание работать по этим правилам не говорит о тупости и кривости системы.

    И web-сервисы 1с поддерживает как свои так и внешние(начиная с версии 8.1).

    Reply ↓
  21. awk
    Reply ↓
  22. Elisy

    (9) Импортировать WSDL в 1С получилось, вызвать, почему-то нет. Пишет «Сервис не найден {http://it.selenia.ru/services.php}:AWK».

    Команды:

    Прокси = WSСсылки.Перл.СоздатьWSПрокси(«http://it.selenia.ru/services.php», «AWK», «AWK»);

    Результат = Прокси.pregMatch(«aaa», «/aaa/i»);

    Предполагаю, что 1С не нравится составной тип возвращаемого значения ArrayOfString и если его переделать в простой string[] (языком C#), то все получится.

    В .Net можно организовать перевод в string[] из List<string> через вызов .ToArray().

    Reply ↓
  23. Трактор

    (22)

    мпортировать WSDL в 1С получилось, вызвать, почему-то нет.

    Так ты неправильно пишешь. Лучше так:

    Прокси = WSСсылки.Перл.СоздатьWSПрокси(«http://it.selenia.ru/services.php», «AWK», «AWKPort»);
    Результат = Прокси.pregMatch(«aaa», «/aaa/i»);

    Так будет другая ошибка 🙂

    Посмотри в отладчике на WSСсылки.Перл.

    Reply ↓
  24. awk

    (23) Знаю. У меня 1С пытается вызвать что-то по адресу 0000:0000 и удачно вылетает.

    СоздатьWSПрокси ?? Там пространство имен: «http://it.selenia.ru», а там где руками wsdl писал вообще имя порта «pregwsdlPort», пространство имен: «urn:pregwsdl».

    Reply ↓
  25. Трактор

    (22) (24) В прикреплении обработка, которой я смотрю на сервис awk. Она прекрасно его вызывает и ругается только на возвращаемое значение.

    По всей видимости 1С ждём массив и получив строку возмущается этим.

    {Форма.Форма(5)}: Ошибка при вызове метода контекста (pregMatch): Ошибка вызова операции сервиса: {http://it.selenia.ru}:AWK:pregMatch()

    зн = Прокси.pregMatch(«123456», «654321»);

    по причине:

    Ошибка вызова операции сервиса: {http://it.selenia.ru}:AWK:pregMatch()

    по причине:

    Неверный формат.
    Reply ↓
  26. purtcer

    (21)

    Тогда микрософтовцы, тоже криворукие… Приподключении вашего сервиса к VWD он вообще ругается вот так вот.

    Документ с URL-адресом http://it.selenia.ru/services.php?wsdl не распознан как документ известного типа.

    В устранении проблемы могут помочь сообщения об ошибках для каждого известного типа:

    — Отчет от «Документ DISCO»: «Не удалось найти документ Discovery с URL-адресом http://it.selenia.ru/services

    Может дело не в 1с и microsoft… 😀 ну это как предположение… 😀

    А по поводу List иногда бывает неоюходимость сделать многомерный массив. Ссылкой на многомерный List не поделитесь?

    Reply ↓
  27. Elisy

    (26) По идее без диско должен работать. Диско — это дополнительная фича, выглядит примерно так: http://code.elisy.net/services/forecastservice.asmx?disco

    У меня подозрение, что 1С плохо работает со сложными типами. Нужно тип выходного параметра изменить на массив строк как-то.

    А для многомерного списка тип List<List<string>> не подойдет?

    Reply ↓
  28. purtcer

    (27) Так я и говорю, что не понимают системы сложные переменные друг друга, и что бы ими пользоваться нужно показать системе что это вообще такое, поэтому массив и список значений не передашь, а можно передать список структур, ну или List структур(заранее определенных). Найдете способ передавать сложные переменные, крикните, Я ссылочные объекты из 1с в net передать хочу.

    А по поводу List<List<string>>, да такое проканает, но начал делать, что-то мозыг закипать начал… 😀

    И кстати ваш сервис и без disco открывается нормально VWD. А 1с-ом его пробовали открывать?

    Reply ↓
  29. Elisy

    (28) Visual Studio для сложных структур автоматически создает врапперы и позволяет использовать такие типы, но ей нужен Disco-сервис. А как только получится такие объекты в .Net принимать, к ним можно обращаться из 1С.

    Сервис http://code.elisy.net/services/forecastservice.asmx писали для 1С в том числе, но примера его вызова из 1С не сохранилось. Только вызов через .Net-средства: http://infostart.ru/public/61457/

    Reply ↓
  30. purtcer

    (27) Что за доп фитча? Какую она несет функцию?

    Reply ↓
  31. awk

    Странно смущает меня —

    Отчет от «Документ DISCO»: «Не удалось найти документ Discovery с URL-адресом http://it.selenia.ru/services

    SOAPUI:

    Запрос:

    <soapenv:Envelope xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:soapenv=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:it=»http://it.selenia.ru»>
    <soapenv:Header/>
    <soapenv:Body>
    <it:pregMatch soapenv:encodingStyle=»http://schemas.xmlsoap.org/soap/encoding/»>
    <str xsi:type=»xsd:string»>aaa</str>
    <tmpl xsi:type=»xsd:string»>/a(a)a/i</tmpl>
    </it:pregMatch>
    </soapenv:Body>
    </soapenv:Envelope>
    

    Показать

    Ответ:

    <SOAP-ENV:Envelope xmlns:SOAP-ENV=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:SOAP-ENC=»http://schemas.xmlsoap.org/soap/encoding/»>
    <SOAP-ENV:Body>
    <ns1:pregMatchResponse xmlns:ns1=»http://it.selenia.ru»>
    <return xsi:type=»SOAP-ENC:Array» SOAP-ENC:arrayType=»:[2]»>
    <item xsi:type=»xsd:string»>aaa</item>
    <item xsi:type=»xsd:string»>a</item>
    </return>
    </ns1:pregMatchResponse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    Показать

    Reply ↓
  32. Elisy

    (30) Насколько я понимаю — динамически подключаться к веб-сервису, отличному от ссылки на прокси-классе (см. описание метода SoapHttpClientProtocol.Discover в .Net framework)

    Reply ↓
  33. mini_root

    Хм… с одной стороны в веб-сервисах в нынешнем виде действительно много странного, но с другой стороны (как это ни странно) если все делать осознанно и по уму, четко себе представляя, что и как должно функционировать — сервисы вполне себе работают.

    Хотя безусловно все движки имеют свои глюки и особенности, но у же щас есть некий уровень, на котором обеспечивается вполне приемлемое качество взаимодействие: вызов/обработка вызова со сложными типам. Этот уровень уже сейчас могут обеспечивать самый широкий круг движков: от CXF до внутреннего движка SAP’a, и от WCF до встроенного движка 1С (хотя последний — с баааальшой натяжкой, ибо кривой, глючный и явно нелюбимый товарищем Нуралиевым 😀 ).

    Примеры:

    «Интеграция 1С с сервисной шиной OpenESB»

    http://infostart.ru/public/21506/

    Хотя там по сути SOAP взаимодействия с 1С’ом нету.

    >Предполагаю, что 1С не нравится составной тип возвращаемого значения ArrayOfString

    очень плохо, что он ему не нравится… тот же CXF точно также определяет коллекции при генерации WSDL — САП’у вроде нравится

    P.S. Ну а когда движок и клиент переходят некоторую черту в развитии, становятся доступными совсем интересные вещи:

    http://infostart.ru/public/59961/

    Reply ↓
  34. awk

    Microsoft то же кажется не нравится тип http://it.selenia.ru/services.wsdl он проглотил..

    Reply ↓
  35. purtcer

    (33) Да что вы все 1с пинаете за кривость работы с сервисами. Главное что работает. Было web-расширение, тоже не нравилось. Сделали лучше, опять не то. Предлагаю бросить 1с и перейти на дугие платформы создания учетных програм, с более развитой поддержкой web-сервисов. Или Com-подключение используйте — тоже вариант.

    Reply ↓
  36. mini_root

    (35) А я что предлагаю? Первую ссылку в (33) смотрите.

    Ты COM видишь? А он еееесть….

    >дугие платформы создания учетных програм

    не-не-не, имею удовольствие видеть эти быдлоподелки, лучше уж 1С (реально лучше).

    >Да что вы все 1с пинаете за кривость работы с сервисами.

    Пинал, пинаю и буду пинать 😀

    Reply ↓
  37. purtcer

    (36) Com — это последнее что я буду использовать… (из разряда «быдлоподелки»).

    >Пинал, пинаю и буду пинать. — Тогда зачем так мучатся и юзать ее родимую?

    Reply ↓
  38. Elisy

    (35) Никто ее не пинает. Наоборот, я ее сторонник и занимаюсь пропагандой на западе. Пытаемся разобраться. В данном случае описания ошибки 1С не хватает, чтобы понять в чем дело. Нужен вызов другими средствами. Лично я — сторонник простых решений, поэтому предлагаю упростить тип. Кстати, формат JSON также пошел по пути упрощения.

    Reply ↓
  39. Elisy

    (37) Подпинывать тоже нужно слегка, чтобы была в тонусе и оставалась конкурентоспособной.

    Reply ↓
  40. purtcer

    (38) По поводу описаний. Раз уж на то пошло. Был у меня случай, что процедура просто прерывалась как раз на стыке net и 1с и описаний никаких вообще не было. А потом обновилась платформа 1с и появилось описание ошибки. Так что ждите обновления… 😀

    Reply ↓
  41. mini_root

    (37) Com — это последнее что я буду использовать… (из разряда «быдлоподелки»).

    Увы, но это единственный открытый программный интерфейс к 1С (если не считать какой-то native api, для 8.2).

    Reply ↓
  42. mini_root

    (37)

    >Тогда зачем так мучатся и юзать ее родимую?

    Потому, что для своего сегмента это идеальный инструмент

    Reply ↓
  43. purtcer

    (42)

    >Потому, что для своего сегмента это идеальный инструмент

    Ну это вы загнули. Лучший, да. Иделального не бывает, поэтому постоянно новые релизы и выходят… 😀

    Reply ↓
  44. Трактор

    (38) (40) awk поправил что-то. Теперь сервис работает с 1С.

    Reply ↓
  45. purtcer

    (44)так чем проблема-то была? Теперь-то уж интересно???

    Reply ↓
  46. Трактор

    Это у awk надо спрашивать. Наверное привёл к виду, описанному в теме.

    Reply ↓
  47. awk

    (46)(45) Поправил? Да я этот пхп каждые пять минут правлю. От этого и ошибки вылазят. Последняя была вместо xsd:string написал wsd:string из-за этого он не нравился микросовту. 1С вылетает при вызове метода напрочь. А COM на linux??? Я не пробовал, но боюсь не получится…

    Reply ↓
  48. Трактор

    (47)

    1С вылетает при вызове метода напрочь.

    Когда я писал 44 не вылетала. Сейчас опять вылетает.

    Reply ↓
  49. awk

    (48) Последний релиз. Возвращаю строку — и 1С вылетает… Типы данных не причем…

    Reply ↓
  50. Трактор

    (49) Нормально работает. Не вылетает.

     Определения = Новый WSОпределения(«http://it.selenia.ru/services.php?wsdl»);
    Прокси = Новый WSПрокси(Определения, «http://it.selenia.ru», «AWK», «AWKPort»);
    //Строка(Прокси.ТочкаПодключения.Интерфейс.Операции[0].Параметры[0].Тип)
    pregMatchRequestType = Прокси.ФабрикаXDTO.Тип(«http://it.selenia.ru», «pregMatchRequestType»);
    pregMatchRequest = Прокси.ФабрикаXDTO.Создать(pregMatchRequestType);
    pregMatchRequest.str =»aaa»;
    pregMatchRequest.tmpl = «/a(a)a/i»;
    //pregMatchRequest.tmpl = «1123456»;
    зн = Прокси.pregMatch(pregMatchRequest);
    //зн = Прокси.pregMatch(«aaa», «/a(a)a/i»);
    сообщить(зн.return);
    

    Показать

    Reply ↓
  51. awk

    (50) Версия 8.1? Я на 8.2 делал…

    Reply ↓
  52. Трактор

    (51) Эх! между 49 и 50 больше пяти минут. Опять, наверное, сломал 🙂

    Работает и в 8.1 и в 8.2.10.73.

    Reply ↓
  53. Трактор

    Вот обработки какими смотрю

    Reply ↓
  54. awk

    Сломал… Хочу-таки массив вернуть…

    Reply ↓
  55. Трактор

    (54) ты возвращал массив и 1С его понимала. Я проверял когда (44) писал.

    Reply ↓
  56. awk

    (55) Добился что бы Visual studio получала массив.. Теперь 1С формат не нравится…

    Reply ↓
  57. Душелов

    (56) Кинь что ли мне демку, я тоже поковыряю 😉

    Reply ↓
  58. hansel

    (35) Путь к совершенству — бесконечен…

    И вожакам надо периодически давать понять, что они ещё не прошли его до конца.

    Чтобы не расслаблялись.

    Reply ↓
  59. awk

    (57) http://it.selenia.ru/services.php?wsdl Я смотрю тема заразной оказалась… 😀

    Reply ↓
  60. Душелов

    (59) А что дальше?

    Reply ↓
  61. Душелов

    В 1С-ку добавил

    Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://it.selenia.ru», «AWK», «AWKPort»);

    Строка = «яяяяя»;

    Шаблон = «»;

    Результат = Прокси.pregMatch(Строка, Шаблон);

    Соответственно, ругается, что параметры не совпадают. Там 1 же параметр, аля структура с 2 полями. Ну как бы его создать и передать. В чем проблема-то?

    Reply ↓
  62. Душелов

    Ну и получается где-то так

    Строка = «яяяяя»;

    Шаблон = «sdsd»;

    Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://it.selenia.ru», «AWK», «AWKPort»);

    pregMatchRequestType = Прокси.ФабрикаXDTO.Пакеты.Получить(«http://it.selenia.ru»).Получить(«pregMatchRequestType»);

    Парам = Прокси.ФабрикаXDTO.Создать(pregMatchRequestType);

    Парам.str = Строка;

    Парам.tmpl = Шаблон;

    Результат = Прокси.pregMatch(Парам);

    Сообщить(Результат);

    Reply ↓
  63. awk

    (62) В том-то и дело, что так как должно быть в 1С коде все знают, а какой ей wsdl файл нужен? Что бы она это съела… В С# все ок..

    Reply ↓
  64. Душелов

    «Съела» в каком смысле?

    Reply ↓
  65. Душелов

    Могу еще 8.2 дать, если что…

    Reply ↓
  66. awk

    (65) Ну она у меня то вылетает, то Свойство не находит…

    Reply ↓
  67. Душелов

    (66) Какое свойство? На каком месте вылетает? Дай свою базу.

    Reply ↓
  68. Трактор

    (66) Вот сейчас 8.2 вылетает, а 8.1 нормально отрабатывает.

    на работе и 8.2 нормально отрабатывала.

    Reply ↓
  69. Трактор

    Вот картинка где видно что сервис отработал нормально.

    Reply ↓
  70. Душелов

    Вот 8.2

    Reply ↓
  71. Трактор

    (70) Лучше обработкой выкладывай. С базой возни много. Да ещё при начале работы системы!

    Reply ↓
  72. Душелов

    (69) У меня 8.2 тоже отработал нормально.

    Reply ↓
  73. Душелов

    (71) В смысле возни много? Загрузил из базы и вперед.

    Reply ↓
  74. Трактор

    (70) 71 относилось к базе 81. Но всё-равно лучше обработкой. Хоть для толстого клиента.

    В прикреплении картинка падения 8.2

    Похоже зависит от виндовса. На одном компе работает, на другом падает.

    Reply ↓
  75. Душелов

    8.1 — 14 релиз,

    8.2 — 10.73

    Reply ↓
  76. Душелов

    (74) А какой релиз платформы и какие ОС?

    Reply ↓
  77. Душелов

    Падения могут быть из-за файрвола или какого-нить брандмауера.

    У меня, вообщем, Windows 7, 1С-ка запущена под админом.

    Reply ↓
  78. Трактор

    Вин ХР

    Фиревол отключил.

    еМул работает

    1С:Предприятие 8.1 (8.1.14.72) — работает

    1С:Предприятие 8.2 (8.2.9.356) — падает

    Правда сетка у меня хитрая. Два провайдера одновременно.

    Reply ↓
  79. Душелов

    (78) Проверил. 8.2.9.356 — падает, 8.2.10.73 — не падает.

    Вывод — косяк платформы, уже исправленный.

    Reply ↓
  80. awk

    (79) (74) Спасибо. Если интересно, то окончательный код сервиса:

    <?php
    // Подключаем код NuSOAP
    require_once(‘lib/nusoap.php’);
    // Создаем экземпляр сервера
    $server = new soap_server();
    $server->configureWSDL(‘AWK’,’http://it.selenia.ru’,»,’document’);
    $server->decode_utf8 = false;
    $server->soap_defencoding = ‘UTF-8’;
    $server->wsdl->addComplexType(
    ‘ArrayOfString’,
    ‘complexType’,
    ‘array’,
    »,
    ‘SOAP-ENC:Array’,
    array(),
    array(
    array(‘ref’=>’SOAP-ENC:Array’,
    ‘wsdl:arrayType’ => ‘SOAP-ENC:string[]’,
    ‘arrayType’ => ‘SOAP-ENC:string[]’,
    ‘nillable’=>’true’
    )),
    ‘SOAP-ENC:string’
    );
    
    $server->register(‘pregMatch’,
    array(‘str’ => ‘xsd:string’, ‘tmpl’ => ‘xsd:string’),
    array(‘return’ => ‘tns:ArrayOfString’),
    »,
    »,
    ‘document’,
    ‘literal’);
    // Определяем метод как функцию PHP
    function pregMatch($str, $tmpl) {
    if (preg_match(‘@#k8SjZc9Dxk(.).*1.?$@i’,$tmpl) == 0) {
    return new soap_fault(‘SERVER’, », ‘bad template’,$tmpl);
    }
    else {
    preg_match($tmpl, $str, $res);
    }
    return $res;
    }
    // Используем HTTP-запрос чтобы вызвать сервис
    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : »;
    $server->service($HTTP_RAW_POST_DATA);
    ?>
    

    Показать

    Reply ↓
  81. Душелов

    (80) Стоит еще статью подправить с полученными результатами 😉

    Если кто не захочет все комменты читать….

    Reply ↓
  82. awk

    (81) Обязательно подправлю, только отосплюсь… А то по три часа в сутки последнюю неделю сплю.

    Reply ↓
  83. baloo

    Чего-то я долблюсь-долблюсь и ничего не выходит.

    При вызове pregMatch() возвращает

    «Ошибка разбора SOAP сообщения: неверная версия сообщения.»

    Куда копать?

    PS платформа 8.1.13.41

    Reply ↓
  84. awk

    (83) А какие параметры передаете? И на какой адрес подключаетесь..

    Reply ↓
  85. baloo

    Юзаю Ваш тестовый сервис.

    Вот код:

    WSОпред = Новый WSОпределения(«http://it.selenia.ru/services.php?wsdl»);

    СервисТест = НОвый WSПрокси(WSОпред,»http://it.selenia.ru», «AWK», «AWKPort»);

    ТипВход = CервисТест.ФабрикаXDTO.Пакеты.Получить(«http://it.selenia.ru»).Получить(«pregMatchRequestType»);

    ВходПарам = СервисТест.ФабрикаXDTO.Создать(ТипВход);

    ВходПарам.str = «blablabla»;

    ВходПарам.tmpl = «йа параметрег!»;

    Результ = СервисТест.pregMatch(ВходПарам); // На этом моменте вызывается ошибка

    Reply ↓
  86. Душелов

    (85) А код посмотреть?

    function pregMatch($str, $tmpl) {

    if (preg_match(‘@#k8SjZc9Dxk(.).*1.?$@i’,$tmpl) == 0) {

    return new soap_fault(‘SERVER’, », ‘bad template’,$tmpl);

    }

    Вызывается исключение плохого шаблона.

    Reply ↓
  87. awk

    (86) (85) Спасибо, так оно и было. Просто исключение не описано в wsdl. Шаблон состоит из скобок например: .. ХХ «» @@ не важно после скобок может быть i или не быть и самого выражения внутри скобок.

    (85) А зачем пользоваться тем чего не понимаешь? Статья не описывает мой сервис (я его уберу), а описывает технологию связки PHP и 1C.

    Reply ↓
  88. baloo

    Проблема в том что данное исключение вываливается при любых раскладах. Причём не только с Вашим сервисом, поднимали свой аналогичный, смысл был — получаем параметр (строку), возвращаем «Hello» + параметр. Всё равно поднимается это исключение.

    Reply ↓
  89. awk

    (88) 8.1.14.72 Работает. 8.2.10.73 Работает. 8.2.9.356 Точно не работает при возврате массива. Если очень надо поднять, то наверно надо как-то обновляться или нанимать кого-то кто будет с вашем случаем разбираться индивидуально. Я свой случай обкатал, добился результата при львиной поддержке Трактора и Dushelovа, теперь жду прихода ИТС для обновления 1С.

    Reply ↓
  90. fierce

    Интересная статья, реализовывал по похожему принципу и на 8.1 и на 8.2 все завелось почти с первого раза, правда не без помощи web программиста. Автору спасибо

    Reply ↓
  91. fr.myha

    Спасибо большое за этот материал!

    Reply ↓
  92. Elisy

    Статья в копилку средств веб-интеграции:

    http://infostart.ru/public/104926/

    Reply ↓
  93. softest

    Самое интересное, что модуль 1с-битрикс «веб сервис» не поддерживает веб сервисы 1с пришлось использовать NuSOAP!

    Reply ↓
  94. user_2010

    Есть такой вопрос, может быть вы поможете: сделала веб-сервис в 1С, опубликовала, он работает в SoapUI, еще проверяли из других программ — работает… Но нужно его использовать в программе, которая работает на платформе SharePoint. Так вот у них мой веб-сервис не работает. Как они объясняют: не тот синтаксис веб-сервиса.

    Вот такой синтаксис делает 1С:

    xs:schema targetNamespace=

    xs:element name=

    А вот так надо SharePoint:

    s:schema elementFormDefault=

    s:element name=

    Почему 1С делает «xs», а не «s»?

    Т.е. вместо «<xs:…» должно быть «<s:…».

    Как это сделать в 1С? Как изменить синтаксис опубликованного веб-сервиса?

    Что-то в URI пространством?

    Reply ↓
  95. awk

    (95) user_2010, Добрый день. 1С может и xs1 дать. Это называется префикс. Префикс однозначно определяет пространство имен тега. То есть есть описанbе данного пространства имен: xmlns:xs=»http://….». Так что у 1С все правильно. А SharePoint программистам надо теорию учить.

    О пространствах имен можно почитать например в википедии: https://ru.wikipedia.org/wiki/Пространство_имён_(XML)

    Reply ↓
  96. user_2010

    Спасибо! Передам вашу информацию нашему специалисту по шарепоит…

    Я правильно поняла, что я не смогу настроить 1С так, чтобы получить префикс S?

    Reply ↓
  97. user_2010

    Насколько я поняла: в 1С я в качестве пространства имен могу указать любую информацию, главное, чтобы было похоже на ссылку.

    Как понять: почему 1С в одном случае дает префикс xs, а в другом случае уже дает префикс xs1?

    Может быть при каком-то условии/настройке можно добиться получения префикса S? Какая тут логика?

    Reply ↓
  98. awk

    (97) user_2010, Нет. Там все автоматизировано до безобразия…

    Reply ↓
  99. awk

    (98) user_2010,

    Насколько я поняла: в 1С я в качестве пространства имен могу указать любую информацию, главное, чтобы было похоже на ссылку.

    Пространство имен это произвольная строка. URL — это всего лишь способ сделать эту строку уникальной.

    Как понять: почему 1С в одном случае дает префикс xs, а в другом случае уже дает префикс xs1?

    Может быть при каком-то условии/настройке можно добиться получения префикса S? Какая тут логика?

    xs — это просто удобняшка, для легкости чтения. xs1 перфикс вряд ли 1С создаст, а вот ns1, ns2 … — вполне. Префикс s можно получить делая xml «руками». В 1С логики префиксации особой нет.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *