Мягкая смена периода журнала расчетов




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

28 Comments

  1. solf

    такая обработка очень хорошая штука в работе 🙂

    У меня у самой такая.

    В вашей понравилась идея списка журналов 🙂 А то в моей по умолчанию зарплата и все.

    ТОлько вот если нужен январь 2000г. замучаешсья давить на кнопочке. Можно сделать период по дате. В окошке просто писать дату, например 17.01.00 — установит январь 2000. Удобнее и тыкать не надо на кнопочки.

    Reply
  2. poppy

    > ТОлько вот если нужен январь 2000г. замучаешсья давить на кнопочке.

    При написании обработки предполагалось, что исправляться будут периоды полгода-год назад. Т.к. она писалась второпях, проще было написать так как есть.

    Reply
  3. savonov

    Помогло в работе, спасибо +1

    Reply
  4. Tyranosaurus Rex

    Спасло!!!

    Reply
  5. gutentag

    Ура!

    Reply
  6. romankoav

    Ребят, вы что тут прикалываетесь что ли? на 1с.proclub.ru есть обработка «Редактор журнала расчетов» и смена периода в нем это скорее 1% функционала! Я бы советовал автору не зарабатывать себе популярность на обработке написание которой занимает менее 30 минут.

    Reply
  7. tilia

    Спасибо, выручили.

    Reply
  8. Uragan

    Спасибо!

    Reply
  9. santilka

    молодцы

    Reply
  10. oktn

    Спасибо огромное. Спасены расчетчики от гнева главбуха.

    Reply
  11. Adeptt

    Спасибо ..сработало как нужно

    Даж удивлен ..быстро и просто 🙂

    Reply
  12. alexdm
    Adeptt пишет:

    Спасибо ..сработало как нужно

    Даж удивлен ..быстро и просто

    Тупеют адинэсники просто на глазах… Писец…

    Reply
  13. rom-x

    Вот сделал для себя что-то подобное, только в моем случае смена периода происходит сразу, при нажатии кнопок << или >>

    Reply
  14. vera4ka

    Спасибо.очень-очень помогла

    Reply
  15. alevize

    Спасибо! как раз занимаюсь поиском подобного решения, т.к. необходимо из за смены ставки страховых взносов делать перерасчет зп с января месяца

    Reply
  16. TrinitronOTV

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

    Reply
  17. ratter

    Как раньше без неё жили? Спасибо.

    Reply
  18. xDee

    Спасибо ..сработало как нужно

    Даж удивлен ..быстро и просто

    Reply
  19. dvt_dvt

    ну отличная обработка, если только не злоупотреблять ею )))

    Reply
  20. Sherdrada

    (6) romankoav, ссылочку сможешь дать?

    Reply
  21. romankoav
  22. Sherdrada

    (21) romankoav, спасибо =)

    Reply
  23. Мать Тереза

    «Ребят, вы что тут прикалываетесь что ли? на 1с.proclub.ru есть обработка «Редактор журнала расчетов» и смена периода в нем это скорее 1% функционала! Я бы советовал автору не зарабатывать себе популярность на обработке написание которой занимает менее 30 минут.»

    Ребята не надо критиковать ,мне здорово пригодилось, автор старался, между прочим и для нас тоже. была скачана -осталась на работе обработочка, а дома поработать взялась и другие обработки не понравились, пусть я потеряю денюшку ,н оскачаю второй раз и воспользуюсь тем ,что мне очень понравилось.

    Reply
  24. lanSS

    Спасибо!!!

    Reply
  25. lanSS

    +++ спасибо за обработку

    Reply
  26. lanSS

    Завтра будем проверять

    Reply
  27. safia-med

    спасибо помогла

    Reply
  28. Lapitskiy

    супер-полезная вещь, даже ссылался на нее в своей статье про ЗиК: http://infostart.ru/public/313564/

    Reply

Leave a Comment

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