Выбор периода в один клик




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

18 Comments

  1. sytkosa

    Ну первое пожелание это чтоб на форме можно было видеть какой период дат уже выбран… можно еще год в виде списка или меню на статик навесить, и добавь кнопку выбора произвольного периода. А так плюс за старание

    Reply
  2. Tatitutu

    недавно такая обработка была — более продвинутая.

    там больше функционала было.

    как выбрать период с 13.06.09 по 27.06.09 к примеру за один клик?

    Reply
  3. Re:аниматор

    (4) хе, одновременным нажатие 2х мышек 1 кликом синхронно) разве у вас подключена всего одная мышка? 😉

    Reply
  4. marat_n

    (1) при нажатии на год, он сбрасывается на текущий.

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

    произвольный период добавить не сложно, но также как и с текущим периодом тут дело в лишней кнопке на интерфейсе, поэтому если необходимость есть, то добавлю и выложу отдельным вариантом.

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

    Reply
  5. Altair777

    Прикольно, моя разработка вызвала целую бурю новых вариантов 🙂

    http://infostart.ru/projects/4172/

    Reply
  6. marat_n

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

    http://1c.proclub.ru/modules/mydownloads/personal.php?cid=111&lid=4965

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

    а вот подсветка не текущего года красным — хорошее добавление.

    Reply
  7. marat_n

    (7) нет, не твоя 🙂

    Reply
  8. Evg-Lylyk

    (0) Хорошо бы было к проекту ( http://infostart.ru/projects/4180/ ) добавить как доп. закладку

    Reply
  9. marat_n

    (10) ну это к тому товарищу, а я не против.

    Reply
  10. slawa

    http://infostart.ru/projects/1149/

    В этой разработке используется, такое же решение но повернутое на 90град. (ИМХО — это даже удобнее)

    Думаю тут оно и было придумано, а остальное — плагиат 🙂

    PS

    Можно скачать демо-версию и убедиться.

    Reply
  11. artbear

    (12) Самый первый вариант был у автора Слава Загайнов —

    ссылка http://1c.proclub.ru/modules/mydownloads/personal.php?cid=111&lid=3188

    Аж с 1999 года 🙂

    Лично я с 2002 ей пользуюсь.

    В (8) его же разработка, но уже для 8

    Reply
  12. marat_n

    (12) я дал ссылку на обработку для 8 от марта 2007, в (13) можешь глянуть для 7, обновлена последний раз в 2004.

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

    т.ч. кто у кого идею взял еще вопрос, а плагиат, кстати, на идею не распространяется 🙂

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

    Reply
  13. gaz-polutorka

    Извиняюсь за свою некомпетентность, но как подключить это дело к 1с?

    Reply
  14. idef

    (15) Извиняюсь, а вы программист?

    Reply
  15. gaz-polutorka

    Нет, я рядовой user=))

    Reply
  16. idef

    (17) тогда лучше обратитесь к программисту

    Reply
  17. z-alexey

    Ваша обработка вошла в состав УЛФин — Бесплатная конфигурация для Управления Личными Финансами в 1С 8.1

    Пока только в одном отчете: «Сводный отчет по расходам». В форму выбора периода вниз добавил активную ссылку на Вас с копирайтом.

    Если Вы против использования, пожалуйста, сообщите — мы исключим ее из состава конфигурации.

    Reply
  18. marat_n

    (19) Абсолютно не против, даже наоборот. Используйте где хотите и как хотите.

    За ссылку спс.

    Reply

Leave a Comment

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