MiracleV8: ВК для 1cv 8.1 и 1cv 7.7




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

44 Comments

  1. Душелов

    (0) >НЕ потребуется установленный Microsoft .NET Framework 2.0, так что качать его не надо 😉 [Душелова беззлобно подколол]

    Ага-ага 🙂

    Reply
  2. Душелов

    Даешь не и т.д., а полный список бантиков! 🙂

    Reply
  3. Abadonna

    (2) Список бантиков я тебе мылом кинул. 😉 Вот там бантики так бантики, можно сказать даже петля :))))))))

    Reply
  4. Yashazz

    Симпатичные бантики! Буду пробовать!

    Несколько не в тему, но раз уж речь о бантиках…

    Уважаемые коллеги, а думал ли кто-нибудь из вас над задачей улавливания события пользовательского прерывания — с тем, чтобы при Ctrl+Break генерилось некое событие и, возможно, с переходом к продолжению прерванного?

    Reply
  5. Abadonna

    (4) Как два байта отослать! 😉

    Reply
  6. coder1cv8

    (4) Уже реализованно 🙂

    http://infostart.ru/projects/1721/

    Reply
  7. Душелов

    (6) Прервать-то прервешь, а продолжить? 😉

    Reply
  8. Душелов

    (3) Бантики и рюшечки… И масочки… 🙂

    Reply
  9. JohnyDeath

    (3) Аркадий, а ты по какому принципу бантики рассылаешь?

    Reply
  10. Abadonna

    (9) По принципу ст. 146 УК РФ :)))

    А то некоторые не полностью допонимают

    Reply
  11. Olga_siberia

    слушай ничего себе штучка, забавная,а собачка то твоя???

    Reply
  12. strah4

    А реализация считывания значения если в ячейке формула среди бантиков случайно не присутствует? А то у меня тут план БДР надо считывать, там формулы половина и текущая схема от Душелова(большущее ему, кстати, человеческое спасибо, сильно выручает!!!) считывает только пустую строку, можно конечно вручную выделять, копировать и специальной вставкой вставлять назад только значения, но этож юзерам делать, а у них всегда что-нибудь не так, я же в конкретных локациях бываю нечасто. Разобраться и попробовать свое написать конечно можно, но я и так второй месяц без выходных почти.

    Reply
  13. Abadonna

    (12) Составил табличку, в первой колонке 1..6, во второй формула — первая в квадрате. Все значения считала…

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

    Восхищён…

    воооот….

    Reply
  15. strah4

    Спасибо!!! Буду пробовать!!!

    Reply
  16. vasilykushnir

    Библиотекой пользуюсь давно — очень выручает, когда поставщики высылают прайсы екселевские в формате «кто в лес, кто по дрова…»

    Reply
  17. JohnyDeath

    Таки вынудили скачать )))

    Reply
  18. Abadonna

    Кто это Вас, молодой человек, вынуждал? ;)))

    Reply
  19. JohnyDeath

    комменты… комменты..

    Reply
  20. vasilykushnir

    Только одно замечание, даже не замечание, а так… походу (не путать с по…!) — криво читает Excel-5.0

    Может выслать дла пробы образец?

    Reply
  21. Abadonna

    Отстань! 😉 Уж ежели воруете ёксель — воруйте хотя бы ХР, 2003

    Reply
  22. vasilykushnir

    (21) Мне присылают в формате Е5.0 !!!

    А мы не воруем — просто временно пользуемся…

    Reply
  23. Altair777

    (22) «Просю выдать литр самогона во временное пользование» 🙂

    х/ф «Зеленый фургон»

    Reply
  24. Abadonna

    Совершенно случайно обнаружил! (не знал до этого). Если установить на окно

    SetLayeredWindowAttributes, то даже при параметре прозрачности 255 (полностью непрозрачно) это окно НЕ ВИДИТ RAdmin, никакие SpyScreenShot-ы тоже! Так что особо «зашифрованные» могут побаловаться написанием программы, которая, например, установит этот атрибут на все окна, кроме 1С :)))

    Reply
  25. Abadonna

    +(24) Уточнение, третий RAdmin, говорят, видит. У нас — второй

    Reply
  26. Душелов

    (24) Установить на все, кроме скринсейвера моего 😉 А его пустить в фоне и все 🙂

    Reply
  27. Abadonna

    (26) Ты когда на него клавиши на выход приделаешь? Для использования как приложения, а не скринсейвера

    Reply
  28. Душелов

    (27) Так я сделал.. А потом оказалось, что в старых исходниках… Вот сам и запутался, что свежее, а что нет 🙂

    Reply
  29. Abadonna

    Я не знаю как там у вас на C#, а вот у нас в Дельфи стоит галка «Добавить информацию о версии», спецом для таких забывчивых 😉

    Reply
  30. Душелов

    (29) У меня с версиями все ок… Я просто туда-сюда таскал исходними дом-работа-дом 🙂

    Reply
  31. Abadonna

    (30) Прям как я :)))))))))))))))

    Reply
  32. Abadonna

    Эту спецом на работу не принес 😉

    Reply
  33. Душелов

    Принес, принес… Открыл уже 🙂 Даже чаю себе не налил еще! А уже начал вносить изменения 😉

    Reply
  34. Abadonna

    Нарушил свой принцип — не пихать в 1С что попало 😉

    Добавил метод проигрывания видео-файлов (*.avi)

    Примечания:

    — проигрываются только файлы avi

    — воспроизведение асинхронное (независимое, не тормозящее)

    — при каждом последующем вызове PlaySound, предыдущий экземпляр плейера разрушается

    — воспроизведение осуществляется прямо на форме вызывающего отчета.

    — воспроизведение только в истинном размере медиа-файла, без мастштабирования

    — размер формы автоматически подстраивается под размер файла

    — компонент Дельфи MPlayer очень капризен к установленным кодекам.

    у меня установлен «K-Lite Codec Pack Full 3.65.exe» — работает.

    Версия библиотеки: 1.2.2.1

    Reply
  35. Abadonna

    (34) Сорри, в примечаниях (и ридми) читать не PlaySound, а PlayVideo

    [накопипастил :)]

    Reply
  36. alexeys81@ukr.net

    Библиотечка — просто супер! Теперь для импорта из Excel буду использовать только её, а не OLE!!! Библиотечку можно удобно включить в обработку вот так: в обработке создаём новый макет. Тип макета — двоичные данные. И в процедуре ПриОткрытии() данной обработки пишем что-то типа:

    Папка = СокрЛП(КаталогВременныхФайлов());

    Если Прав(Папка, 1) <> «» Тогда

    Папка = Папка + «»;

    КонецЕсли;

    Компонента = ПолучитьМакет(«Компонента»);

    ПутьКомпонента = Папка + «MiracleV8.dll»;

    Попытка

    Компонента.Записать(ПутьКомпонента);

    Исключение КонецПопытки;

    Попытка

    ЗагрузитьВнешнююКомпоненту(ПутьКомпонента);

    Исключение

    КонецПопытки;

    L = ПолучитьCOMОбъект(«»,»AddIn.MiracleClass»);

    // Переменная L — глобальная переменная данного модуля

    И обработка будет работать в любой системе, не важно есть там или нет этой компоненты!

    Reply
  37. Душелов

    (36) Поздравляю с открытием! 🙂

    Reply
  38. Душелов

    (36) А еще можно использовать http://infostart.ru/projects/2863/

    Reply
  39. Abadonna

    Чёб еще к ней приделать? 😉

    Reply
  40. Inteco123

    Экзель=СоздатьОбъект(«AddIn.MiracleClass»);

    ап=Экзель.ReadXLS(«d:Акт.xls»);

    КоличествоКолонок = Экзель.ColCount();

    {D:ЭКСЕЛЬ.ERT(14)}: Неверное число параметров

    Почему?

    Reply
  41. alexeys81@ukr.net

    А можно полный список бантиков сюда: Aleksander.Shadow@gmail.com

    И вопросик: загружаю файл xls с формулами. На ячейки с формулами ругается вот так: Ошибка в вызове метода контекста (ReadCell): Произошла исключительная ситуация(AddIn.MiracleClass): -7 509.95 is not f valid integer value

    С чем это может быть связано?

    Reply
  42. Abadonna

    (40)>КоличествоКолонок = Экзель.ColCount();

    {D:ЭКСЕЛЬ.ERT(14)}: Неверное число параметров

    Прошу простить, что поздно ответил. В readme ошибка (в примере всё верно)

    ColCount(НомерЛиста);, RowCount(НомерЛист)

    Reply
  43. Punisher

    Супер. Использую правда для одной небольшой цели. Воспроизведение звука.

    Reply
  44. Abadonna

    Рекомендую качать MiracleV8: Расширенная версия 1.9.6.4

    http://www.infostart.ru/public/59436/

    Reply

Leave a Comment

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