Практическое применение механизма WEB-сервисов в системе «1С:Предприятие»




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

25 Comments

  1. jobkostya1c8

    Веб-сервисы как средство интерграции 1С со сторонними АИС, фактически API двусторонний доступ очень полезная технология. Начинает применяться довольно широко. Поставлю плюс.

    Скоро поди ее в 1С прикрутят на некоторые «справочные» обмены с сайтами. Как-то делал обработку для загрузки курсов валют с сайта Сбербанка чтоб проверить данный механизм.

    Reply
  2. serge_focus

    Статья понравилась. Сейчас в 1С Веб-сервисы реально позволяют очень много — начиная от отслеживания курсов , движения посылок , состояний заказов, обменов с интернет-магазином и заканчивая мобильной платформой. Автору плюс.

    Reply
  3. VarLone

    Хотелось бы поподробнее почитать про «ПРИМЕР ОБРАЩЕНИЯ К WEB-СЕРВИСУ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»» если веб-сервис использует проверку подлинности на основе сертификатов. И может ли вообще 1С работать с веб-сервисами с аутентификацией по сертификаиам.

    Reply
  4. dyak84

    Автор на мой скромный взляд прогресивно так что просто не слов. Ето все равно что связать не связуемое. Побольше бы таких статей.Ето приводит к размышлению и развитию.Спасибо так держать.

    Reply
  5. jobkostya1c8

    (4) dyak84, верно говорите. Стоит большое внимание на веб-сервисы обратить. Жаль только что обращаешь «усердное» внимание когда уже есть реальная задача 🙂

    Reply
  6. DitriX

    Веб—сервисы — это уже прошлый век, всем пора переходить на http-сервисы, вот где круто, а веб-сервисы были актуальны лет 5 назад, так что давайте еще одну статью по http сервисам 🙂

    Reply
  7. Dach

    Статья понравилась, очень подробно и доходчиво.

    Только непонятно, а где мы берем WSDL-файл для его загрузки в Delphi?

    Reply
  8. ira778899

    Вы какую версию Delphi использовали ?

    Reply
  9. AXIOMLAB24

    (8) ira778899, Delphi XE7

    Reply
  10. Гость

    Большое спасибо за статью, предоставлена полная информация для «попробовать». Попробовал и почему-то не заработало. Сервис опубликовал на локальном Apache 2.2. При попытке обратиться к нему из 1С доходит до создания WSПрокси, но вылетает в исключение при попытке обратиться к методу. Пробовал добавить ws-ссылку, метод виден, но вызвать его все равно нет возможности. В какую сторону копать?

    Reply
  11. jills2001

    Спасибо за статью.

    Мы начали первые шаги в этом направлении:

    1)создали свой веб-сервис как в статье с одной операцией (тестовая) пока простая без параметров

    Функция proc_oper_try_4()

    Возврат Истина;

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

    2)успешно выполнили публикацию,

    3) разработала тестового простого клиента в Delphi 7, выполнив все как в статье, выполнила импорт WSDL-файла, все отлично создался модуль, далее прописала вызов метода.

    Но при проверки работы клиентского приложения при вызове функции сервиса получаю ошибку вида «Received content of invalid Content-Type setting: text/html- SOAP expects «text/xml»

    Подскажите пожалуйста, что необходимо подправить для успешного вызова метода? в каком направлении копать?

    Reply
  12. maguga

    Ребята, а не опишите ситуацию когда 1с использует внешний веб сервис по HTTPS с сертификатам безопасности. Как такой сертификат использовать?

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

    Reply
  13. IgorXml

    Спасибо! В WSОпределении немного изменил и тогда заработало:

    Процедура ПолучитьДанныеНаСервере(Клиент)
    Определение = Новый WSОпределения(«http://localhost/Ist/ws/DocumentsData?wsdl»,»Admin»,»»);
    Прокси = Новый WSПрокси(Определение, «http://localhost/request», «DocumentsData», «DocumentsDataSoap»);
    Прокси.Пользователь = «Admin»;   Прокси.Пароль = «»;
    

    И в В default.vrd ничего не надо добавлять если при публикации указать. 1С 8.3.8.1652:

    Reply
  14. rwn_driver

    Статья полезная, особенно при начале работы с Web-сервисами. Есть один вопрос — как задать для вызова свойство Web-сервиса с несколькими параметрами, если описывается тип только одного параметра?

    Reply
  15. anco27

    (14) rwn_driver, Указываешь при описание несколько параметров и вперед, а лучше указываешь только один параметр, но тип структура и все

    Reply
  16. pashamix

    А как заполнить список в WS? Например есть документ (заявка) и в нем ТЧ товары.

    Reply
  17. Vanch90

    А можно ли выкладывать не через локальный?

    Допустим есть домен и виртуальный сервер от хостера.

    Reply
  18. alex_4x

    Очень полезный материал!

    Один вопрос.

    Шаг 8. Опубликуем созданный Web-сервис на веб-сервере.

    А как опубликовать, если на сервере нет графического интерфейса (linux) ? Сама база опубликована и в команде публикации базы — нет параметра про публикацию сервиса.

    С другого компьютера, когда в конфигураторе — не публикует, пишет «Веб-серверы не обнаружены».

    Reply
  19. alex_4x

    А что это может значить?

    Если имя совсем неправильное написать — то пишет Сервис не найден.

    А так вроде что-то отвечает, но пустая страница. При просмотре — вот такое:



    <?xml version=»1.0″ encoding=»UTF-8″?><?xml-stylesheet type=»text/xsl» href=»/redirect.php?url=aHR0cDovLzFjLWxpbnV4L0Jhc2ExL2UxY3N5cy92cnNjb3JlL2V4Y2VwdGlvbi54c2x0P3N5c3Zlcj04LjMuMTAuMjI5OQ==»?><exception xmlns=»http://v8.1c.ru/8.2/virtual-resource-system» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:type=»Exception» clsid=»580392e6-ba49-4280-ac67-fcd6f2180121″ reason=»400″><descr xmlns=»http://v8.1c.ru/8.1/data/core»>Не указан заголовок управления сеансами или куки с идентификатором сеанса.</descr></exception>

    Reply
  20. Artem1C

    Подскажите пожалуйста,

    При создании описания сервиса произошла ошибка. URL сервиса: http://localhost/zerkal/ws/***.1cws?wsdl

    Код ответа сервера: 301

    ошибка возникает в коде

    Определение = Новый WSОпределения(«http://localhost/zerkal/ws/***.1cws?wsdl»)

    Reply
  21. ИИИ

    (20)Удалось решить проблему? Я никак не пойму что делать. День потерял и ничего.

    Reply
  22. anco27

    (20) Для начала вставьте wsdl-ссылку в браузер и посмотрите, что у Вас выдает

    Reply
  23. alex0402

    Шаг 1. Положить на клиент, где запускается система 1С файлик webservicecfg.xml со следующим содержимом

    Куда именно?

    Reply
  24. BigBoss

    Очень интересно!

    Reply
  25. ybatiaev

    Мне показалось, что использование HTTP-сервисов намного проще. Подскажите преимущества WS.

    Ещё. Понимаю, что SOAP — это некий универсальный протокол, однако JSON намного проще. В 1С с ним работать тоже проще. Трафик меньше, наглядности в просмотре тоже больше из-за отсутствия «лишнего».

    Reply

Leave a Comment

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