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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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 не будет опубликован. Обязательные поля помечены *