Календарь(Памятка)




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

42 Comments

  1. larisab

    Приятная штучка:-))) Кнопку закрыть на форму бы и крестик в правом верхнем углу.

    Reply
  2. anna74

    Мне тоже нравится. Только не позволяет редактировать дату, если вдруг хочется перенести заметку на другой день.

    Reply
  3. larisab

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

    Reply
  4. anna74

    Не помогло. Все другие ячейки открываются для редактирования, а дата — нет.

    Reply
  5. larisab

    А ты новый элемент создавай, он автоматом становится

    Reply
  6. anna74

    Мне не нужен новый. Я хочу в старом дату исправить))

    Reply
  7. larisab

    При переходе с одной даты на другую показывается свой список дел на этот день, как если бы это были закладки в екселе:-))) заполняй, добавляй, удаляй, время можно редактировать, по моему все «юзабилити»

    Reply
  8. anna74

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

    Reply
  9. larisab

    Да ты права, пожелания автору:-)))

    Reply
  10. vasiliy_b

    Выложил, с учетом Ваших пожеланий.

    Reply
  11. vasiliy_b

    Кстати забыл сказать там еще можно цвет текста, и фона менять, для каждой записи

    Reply
  12. larisab

    Гут, еще пожелания: сделать обработчик на дате ПриИзменении, сделать скриншоты, побольше описание и будет загляденье. Бухам удобно там занести даты сдачи отчетности и держать поближе.

    Reply
  13. anna74

    (10) Спасибо. Дата редактируется. Еще бы цвет фона и текста вынести на панель кнопок. Тем более, что в контекстном меню некоторые функции почему-то дублируются.

    (12) Сроки сдачи отчетности бухгалтеры помнят наизусть!.. Это для более мелких дел. Типа «акт сверки с тем-то поставщиком» и переносить со дня на день, пока не добьешь этого поставщика))

    Reply
  14. vasiliy_b

    (12) А зачем обработчик на дате?

    Reply
  15. CheBurator

    (12) не изобретайте лисапед! существует (еще в 7.7) ШТАТНО календарь бухгалтера — где все даты сдач отчетности распианы и куда… (франчи — позор 1цэ $-)

    .

    Reply
  16. larisab

    (14) Ну как — поменял дату, при нажатии enter, строка перешла на другую дату, удобно

    Reply
  17. larisab

    (15) Да знаю про штатный, туда еще лезть надо, а тут висит перед носом, да и не только отченость интересует (13)

    Что значит «(франчи — позор 1цэ $-)» в данном контексте?

    Reply
  18. vasiliy_b

    (16) а если вы ошибетесь датой или Вам еще понадобится поменять чутка текста?

    Reply
  19. larisab

    (18) Пока сказать ничего не могу, вечером попробую сделать, как я хочу, если получится выложу текст:-))))

    Reply
  20. seermak

    Я бы добавил в поле даты:

    Процедура ТаблицаЗаметокДатаОткрытие(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ЭлементыФормы.ПолеКалендаря1.ТекущаяДата = Элемент.Значение;

    КонецПроцедуры

    и еще в Процедура ВывестиОтборПоДатам(ВыделенныеДаты = Неопределено)

    заменил бы цикл

    на

    Для каждого СтрокаОтбора Из НайденныеСтроки Цикл

    НоваяСтрока = ТаблицаЗаметок.Добавить();

    ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаОтбора);

    КонецЦикла;

    Reply
  21. larisab

    Процедура ТаблицаЗаметокДатаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

    Отбор = Новый Структура();

    Отбор.Вставить(«Дата»,ВыбранноеЗначение);

    НайденныеСтроки = ВсеЗаметки.НайтиСтроки(Отбор);

    Если НайденныеСтроки.Количество() > 0 Тогда

    Для Сч = 0 По НайденныеСтроки.Количество()-1 Цикл

    НоваяСтрока = ТаблицаЗаметок.Добавить();

    ЗаполнитьЗначенияСвойств(НоваяСтрока,НайденныеСтроки[Сч]);

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры

    Reply
  22. larisab

    +(21) Добавить еще одну процедуру для «растаскивания» по датам.

    Процедура ТаблицаЗаметокПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)

    ВывестиОтборПоДатам(ЭлементыФормы.ПолеКалендаря1.ВыделенныеДаты)
    \

    Reply
  23. lavalex

    Штучка прикольная, а как на счет напоминалки???

    Reply
  24. vasiliy_b

    Уже думаю над этим… руки пока не дошли.

    Пока придумал проигрывать мелодию при наступлении времени.

    и выводить сообщение….

    Может у кого еще какие идеи есть?

    Reply
  25. sensey

    может с фоном добавить такую фигню, что автоматом при добавлении фон красныЙ, а когда ставишь галочку «выполнена», меняется на зеленый))

    Reply
  26. vasiliy_b

    Я думал реализовать фильтр по выполненным. Т.е убирать их из списка если устанавливаешь что, задача выполнена.

    Reply
  27. larisab

    А если невыполнена, то на следующий день чтоб переносила.

    Reply
  28. Шёпот теней

    гыЫыыы… до «безобразия» приятная штука вов всех отношения…. аж «жаба» давит….

    ВоОоТКаКдАвИт….

    Reply
  29. Душелов

    Эх… Посмотрел, взгрустнулось… Вспомнил про http://infostart.ru/projects/3683/

    Reply
  30. specialist

    Просьба, добавить на панель кнопки:

    — «Отбор по назначению в текущей колонки»

    — «Отбор и сортировка»

    было бы классно!

    С уважением!

    Reply
  31. tossik

    Спасибо. Вообще таких штучек много есть, тот же to-do. Но эта приятна тем, что встроена может быть в 1С. Правда, я не знаю, как сделать, чтобы она автоматически запускалась при запуске 1С.

    Reply
  32. seermak

    (31) самое простое — в модуле приложения в: Процедура ПриНачалеРаботыСистемы()

    Reply
  33. AlexandrCh

    Пользуюсь данным календарем — очень нравится.

    Для полного удовольствия не хватает отбора и сортировки (26) (30) по колонкам.

    Что-то сообщений по теме нет давно — наверно никто и не ответит…

    Reply
  34. vasiliy_b

    обновил обработку, скачивайте.

    Добавлен отбор по тексту, выполненным задачам, не выполненным задачам.

    Reply
  35. AlexandrCh

    (34) Спасибо за доработку — очень пригодится! За оперативность плюс!

    Если будет желание дорабатывать, то можно было бы добавить дополнительное поле — для обобщения задач по Темам (например: Поставщики, Покупатели, УТ, БП, ЗУП… — все что угодно), чтобы из списка можно было выбирать и добавлять в него новые темы и отбор по ним делать.

    При удалении записи чтобы запрос выводил, а то случайно можно удалить и не восстановить.

    В УТ есть Задачи с оповещением, но они подходят для постановки задач другим пользователям и нет календаря. А этот календарь самое-то для персонального использования (кроме заданий я еще табель в нем веду) — супер!

    Reply
  36. БарсиК

    У меня вопрос — а можно здесь оформить повторение события в определенный период с определенной периодичностью? Например, мы заключаем договор с организацией на год на услуги автостоянки и в конце каждого месяца должны выписывать счет. Я бы завела события в первый месяц, а потом скопировала бы на конец каждого месяца в период действия договора.

    Спасибо) Очень надеюсь на ответ, хоть и вижу, что дискуссия датируется, аж, 2009-м((

    Reply
  37. AruslanM

    Спасибо. Удобно использовать в работе. Возможно ли переносить вчерашние невыполненные заметки на сегодняшний день автоматически?

    Reply
  38. lady_lace@mail.ru

    Спасибо удобно в работе

    Reply
  39. fuxic

    Как развитие переделывал сразу после публикации, но так и не отписался в этой ветке

    Подсистема «Заметки». Идея используется до сих пор

    Reply
  40. specialist

    на 8.2 можно?

    Reply
  41. avtokratorWT

    Можно, но нужно переносить ручками… сейчас что-то подобное делаю в 8.2, но для себя… тут выложу…

    Reply
  42. vlanik

    Приятный календарик, еще бы автоматизировать перенос заметок — цены бы ему не было.

    Reply

Leave a Comment

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