FB2Reader




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

    Интерсно как это можно читать без отрыва от производства? Наврено точнее сказать «почитать незаметно для производства и окружающих», можно ли раскрасить в стиле синтаксиса модуля 1С? 😉

    Reply
  2. СергейКа

    1. Ну и это тоже 🙂

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

    Reply
  3. coder1cv8

    Класс!!!

    Reply
  4. awa

    Проблемы с кодировкой. Файлы в кодировке utf-8 отображает кракозябрами.

    Reply
  5. artbear

    Идея прикольная. +

    Reply
  6. СергейКа

    3) Честно говоря самому не очень нравится из-за невозможности перехода на последнюю прочитанную строку и отсутствия навигации. Но это сделаю в следующей версии на основе html поля а не табличного документа.

    4) Не знаю, кодировку я вообще не трогал. Всё как в системе. Из полутора сотен опробованных книг проблем не было.

    3,4) спасибо за оценку 🙂

    Reply
  7. СергейКа

    3,5) а то промахнулся :)))

    Reply
  8. awa

    (6) Например, http://lib.rus.ec/b/79791/download, и таких на либрусеке много!

    Reply
  9. awa

    +(8) Запятая в ссылку не входит!

    Reply
  10. СергейКа

    9) Обновил обработку. Теперь воспринимает utf-8.

    Действительно странно, что у меня таких файлов не было, хотя с либрусека скачано немало…

    Reply
  11. awa

    10) Да, теперь читает! Но как показала практика, кодировка utf-8 может быть указана в файле и как «UTF-8», и как «utf-8» (http://lib.rus.ec/b/123931)...

    Если ты собираешься развивать читалку, то я бы посоветовал одним из первых пунктов реализовать сноски (тэг <a> с типом note) не как переход, а как отображение сносок внизу страницы. Очень повышает комфортность чтения!

    Reply
  12. tsd

    ага, вот тут все и отметятся, кто вместо того чтобы работать, на работе книжки читает 🙂

    Reply
  13. el_bucho

    😀 палитесь

    Reply
  14. mt171

    Странно, но у меня почему-то при открытии файла 139101.fb2 (книга отсюда http://lib.rus.ec/b/139101/download ) выдаёт ошибку «C:Documents and Settings…Local SettingsTempFB139101
    _1». В электронной книге этот файл открывается без проблем.

    Reply
  15. СергейКа

    (14)А какую именно ошибку?

    Reply
  16. СергейКа

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

    Reply
  17. Bkmz

    Вычитку книг кто делает? Счас дай бог чтобы человек книгу засканил не то что распознал и вычитал. djvu делает черно-белый снимок с со страницы (даже рыжей, старой с масляными пятнами) и при этом размер в 600 стр нерапознанного картиночного текста можно вместить в 6 Мб или меньше.

    Reply
  18. СергейКа

    (18) Во-во. Если человек нормально к свое работе отностися, то скан вычитывается и конвертится в fb. Большая чать художественной лит-ры именно в этом формате благодаря удобству настроек чтения и навигации. На объем сейчас мало внимания обращают, с нынешними-то техническими возможностями 🙂

    Reply
  19. mt171

    (16) «C:Documents and SettingsuserLocal SettingsTempFB139101
    _1», файл из http://lib.rus.ec/b/79791/download открылся нормально

    Reply
  20. awa

    (14) В этой книге FB2Reader как раз и спотыкается на сносках. Конструкцию [1] он ошибочно пытается обработать как картинку.

    На самом деле реализовать нормальную читалку для формата fb2 не простая задача. А если еще учесть все возможных косяки, встречающихся в реальных файлах…

    Reply
  21. Душелов

    Советую почитать автору: http://reeed.ru/info_fb2.php

    Reply
  22. СергейКа

    21) Да кто ж спорит. Первая версия писалась в течении 3-х дней вместе с работой, как получалось время выкроить. Причём большая часть времени потратилась на то что еще не получилось в ней реализовать. Всё это еще в процессе.

    22) Спасибо. Брал инфу в основном отсюда http://www.gribuser.ru/xml/fictionbook/ и отсюда http://alexstmp.vsi.ru/index.php .

    Reply
  23. СергейКа

    Замечания и предложения принимаю, но далеко не всё можно реализовать сразу.

    Reply
  24. adakabo

    а вот эта Функция ПреобразоватьВДеревоXML(СтрокаXML) Экспорт уже объявлена в общем модуле =) впрочем можно закомментировать или переименовать вызов и функцию в локПреобразоватьВДеревоXML

    Reply
  25. artbear

    Полезно было бы добавить добавить фичу авточтения из zip-файла.

    На том же Либрусеке все fb2-файлы лежат в зип-архивах.

    У меня на коммуникаторе ХаалиРидер читает зипы, здесь было бы также удобно.

    ЗЫ или это уже есть ? 🙂

    Последнюю версию пока не изучал.

    Reply
  26. СергейКа

    25) Наверное в ЗУП открывал? 🙂

    26) Нету. В принципе не очень проблемно сделать.

    Reply
  27. СергейКа

    25) Обновил не меняя версию.

    Reply
  28. artbear

    Расположение текста по умолчанию лучше делать по ширине, чуть лучше смотрится 🙂

    Reply
  29. artbear

    И Отступ для начала абзаца было бы удобно добавить!

    ОбластьТекста.ТекущаяОбласть.Текст = » «+ ТекстВывода; // это Таб

    ОбластьТекста.ТекущаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.ПоШирине;

    Reply
  30. artbear

    1. И еще небольшой разделитель между абзацами вставить для полноты картины 🙂

    2. Последний открытый файл хорошо бы запоминать и открывать его при открытии обработки.

    Reply
  31. СергейКа

    Обновил версию. Пока реализованы не все пожелания, но это в процессе 🙂

    Reply
  32. ash2015

    Пригодится

    Reply
  33. СергейКа

    Судя по всему версия получилась достаточно читабельна и интерес уже к обновлениям упал :).

    В планаш остаются только «фишки» и «фичи», а это не так критично…

    Reply
  34. awa

    Небольшая ошибка — в тегах <p> могут быть атрибуты, которые не надо отображать при выводе текста книги. Пример — http://lib.rus.ec/b/93867/download . И еще пожелание — при смене настроек шрифтов хотелось бы применять эти изменения к текущей открытой книге, а то новые настройки действуют только при открытии книги.

    Reply
  35. СергейКа

    (35) Имеется ввиду текст типа AutBody ? Ок.

    Второе пожелание тоже принято.

    Вопрос: Как можно отследить движение полосы прокрутки поля текстового документа? Если кто знает, плиз … 🙂

    Reply
  36. logarifm

    Было бы класно если бы она еще умела в интернет-ресурсах шастать и скачивать вот это другое дело, а то нужно скачать, потом обработке сказать где же файл лежит и потом уж читать….

    Или она умеет качать с интернета?

    Просто в описании обработки я такого не встретил, а скачивтаь и проверять неохота.

    Reply
  37. СергейКа

    (37)Нет. Данная обработка не умеет этого делать 🙂

    Да и не вижу необходимости, если честно, вставлять данный функционал в обработку. Это будет в конфигурации.

    Reply
  38. СергейКа

    Эксперимент с доступом «Для всех» признан неудачным. За всё время нахождения в данном доступе скачивания каждый день и никто даже не прокомментировал. Перевел в рекомендуемый.

    Reply
  39. AlecoZAV

    В принципе идея неплохая, но доработки требует, что то подобное пишу для своей конфы Дом Библиотека, на УФ, там будет постраничное разбиение, гораздо удобнее читать и запоминать позицию просто

    Reply
  40. СергейКа

    (40) Давно забил за нехваткой времени.

    Начинал разработку чтения на совсем другом принципе, но осталось на этапе исходников.

    Была идея создания конфигурации библиотеки, но опять же не дошли руки.

    Reply
  41. AlecoZAV

    (41) а с другими форматами не работал?

    Reply
  42. СергейКа

    (43) Работал.

    fb3, html, doc, odt, pdf, txt. С этими всеми достаточно легко.

    Была идея работы с chm и hlp — но это закрытые достаточно форматы, сложнее чем с pdf. Не срослось.

    Reply
  43. BRT

    1. При наличии 2-х и более бинарных тегов в книге выходит ошибка.

    Предлагаю обнулить имя записи в файл:

    ИмяФайлаКартинки = «»;

    {ВнешняяОбработка.FB2.МодульОбъекта(287)}: Ошибка при вызове конструктора (Картинка)

    ЗначениеЗаписи = Новый Картинка(ЗначениеЗаписи);

    по причине:

    Файл не обнаружен ‘C: empFB3_Бенедиктов К. — Война в зазеркальеi_001.jpg’
    Reply
  44. СергейКа

    (44) BRT, спасибо, я в курсе. Данная обработка пока не дорабатывается.

    Reply

Leave a Comment

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