Двоичный Файл в Текстовый файл 8.2




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

21 Comments

  1. cool.vlad4

    А зачем это все? Какой смысл в этом? На скринах явно видно, что пишется в Base64, но в публикации об этом ни слова .

    Reply
  2. shmellevich

    (1) cool.vlad4, как вариант может пригодится при работе на сервере терминалов, когда открыт только буфер обмена и только перенос текста, тогда можно воспользоваться таким способом конвертации каких либо файлов в текст, перенос на сервер и там обратно превращать в нужный файл 😉

    Reply
  3. Rothschild

    (2) shmellevich,

    а какой смысл конвертации ДД в текст для передачи ???



    вроде бы двоичные данные непосредственно можно передавать с клиента на сервер

    Reply
  4. shmellevich

    (3) Rothschild, «при работе на сервере терминалов» ситуация, когда нужно перенести произвольный файл из своего рабочего ПК на сервер терминалов (не сервер, который платформа 1С), какой может быть клиент-сервер если вы находитесь в разных сетях, тем более закрытых друг от друга, и еще хуже на сервере терминалов отключен выход в интернет, а есть только открытый буфер обмена.

    Как вариант реализации, а точнее расширение ее функционала, добавить еще окошко для ввода и вывода текста на конвертацию.

    Reply
  5. cool.vlad4

    (4) shmellevich, какие-то надуманные проблемы. если сеть моя — я себя обеспечу и блэкджеками и шлю*ами, если не моя, я скажу, чтобы меня обеспечили. а работать, создавая себе какие-то бредовые трудности — это самого себя не уважать.

    Reply
  6. cool.vlad4

    (4) shmellevich, вы еще скажите, что http передавать через буфер обмена, раз там интернета нет.

    Reply
  7. shmellevich

    (5) cool.vlad4, Я тоже когда то так думал, когда сам с своих руках все держал. Но на практике бывают самые разные ситуации, и нет желания ждать несколько дней, когда среагирует аутсорсинговая контора, шоб обеспечили нужным набором благ… так шо если у вас всегда все необходимое имеется, я за вас только рад.

    Reply
  8. andrewks

    (1)(3) полностью поддерживаю предыдущих ораторов.

    (7)

    http://foxtools.ru/Base64

    работает без 1С

    Reply
  9. ddens

    Коллеги, это всего лишь мелкий инструмент, и мне несколько раз приходилось им пользоваться, при решении основных, первостепенных задач…

    как минимум нас двое (я и shmellevich), кто не считает его бессмысленным..

    был бы инструмент, а уж применение найдётся! 😉

    Reply
  10. cool.vlad4

    (9) ddens, ну ок. только 1С не самое лучшее решение. какой-нибудь notepad++ (к тому же бесплатный и существующий в портативном виде) лучше подходит под озвученное решение некой задачи http://wingloon.com/2008/10/28/base64-decode-encode-using-notepad/ .если же файл огромный (несколько гигов), то notepad++ не подойдет…но так 1С тем более.

    Reply
  11. andrewks

    (10)

    если же файл огромный (несколько гигов), то notepad++ не подойдет…но так 1С тем более.

    хотел бы я посмотреть на винду, когда base64 представление несколькигигового двоичного файла будет пихаться в буфер обмена 🙂

    Reply
  12. cool.vlad4

    (11) andrewks, это я так подкалываю)))

    Reply
  13. ddens

    (10) cool.vlad4, в тот момент мне проще было написать эту обработку в три строчки, чем искать что- то подобное в сети

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

    Reply
  14. ddens

    A! Я понял к чему вы клоните…

    Граждане, Как опубликовать бесплатную публикацию?

    Reply
  15. Rothschild

    (14) ddens,

    Фиг его знает!

    Я б некоторые файлы тоже бы предпочел бесплатно выкладывать

    как ссылка для скачивания в тексте статьи.



    В настройках файлов к статье есть цена файла,

    с переключателем с возможных значений, который

    (покрайней мере для простых смертных)

    состоит из одной, заботливо выбранной опции: «1 старт-маня (рекомендуется)»

    Reply
  16. Rothschild

    (15)

    Докопайся до техподдержки, если добъешься чего —

    — надеюсь, поделишься с коллегами.

    🙂

    Reply
  17. Антон Ширяев

    Когда я работал во франче один раз довелось столкнуться с такой проблемой и я подробно описал этот метод во внутренней базе знаний франча.

    Идея в том, что на терминале нет ничего стороннего и скачать на него ничего нельзя, но есть 1С и написав простенькую обработку из пары строк получаем нужные данные без особых проблем.

    Таскали через терминал кусками мегабайт по 5 даже большие cf-ники.

    (0) Автор не из ЭР случаем?

    Reply
  18. ddens

    (17) Антон Ширяев, Спасибо ;-)… не, не знаю что такое ЭР… я из Иркутска, про ЭР ничего не слышал. 😉 тоже много лет проработал в местном франчайзи…

    Reply
  19. ddens

    (15) Rothschild, задал вопрос модератору — ответили что сейчас возможно только два варианта публикации за см и за рэ.

    цитирую:

    Здравствуйте! У нас сейчас есть только два варианта — выложить файл за стартмани (загрузив на закладке Файлы) или за рубли (тогда нужно заполнить закладку Магазин, прикрепить платную программу туда, полностью оформить публикацию — описание, скриншоты и заключить договор с нашим отделом продаж, позвонив 8-800-5555-256, звонок по России бесплатный)

    Reply
  20. cool.vlad4

    (14) ddens, не, не поняли. она и задаром не нужна, честно говоря. ну кто будет искать в интернете эту обработку, когда быстрее самому написать аналогичных 2-3 строки кода)))

    Reply
  21. ddens

    (20) cool.vlad4, ошибаетесь, коллега — целых 3 скачивания! …кому-то все же в облом эти несколько строк в конфигураторе.. 😉

    Reply

Leave a Comment

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