FB2Reader




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *