Альтернативный способ выбора интервала дат




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

47 Comments

  1. venger

    Много вводов хороших и разных:-))

    З.Ы. Так просто, каламбурю:)))

    Reply
  2. Altair777

    (1) А вот выводов лучше поменьше, но тоже хороших 🙂

    Reply
  3. Ёпрст

    Как то слишком много контролов…

    с новейшего отчета, как то попроще будет 🙂

    Reply
  4. Stepa86

    на 8ке у меня вот такой выбор периода:

    http://screencast.com/t/rn7GgKsU

    http://screencast.com/t/HG8Yo5xM

    http://screencast.com/t/4L1Pbg4T

    Reply
  5. Altair777

    (3) Зато очень полезные кнопочки по 1 или 10 вперед или назад.

    Честное слово, пригаживалось 🙂 не раз.

    Спасибо, я посмотрю «Новейший» более детально.

    Reply
  6. artbear

    Таких вариантов выбора уже штуки 4 видел.

    Я в свое время, еще в 2004/2005 гг. на базе ВК 1С++ и ФормЕкс сделал спец.класс для 1С++, который для текущей в любых формах, в т.ч. и любых внешних обработках, автоматом при открытии любой формы подменял вызов ВвестиПериод на вызов моей собственной формы.

    Пользователям очень нравилось и нравится до сих пор.

    ЗЫ класс выложен в составе репозитария классов 1С++ на форуме http://www.1cpp.ru

    Reply
  7. Altair777

    (6) Спасибо за напоминание об 1С++

    Очень хорошая штука. Если бы она еще входила в стандартный комплект поставки 1Сv7 было бы просто замечательно.

    Reply
  8. albert

    (4) А на инфостарте он где? 😉

    Reply
  9. artbear

    (4) А чего не выложишь в общий доступ?

    но контролов и у тебя много 🙂

    Reply
  10. Stepa86

    (8)(9) это выбор периода в подсистемах отчетов тиражного (платного) решения, потому в общий доступ выложено не будет… идея дерева вообще из типовых взята, а такая структура обеспечивает выбор нужного периода максимум в 3 клика (в 95% случаев)

    Reply
  11. z-alexey

    (10) классная идея, жаль не выкладываете в общий доступ эту часть

    Reply
  12. albert

    (10) Как хоть продукт-то называется?

    Reply
  13. Stepa86

    (12) http://www.infostart.ru/projects/3226/ а вообще чот мы от темы отвлеклись

    Reply
  14. Altair777

    (13) Не страшно, мне интересно 🙂

    Reply
  15. sytkosa

    (4) Неплохая идея, было бы замечательно еслиб ты это оформил внешней обработкай и выложил бы в общий доступ

    Reply
  16. nickVZ

    Не впечатлило (по скриншотам). Поясняю: лично я с налета не понял, что к чему (подозреваю, что многие юзеры так же тупы): с чего это напротив выбора года стоят чекбоксы «с начала года/до конца года»? Такое же супротив полугодия? Усиливало впечатление пропуск после «месяцев»… Того через десяток секунд сообразил 😉 Может, рамочку добавить, а?

    А вообще, ИМХО, слижком кудряво. Это чисто «эстетическое», «вкусовое» впечатление, так что прошу не гневаться 🙂

    У меня несколько другое решение (идея слямзена у Натальи Васильченко, но переработана): на отчетах псевдокнопки «<<«, «>>», и по жамканью по этим псевдокнопкам определяется тип периода: год, полугодие, квартал, месяц, неделя, десятидневка, произвольно. И соответственно двигаем период…

    Да, такой пример, как в сабже — определиться «произвольным». Но обычно юзеров интересуют «регулярные» периоды 😉

    С уважением…

    Reply
  17. ZyMik

    Итоговая строка описания периода не совсем корректна.

    С начала КАКОГО квартала и КАКОГО года? Это как от забора и до обеда.

    В остальном интересное решение, но несколько перегруженное реквизитами.

    Reply
  18. Stepa86

    (15) уговорил — http://infostart.ru/projects/4180/

    Reply
  19. Abadonna

    Однако суппортовский ВыборПериода() поинтереснее смотрится.

    Reply
  20. MoonAriman

    Понравилось… Только не дорубил работу по галочке «интевал» много галок, они друг друга перекрывают и по непонятным причинам иногда не срабатывают (всмысле стоит запрет на срабатывание), а мне, даже как прогеру, стало лень разбираться, не говоря уж о пользователях. И интерфейс все таки можно было бы не то что посимпатичнее, но хотя бы поаккуратнее. Например совсем не прикольно смотрится слишком близкое расположение полей к нижнему краю и совершенно излишне оставленное расстояние вверху окна. Но в общем, это все мелкие придирки. Мне понравилось.

    Reply
  21. MoonAriman

    Да, и еще к вопросу о интерфейсе. «Кваратал» это тоже надо убрать…

    Reply
  22. Ёпрст

    (20) посмотрите еще на этот вариант тогда…

    http://www.extforms.ru/support/documentation/1-4.php

    Reply
  23. Altair777

    (17) >> С начала КАКОГО квартала и КАКОГО года? Это как от забора и до обеда.

    С начала года начала интервала. До конца года конца интервала.

    Сорри, я думал это понятно. По аналогии ВвестиПериод(). Там понятно? 🙂

    —————————————————————-

    (20) > Только не дорубил работу по галочке «интевал» много галок, они друг друга перекрывают и по непонятным причинам иногда не срабатывают (всмысле стоит запрет на срабатывание)

    Начало года перекрывает начало 1 квартала и первого полугодия. И т.д.

    Снова подумал, что это логично.

    —————————————————————-

    (21) > Да, и еще к вопросу о интерфейсе. «Кваратал» это тоже надо убрать…

    Почему? 🙂 По аналогии ВвестиПериод()

    —————————————————————-

    (21) > совершенно излишне оставленное расстояние вверху окна

    Скажу по секрету. Т.к. окно модальное, увидеть маленькое рекламное описание нельзя, если в свойствах формы снять галочку «Панель инструментов». В моей рабочей версии она снята. И вверху окна расстояние поменьше.

    —————————————————————-

    Всем спасибо за положительные отзывы. И за критику. Буду улчушать.

    Reply
  24. Altair777

    (24) Если я не ошибаюсь, в виде отдельного куска это не выкладывалась?

    Reply
  25. Abadonna

    (25) Выкладывалось Кушниром прицепом к какой-то разработке. Что-то вроде универсального реестра документа… или фиг его знает.. Было точно у Кушнира, где — не помню

    Reply
  26. Abadonna

    Чего это она два раза запостила? Раз кнопку нажимал…

    Reply
  27. artbear

    Есть очень старый вариант, еще раньше новейшего отчета, давным-давно выложен на проклабе.

    Я именно его аналог использовал в 77 — описал в (6)

    Reply
  28. Abadonna

    (29) Ну я ж и говорю: «сто лет в обед» ;)))

    Reply
  29. MoonAriman

    (23)—————————————————————-

    (21) > Да, и еще к вопросу о интерфейсе. «Кваратал» это тоже надо убрать…

    Почему? 🙂 По аналогии ВвестиПериод()

    —————————————————————-

    КварАтала я чего-то в ВвестиПериод() не видал… Это я про выпадающие меню.

    (24).

    ————————————————————————

    http://www.infostart.ru/forum/messages/forum1/topic9499/message72563/#message72563

    ————————————————————————

    А вот это круто. Хоть и довольно сложно, но кнопками для пользователя полюбому удобнее, чем объяснить ему взаимоисключение галочек, да еще и кнопки наглядно отображают период, который ими выбирается. Интерфейс супер! Реализацию не видел, ничего не скажу.

    Reply
  30. Abadonna

    (31) Купи у Доржи «Новейший отчет» — и увидишь реализацию :))))))))))))

    Reply
  31. Altair777

    (31) А, понял. Переименую. «КварАтал» 🙂

    to Abadonna

    Вообще, моя разработка оказалась полезной. Простые пользователи что-то новое узнали. А не только «монстры» 😉

    Reply
  32. Abadonna

    (33)>Вообще, моя разработка оказалась полезной

    Я где-нибудь утверждал, что она полезная/ не полезная? 😉

    > Простые пользователи что-то новое узнали.

    «Простоые пользователи» продолжали плюсовать мой плагиат на меня же под другим ником, даже тогда, когда я ТРИ раза там написал, что это шутка, и уж если хотите плюсовать, плюсуйте настоящего автора.

    Reply
  33. Altair777

    (34) > Я где-нибудь утверждал, что она полезная/ не полезная? 😉

    Нет, не утверждал. 🙂 Сорри, если показалось что я обвинил в этом.

    А знаете почему я написал такой вариант выбора интервала?

    Работал я в одной фирме. Помимо того, что я был программистом, был еще и администратором БД и занимался аналитикой.

    И очень часто приходилось делать отчет за последовательные интервалы.

    И мне надоело тупо менять 2 даты, это долго и лениво.

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

    Reply
  34. withoutface

    http://www.infostart.ru/forum/messages/forum1/topic9499/message73361/?result=reply#message73361

    Выложил ещё один вариант, имхо, самый лучший 🙂

    Reply
  35. Altair777

    (36) Это называется «выложил»? А где реализация?

    Reply
  36. Altair777

    (38)

    (2) Вот и я о том-жеГда выравнивание? В полях ввода?

    Это стандартная ситауция, когда числа по правому краю, а текст и даты по левому.

    >(2) Вот и я о том-же

    В (2) написано про ВЫВОДЫ. Так Вам хотелось мне минус в отместку влепить, что даже не прочитали как следует? 🙂

    Reply
  37. venger

    (38) vadim_p_volkov, что обиделся маленький, про бюст копипастить — это все что ты можешь?:-))) Это ведь ты был, напомни как мне?:-))

    Reply
  38. Tatitutu

    (41) Выбирайте выражения, когда пишите. Вы здесь не один.

    Reply
  39. Altair777

    (41)

    > На дрочливых на бюсты я не обижаюсь.

    Вау! Так Вы еще и ущемленный 🙂

    Кстати, про бюсты это Вы запостили сомнительную статейку, которую потом Администрация удалила.

    А вы попробуйте поле ввода Числа выровнять по левому краю. Без ВК 🙂

    > А у тебя даже панель в глаза кидается.

    Про какую панель речь идет? Инструментов? А коммент (23) Вы читали?

    Не осилили? 🙂

    Reply
  40. venger

    (41) Нет уж, лучше скажи все что думаешь, будь мужчиной:-))) Прилюдно так сказать:-)))

    Reply
  41. Tatitutu

    (46) !!! Уважайте форум и автора разработки -Altair777

    Вам бы понравилось если в подъезде у вашей двери каждый….

    писал бы vadim_p_volkov=()() ?

    Вы уже надоели флудить. Сайт не той тематики выбрали.

    Все и всем. комментарии только по существу данной обработки.

    Reply
  42. venger

    (46) Что будем в следующий раз копипастить (после бюста)?:-))) Да и чужое ты любитель был выложить и не раз, и автора, работу которого использовал обгадить:-)) Вот тебе скриншот одного из твоих шедевров, например: http://www.infostart.ru/upload/iblock/0ce/opisalovo.jpg

    Reply
  43. venger

    (51) Не путайте с Вашими грехами:-))) Советую как бы уже успокоиться — ибо еще и на бан можете заработать….

    Reply
  44. Altair777

    (51)

    to vadim_p_volkov

    Как Советник Администрации я предупреждаю Вас о существовании «Правил и законов ИС».

    http://infostart.ru/about/laws/

    Reply
  45. aleg

    Мне пригодилась. Бухгалтер требовала как раз что-то подобное, я ей подсунул такой вариант, она его немного еще переиначила, буквально, несколько строк кода, украшательства по требованию — и счастливый и спокойный бухгалтер. Хотя, сам, пользуюсь всегда исключительно стандартным выбором временного интервала.

    Reply
  46. Altair777

    (54) что-то я не заметил плюсик 😉

    Reply

Leave a Comment

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