Ведение локального каталога обработок с Инфостарт




Принцип обмена данными из 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. vano-ekt

    а мою обработку по управлению заказами и публикациями выпилили ссылаясь на п 5.2.4, 5.2.9

    Reply
  2. nomadon

    (2) дык в этой публикации не парсинг, а просто переход по ссылке и работа с локальными файлам

    Reply
  3. nomadon

    а вообще хорошо бы в git что бы хранилось:

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

    а потом прекомитом разбирается все это на исходники и поиск контекстный по коду работает)

    Reply
  4. rpgshnik

    (4) По поводу git, подумаю)

    Reply
  5. Totoro

    Достаточно иметь я-диск (или другое хранилище) со структурированными каталогами по номерам публикаций. Искать и пользоваться удобнее на инфостарте (как минимум из-за тегов и фильтров).

    P.S. С git интересная идея

    Reply
  6. RailMen

    Автор явно тяготеет к одной актрисе. 🙂 Жаниться тебе надо, боярин…

    Reply
  7. rpgshnik

    (7) 😉

    Reply
  8. GreenDragon

    (8) Да вы прям все тут молодцы! И Александра, душенька, хороша как всегда, и обработка просто великолепна!

    Reply
  9. rpgshnik

    (9) Спасибо!

    Reply
  10. Sintson

    (7) С языка снял 🙂

    Reply
  11. rpgshnik

    (12)

    Reply
  12. panvartan

    Если бы движок этого сайта не был бы таким кривым и убогим, то подобный функционал был бы в личном кабинете

    Reply
  13. user820666

    Потрясающая вещь! давно искал такой инструмент для порядка своих отчетов и обработок, автору — низкий поклон!

    Reply
  14. evgefremov

    можно добавить группировку обработок помимо избранного?

    Reply
  15. rpgshnik

    (17) На данный момент нет

    Reply
  16. kadild

    Ждем следующую серию публикацией с обложкой с лысым из браззерс.

    Reply
  17. rpgshnik

    (19) спасибо за идею! ТОЧНО!)))

    Reply
  18. ekaruk

    (4) Гит это классно.

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

    Аудитория Инфостарта с аудиторией Гита не очень пересекается, но все-таки.

    Reply
  19. nomadon

    В битбакете приватные репо бесплатные например

    Reply
  20. Alex1Cnic

    Отличная работа, мне понравилось

    Reply
  21. rpgshnik

    (24) спасибо

    Reply
  22. user757186

    (21) git бесплатен. Приватные репозитории на github — платные. Приватные репозитории на gitlab — бесплатные

    Reply
  23. Alias

    Небольшие комментарии (плюсы, минусы и развитие) после начала использования:

    1. Контекстное меню «Переименовать» — не нужно, это лишние клики мышкой. Интуитивно переименование гораздо проще непосредственно в списке, с помощью F2. Для этого нужно снять с колонки Наименование галку «Только просмотр«. А чтобы при этом выбор отрабатывал как положено (без входа в режим редактирования строки) — установить СтандартнуюОбработку=Ложь в событии Выбор.

    2. Модальные окна (в том же переименовании) — атавизм… Через ПоказатьВводСтроки кода получается столько же, но работает без ошибок и лишних сообщений о несовместимости.

    3. Отсутствие пункта «Изменить форму» в кнопке «Ещё» — непонятно. Возможность кастомизировать форму под себя всегда есть хорошо, это штатная возможность платформы, зачем её отключать?

    4. В тонком клиенте работает ничуть не хуже чем в толстом, не понимаю зачем эта приписка («Запуск через толстый клиент»). Полученное ИспользуемоеИмяФайла всё равно используется на клиенте, так что упоминаемый «серверный вызов», использованный для его получения, не мешает работе и в тонком клиенте.

    5. Про группировку говорили, я скажу про тэги. Было бы весьма удобно иметь возможность удобного тэгирования обработок и, соответственно, отбора по тэгам. Кажется что применённое хранение данных в XML позволит сделать это с лёгкостью.

    6. Жалко что Инфостарт не разрешает парсинг 🙂 возможностей по улучшению было бы гораздо больше (хотя кто мешает доработать, но не выкладывать официально, так ведь?)

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

    Reply
  24. Alias

    8. Значение каталога лучше один раз в ПриОткрытии закэшировать в переменной, чтобы не дёргать сервер каждый раз для его получения (при обновлении, при открытии каталога).

    Reply
  25. pentanom
    Чтобы у вас заработало отображение статей с Инфостарта в обработке, необходимо установить:

    Internet Explorer 10 и выше версии, и добавить запись в реестр ОС (благодарю за решение Вадима Стельмаха).

    4.1. Идём в реестр: HKCUSoftwareMicrosoftInternet ExplorerMainFeatureControlFEATUR E_BROWSER_EMULATION

    4.2. Добавляем 1cv8.exe — REG_DWORD — 11001

    Все сделал, но не работает 🙁

    У меня Internet Explorer 11

    Reply
  26. rpgshnik

    (29) хм… странно, должно работать.

    Я подобный глюк словил дома, сделал всё то же самое. И так и сяк, но потом само заработало.

    Честно я не понял логику, а на компе где разрабатывал — сразу заработало.

    Причем Вадим Стельмах именно для IE 11 давал рекомендации, а у меня стоит 7-ка по этому проверял на IE 10.

    Reply
  27. pentanom

    (30)Может быть у меня что-то в настройках самого IE 11. Вылезает окно с сообщением — «На этой странице произошла ошибка сценария».

    Reply
  28. rpgshnik

    (31) да то же лучше всё разрешить в нём. Я вот искал способ можно ли использовать допустим хром но не чего не нашел. Только IE(((

    может помогут ссылки:

    http://www.appius.ru/support/faq/31/788/ <- это я точно делал

    http://www.forum.mista.ru/topic.php?id=586871

    Reply
  29. pentanom

    (32)Вроде бы сделал все, что в ссылках, но не помогло 🙁

    Reply
  30. rpgshnik

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

    Почему не отрабатывает… я тут не селён. Но в обработке через контекстное меню можно открыть во внешнем браузере по умолчанию который установлен в винде.

    Собственно тема где мне помогли — https://forum.infostart.ru/forum9/topic178893/

    Reply
  31. necropunk

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

    Reply
  32. pentanom

    (34)В реестре у меня то, что на картинке. Кажется все написано правильно.

    Reply
  33. gradi

    (21)на gitlab приватные репозитарии бесплатно даются.

    Reply
  34. rpgshnik

    (35) Попробую реализовать.

    Reply
  35. necropunk

    (38) А это справочник? Там недостаточно просто иерархию включить?

    Reply
  36. rpgshnik

    (39) нет это список, это внешняя обработка, которая все данные хранит во внешнем xml рядом с собой

    Reply
  37. rpgshnik

    (36) Привет, Ильдар. Ну вот и у меня проблема выросла.

    Мне установили на работе windows 10, и так же не получилось не чего.

    Решение проблемы простое, на windows 10 другое название exe файла.

    Не 1cv8.exe а правильно 1cv8с.exe

    4.1. Идём в реестр: HKCUSoftwareMicrosoftInternet ExplorerMainFeatureControlFEATUR E_BROWSER_EMULATION

    4.2. Добавляем 1cv8с.exe — REG_DWORD — 11001

    Reply
  38. pentanom

    (41) Спасибо ! Работает.

    Reply
  39. pentanom

    (0) А можно ли сделать иерархический список ?

    Reply
  40. rpgshnik

    (43) я подумаю,чуть позже…

    Reply
  41. b-dm

    Я как то так и не понял, это обработка, ок, а нужно постоянно коннектиться к сайту инфорстарта ? То есть в данной публикации только идёт закачивание инфы с сайта, базы в которой бы это хранилось тут нет ?

    Reply
  42. rpgshnik

    (45) вот допустим есть у вас обработки с сайта. В количестве 20 шт. Хотите иметь к ним удобный доступ, тогда формируете каталог как написано в описание и данную обработку кладёте в корень. База хранения информации об обработках кладётся в XML рядом с обработкой автоматически. Нет зависимости от конфигурации, чисто внешняя обработка со своей «базой» в виде XML и каталога папок windows с вами скаченными обработками. Вы можете отмечать в ней вести свой рейтинг избранного.

    Reply
  43. b-dm

    То есть нужно в подпапке Инфостарт создать подкаталоги с номерами публикаций ?

    «старые не перезатИраются» — поправьте

    «дополняется только новыми папками из корНевого каталога»

    Не очень понятно в случае того , если я использую не браузер IE, а Гугл Хром, например.

    Reply
  44. b-dm

    И туда же закинуть сами файлы обработок ? То есть они не качаются с сайта Инфостарт ? А как быть , енсли, например. версия обработки обновилась ?

    Reply
  45. rpgshnik

    (48) Если бы они качались, это бы противоречило правилам данного сообщества.

    По правилам сообщества вы обработки можете скачивать бесплатно в течение месяца с момента первой скачки.

    Моя обработка лишь — обеспечивает порядок, ведения своего личного каталога.

    Reply
  46. rpgshnik

    (47) У обработки есть возможно открыть описание внутри обработки (в данном случае использует IE), а так же возможность открыть во внешнем браузере по умолчанию в системе — допустим гугл хром. На скриншоте виден пример в публикации.

    Reply

Leave a Comment

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