Вертикальное меню




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

    Взято из Розницы?

    Reply
  2. bnw

    Да и доработано под прочие конфигурации

    Reply
  3. А автоматический запуск можно сделать без ковыряния конфигурации?

    Reply
  4. Serj1C

    (3) Да. Для этого есть параметр коммандной строки /Execute<ИмяФайлаОбработки>

    Reply
  5. Арчибальд

    А скрины зачем дублировать?

    Reply
  6. bnw

    А куда этот параметр надо вставить, чтоб запускать автоматически? Можно поподробнее…

    Reply
  7. Забацал две свои системы!

    Блин абалденная штука!

    Респект и уважуха!

    Reply
  8. (6)

    А куда этот параметр надо вставить, чтоб запускать автоматически? Можно поподробнее…

    У меня вот так:

    D:db1cv81in1cv8.exe ENTERPRISE /FH:1cv81datacomplex /ExecuteH:1cv81epfВертикальноеМеню.epf

    Reply
  9. Отправил снимок результата клиентам в рассылку. Сразу очередь выстроилась на заказы ))

    Reply
  10. Есть идея по ее развитию.

    В это обработке логика программистская.

    А лучше логика пользовательская.

    т.е. группировка объектов не по типам объектов (документ, отчет, обработка), а по функциям.

    К примеру функции управления заказами:

    1. Документ Заказы покупателей

    2. Обработка Менеджер заказов

    3. Отчет Дебеторка

    Ну это так. Фантазии 🙂

    Reply
  11. Evg-Lylyk
  12. rasswet

    из розницы вытащено?

    Reply
  13. seermak

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

    Reply
  14. еще бы сюда добавить функцию подключения внешних обработок и отчетов.

    тогда было бы просто шикарно )

    Reply
  15. lord_soth

    хорошая штука

    Reply
  16. aavolkoff

    Гы-гы. Там мои копирайты 🙂 И где авторские отчисления за обработку???

    Кстати, когда я писал «Розницу», сначала это было не «Вертикальное меню», а рабочий стол с отображением в правой верхней части списка объектов и в правой нижней — свойств активного объекта и табличных частей (свойства объектов отображались в виде дерева с ссылочным вложением до 3-х уровней на 1-ой вкладке, на остальных вкладках — табличные части).

    Причина почему пришлось сократить мощную и мегаюзабельную обработку до «вертикального меню» — Надуманные постулаты разработки 1С, одним из которых является то, что если в платформе есть отдельные формы списков и объектов, то нефиг их заменять… и вообще рабочие столы мы не используем 🙂 Через год после этого презентовали управляемое приложение 🙂

    Reply
  17. JohnnySE

    хорошая штука — взял в работу. Спасибо

    Reply
  18. fomix

    Вполне может заменить «Рабочий стол». Спасибо! Теперь надо думать как управляемую форму прикрутить…

    Reply
  19. Программулькин

    такой вариант не сильно удовлетворил, вот тебе идея для дальнейшего развития: сделай лентой (тобишь горизонтально), как в в офисе 7м, в винде 8й. С картинками и и.д.

    Reply
  20. aavolkoff

    (18) fomix,

    В 8.2.13 у меня не получилось прикрутить управляемую форму к вертикальной менюшке (без внешних обработок и прочего, т.е. в лоб) там много заморочек… Кстати — вертикальное меню очень хорошо расширяется до собственных списков и форм объектов (что и юзаю, чтоб типовую УПП не «крошить»).

    Reply
  21. nickkey

    Спасибо автору идея хорошая ну мы то верим что нет предела совершенству много чего можно добавить очень согласен с Программулькин’ым было бы совсем шикарно :))) удачи в новых творениях и полетах мысли и да прибудет с тобой сила :)))

    Reply
  22. SanyaGrek

    Беру! Автору респект. И +

    Reply
  23. aavolkoff

    Спасибо, за респекты 😉 А еще лучше — вся «Розница 8» целиком 🙂

    Reply
  24. sergnik

    Автору спасибо, посмотрим, попользуемся. А еще творческого роста и новых публикаций

    Reply
  25. kiba

    Лучшая реализация из всех, которые я видел. Респект! Пользователи довольны!

    Reply
  26. lees

    Для меня интересна сама реализация такого меню, она(реализация) мне пригодится когда придется делать рабочие места менеджера, диспетчера и др.

    Reply
  27. Alis95

    Спасибо. Инересная штука, нужно будет попробовать.

    Reply
  28. yuraos

    ааабажаю всякие интерфейсные фишки, менюшки, панельки!

    Reply

Leave a Comment

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