Быстрое прототипирование веб и мобильных приложений




Принцип обмена данными из 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='\

13 Comments

  1. ivanov660

    1. Так и не понял что из себя представляет промежуточный блок «сервис».

    2. Порадовала фраза

    промежуточный сервер на node.js

    , обычно в качестве сервера используется приложение Apache или IIS, а это просто скрипт.

    3. Т.е. Вы предлагаете установить сервер в полном варианте, создать вебсайт и использовать набор скриптов для взаимодействия с 1С. В такой конструкции нет пула запросов, поэтому реализация будет практически аналогична картинке с которой подключаются все сервисы напрямую к 1С. В упрощенном же задача просто открыть «stand alone» файл по локальной сети видимо.

    4. На самом деле работать с ООП JavaScript совсем не просто в отличии от 1С, а в большинстве фреймворков реализацию необходимо будет допилить. В этом случае рекомендую использовать хотя бы php или perl, что позволит решить вопросы безопасности и реализации заявленного функционала.

    Reply
  2. andy_minsk
    Порадовала фраза

    промежуточный сервер на node.js

    , обычно в качестве сервера используется приложение Apache или IIS, а это просто скрипт.

    Node.js — это не совсем скрипт, точнее вообще не скрипт, а платформа, которая может быть и web-сервером в том числе. По мне несколько непривычная после 1С, но весьма популярная в WEB в последнее время.

    Согласен с автором в главном — в случае клиентского доступа нужен промежуточный сервис. Методик и средств его построения много, от предложенного Node.js или Wakanda, до BAAS решений типа QuickBlox, Parce. Все определяется задачей.

    Reply
  3. antonbezrukov

    (1) ivanov660,

    1) Представьте, что есть связка «1С:УТ» — «Интернет магазин (на базе Битрикс, например)» — «Браузер клиента». В контексте данной публикации «Интернет магазин» это и есть «Сервис».

    2) На этот пункт уже ответил (2) andy_minsk. Более подробно можно посмотреть на официальном сайте

    3) Если использовать инструментарий, который я предложил, то нет необходимости в установке полноценного веб-сервера и создании сайта. Его можно использовать и в локальной сети и в Интернет. И даже если нужно будет отдавать статические данные (те же index.html и magicrpc.js, например), то это можно будет очень просто добавить.

    4) Что касается JavaScript, я согласен, с ООП там пока дела не очень хорошо, но с приходом ES6 ситуация должна улучшиться. Но и 1С не поддерживает полноценный ООП — есть только возможность работы с объектами «унаследованными» от предопределенных платформой.

    Reply
  4. FSerg

    Хорошо, что появляется все больше и больше статье про использование 1С совместно с какими-то современными web-технологиями.

    Спасибо, что поделились!

    Reply
  5. antonbezrukov

    Если будет интересно, вот ссылка на 13минутное видео, о том как создавался пример, приведенный в публикации.

    Reply
  6. Aleksey.Bochkov

    (0) Не согласен, что прямой коннект веб-клиента к базе 1С не подходит для массового использования.

    На HTTP-сервисах это все прекрасно реализуется. HTTP-соединение как и web-сервис лицензий не требует. А создаваемая нагрузка минимальна даже при полном хостинге контента внутри базы 1С. ИМХО, даже на «очень среднем» сервере вполне смогут комфортно работать сотни пользователей одновременно (если, конечно, в запросах не будет массивных бинарных данных — картинок, файлов и т.д.).

    Очень топорный пример тут (с трансфером картинок от мобильных юзеров).

    Для авторизации везде вводить имя пользователя user, без пароля.

    http://demo.bizzsimple.com/te/ — основная база

    http://demo.bizzsimple.com/te/hs/mob/all/ — интерфейс для пользователей телефонов и планшетов на Android и iOS. Продажники делают фото чеков прямо с веб-страницы, добавляют комментарии, сумму, а затем отправляют на проверку менеджеру.

    http://demo.bizzsimple.com/te/hs/mng/all/ — аналогичный интерфейс для телефонов и планшетов. Руководители продажников проверяет список документов и утверждает или отклоняет их.

    Все шаблоны html и данные при этом хранятся в базе 1С и всегда доступны онлайн.

    Reply
  7. antonbezrukov

    (6) Aleksey.Bochkov,

    На HTTP-сервисах это все прекрасно реализуется. HTTP-соединение как и web-сервис лицензий не требует.

    А можете поделиться, откуда у такая информация? Все что я в свое время нашел из официальных источников только Ответы на типовые вопросы по лицензированию «1С:Предприятия 8»

    59. Организация публикует всем желающим доступ к веб-сервисам, реализованным в «1С:Предприятии 8». Какое количество и каких лицензий необходимо приобрести Организации?

    В данном случае на рабочих местах организации осуществляется доступ к информационной базе «1С:Предприятия 8» с использованием веб-сервисов, причем сами веб-сервисы реализуют всего лишь способ доступа к данным «1С:Предприятия 8» и предметом для отдельного лицензирования не являются. В соответствии с Лицензионным Соглашением «1С:Предприятия 8» каждое рабочее место, с которого тем или иным способом осуществляется доступ к данным информационной базы «1С:Предприятия 8», должно быть обеспечено клиентской лицензией. То есть Организации для работы с программами, использующими веб-сервисы, необходимо приобрести клиентские лицензии на такое количество рабочих мест, которое позволит одновременно осуществлять доступ к информационной базе.


    58. Организация с помощью продукта «1С:Предприятие 8. Web-расширение» делает веб-витрину для собственной торговой системы, работающей на «1С:Предприятии 8». Предполагается, что к ней одновременно будут подключаться до ста пользователей. Сколько клиентских лицензий должна приобрести Организация для создания веб-витрины?

    Использование программных или аппаратных средств, уменьшающих количество пользователей, которые имеют непосредственный доступ к 1С:Предприятию 8, как это происходит при использовании «Web-расширения», не уменьшает количества требуемых лицензий. Таким образом, для создания веб-витрины Организация обязана приобрести сто клиентских лицензий.

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

    Reply
  8. Aleksey.Bochkov

    (7)

    9.2.3.7. Web-сервис

    Для работы Web-сервисов не требуется клиентских лицензий. Однако если информационная база, которая предоставляет Web-сервисы, работает в клиент-серверном варианте, необходимо наличие серверной лицензии для работы сервера «1С:Предприятия».

    http://its.1c.ru/db/v83doc#bookmark:adm:TI000000304

    Для HTTP-сервисов также справедливо.

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

    Что использовать — дело вкуса и опыта конкретного разработчика, а также особенностей конкретного проекта.

    Я лишь хотел поспорить с общим утверждением «для массового сервиса не подходит» :).

    Reply
  9. antonbezrukov

    (6) Aleksey.Bochkov,

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

    Допустим, пишем проект «Корпоративные туду-листы» (по мотивам Basecamp, например). И для каждой компании, хотим иметь отдельную базу данных (например, из соображений безопасности и еще, если нагрузка и/или размер отдельных БД будет большой, чтобы можно было базы клиентов разносить по разным хостам, заодно и резервное копирование можно было бы делать по каждому клиенту отдельно). С прямым коннектом «без костылей», на сколько я понимаю, это сделать не получится?

    Reply
  10. Aleksey.Bochkov

    (7) похоже, вы правы.

    В партнерской конференции немного противоречивая информация, но, вероятнее всего, юридически 1С требует наличия клиентских лицензий по числу одновременных соединений к web и http-сервисам.

    Reply
  11. Aleksey.Bochkov

    (9)

    Да, красиво, наверное не получится.

    Тут надо, чтобы клиент изначально отправлял запрос на правильный адрес.

    Можно конечно и «гибридную» архитектуру сделать: центральный сервер 1С только авторизует пользователей и выдает им html и скрипты с правильными параметрами, а страницы на клиенте через XMLHttpRequest грузят данные с нужного хоста, или отправляют данные куда надо.

    Правда тогда не вижу особой разницы с подходом, описанным вами в статье.

    Reply
  12. antonbezrukov

    (10) Aleksey.Bochkov,

    Надеюсь, положение дел с лицензированием в будущем прояснится, пока(и уже долгое время) все очень туманно…

    Reply
  13. din107

    Доброе время суток!

    Для меня так и осталось загадкой, что из себя представляет промежуточный блок «сервис». Что должно в нём содержаться? Как он пишется? Или может быть ссылку дадите, где можно про это почитать, буду очень признателен.

    Reply

Leave a Comment

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