Еще один динамический интерфейс




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

13 Comments

  1. Evg-Lylyk

    Ну описания нет ладно. Ну хотя бы картинку привел как это выглядит.

    Reply
  2. Totoro

    Хм. Как я понял твоя обработка позволяет создавать элементы управления (рамки и надписи), на прикрепленной панели и соответственно обрабатывать по ним одну команду (как у Раруса избранное в CRM сделано)? Честно, говоря, при использовании такого варианта проще применять стандартную ПанельФункций от 1С, которая выводит HTML-панельку с командами и текстом. Гораздо удобнее и возможностей оформления больше.

    ЗЫ Можешь посмотреть похожие проекты:

    http://www.infostart.ru/projects/1472

    http://www.infostart.ru/projects/3667/

    Reply
  3. transsoft

    (2) Это замена главного меню 1С. Для разных заказчиков оно совершенно разное. А конфа одна. Смотрел ссылки но там либо по метаданным строится, либо пользователь(?) сам чего-то должен рисовать. У меня программист разводит по понятиям.

    Reply
  4. Totoro

    (3) А чем не устраивает стандартное меню и его настройка по интерфейсам? Только тем, что надо менять конфу и добавлять новые интерфейсы?

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

    Reply
  5. Totoro

    4+ как кстати и в 1С-кой ПанельФункций — текст на панель задается только программистом.

    Reply
  6. transsoft

    (5) ПанельФункций перекрывается открытыми окнами или сама их перекрывает что не есть удобно.

    Reply
  7. Totoro

    (6) Нет, это новый вариант панели функций. Старый был как сейчас «Советы», прикрепляемый. На ИТС даже есть обработка по настройки её содержания.

    Reply
  8. ssn1978

    Мне понравилось, спасибо

    Reply
  9. redgad

    Чем моя не понравилась? В ней сам пользователь может настроить пункты для себя.

    http://www.infostart.ru/projects/3672/

    Reply
  10. transsoft

    (9) А зачем козе баян? Пользователь должен пользоваться. Например большая организация Вася ведет штатное расписание, а Петя учет ТМЦ. Петя настроит свои пункты на ведение штатного расписания? По поводу прав доступа. Тогда нужно держать одну конфу для этой организации, и такую же, но с другими правами и ролями, для маленькой фирмочки где все это делает одна Маша. Появляются не нужные проблемы с сопровождением. У меня построение панели вынесено во внешнюю обработку, которая для каждого заказчика своя, а конфа одна для всех

    Reply
  11. sound

    Убрать ненужный скролинг у поля HTML:

    ЭлементыФормы.[ИмяПоля_HTML].Документ.body.scroll = «no»;

    Во как 🙂

    Reply
  12. sound

    пихай в процедуру «ДокументСформирован(Элемент)» и будет щастие

    Reply
  13. transsoft

    11,12 Спасибо. Я это поле просто заменил элементом «Надпись». Для часов прицепил обработчик ожидания.

    Reply

Leave a Comment

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