Инструменты бухгалтера: Виджеты рабочего стола




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

26 Comments

  1. Red_Devil

    Симпатично!

    Reply
  2. FSlon

    Интересная фишечка 🙂

    Reply
  3. gragden

    Похоже на Монитор целевых показателей из ERP, но только ярлыки, можно дальше доработать чтобы выводить мини показатели

    Reply
  4. Lok`Tar

    Круто, плюс однозначно:)

    Reply
  5. klinval

    Хорошая штука. Не хватает возможности добавить открытие формы списка регистра (накопления или сведений).

    Reply
  6. FSlon

    Поправьте настройки режима совместимости интерфейса — в последних версиях БП выдает ошибку.

    Reply
  7. Bazil

    (5) В новой версии добавил открытие списка регистра.

    Reply
  8. Proplus74

    КЛАССНО!!!! У меня последняя БП (оф.обновления) -все работает!

    Reply
  9. webresurs

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

    Reply
  10. Bazil

    (9) Да, у каждого пользователя свои настройки виджетов.

    Reply
  11. webresurs

    (10) возможно не так написал…

    Администратор настроил несколько раб.столов для пользователей со своего компьютера и пользователь заходя под своим логином видит тот р.стол, что настроено для него?

    или все настройки делаются только под тем пользователем, которому это надо..?

    Reply
  12. Bazil

    (11) Настройки делаются под самим пользователем.

    Reply
  13. Bazil

    (9) Вы подали хорошую идею.

    Добавил для администратора возможность загружать/сохранять настройки других пользователей. Публикацию обновил.

    Reply
  14. webresurs

    (13) — здорово, 1с всегда не хватает этого…

    Reply
  15. webresurs

    (13)- еще бы убрать настройки, что бы пользователи не могли добавлять, удалять или изменять виджеты и будет идеально …

    Reply
  16. webresurs

    Ошибка если Виджет в другом пользователе настроен на 2х2, из под администратора нажимаешь Загрузить настройки пользователя и Настройка

    Reply
  17. Bazil

    (16) Исправил.

    Reply
  18. plevakin

    Откройте секрет, из чего сделаны виджеты, поле HTML документа?

    Reply
  19. plevakin

    (18) Разобрался. Колдую над пунктирными разделителями. Что это?

    Reply
  20. LynxX

    Спасибо ! Очень полезная вещь! Мои Бухи больше не мучают с вопросом, где что лежит)

    Было бы неплохо увеличить количество Виджетов ) Добавить возможность выбора картинки)

    Reply
  21. wowik

    Отличная работа! Расширение «завелось» на конфигурации «Управление IT-отделом 8, редакция 3.1».

    Reply
  22. d_vit

    Отлично. Все заработало на «Бухгалтерия для Казахстана, редакция 3.0, разработка для Казахстана».

    Можно добавить функцию которая после удаления Виджета, сдвигала бы все виджеты в лево и добавить сам список виджетов (например в форму «Виджеты рабочего стола» ) для возможности редактирования порядка виджетов так сказать на лету.

    Reply
  23. kostant

    Добрый день. А как менять уже добавленный виджет? Спасибо.

    Reply
  24. Bazil

    (23) В левом верхнем углу виджета значек треугольника, его нажать — выпадет меню «Настроить виджет».

    Reply
  25. kostant

    (24) Добрый день. Я так и понял, только сколько раз не пытался у меня выполнение задачи идет и меню не выпадает.

    Reply
  26. kostant

    (24) Возможно это связано с платформой 8.16?

    Reply

Leave a Comment

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