[PDF Viewer] — Просмотр PDF в 1С




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

57 Comments

  1. Ёпрст

    Это, по скорострельности быстрее, чем активикс от фоксридер или адоберидер ?

    Reply
  2. Душелов

    Фоксридер или фоксит ридер?

    Фоксит, наверное быстрее будет, хотя не знаю…

    Но могу сказать, что быстрее адобе (и дешевле 😉 )

    Фоксит в 1Су встроить можно? У адобы есть активикс свой.

    Reply
  3. Ёпрст

    (2) фоксит .. можно.:)

    Reply
  4. Ёпрст

    Блин.. нет ставить на сервак неохота 🙁

    Ладно, попробую потестить на на локальной тачке..

    Но если ужо быстрее адобе, то +

    Reply
  5. brr

    А в 7.7 ведь можно просмотреть пдф без активиксов, через картинку. В чем плюсы использования активикса автора?

    Reply
  6. Душелов

    (5) Как?

    Reply
  7. brr

    На таблицу помещаем рисунок, в свойстве Текст пишем

    ПриВыводеКартинки(Таб.ТекущийОбъект,Файл) , где Файл — переменная хранящая путь к пдф, в модуле соответственно процедура:

    Процедура ПриВыводеКартинки(Картинка,Файл)

    Картинка.РежимРисования(1);

    Попытка

    Картинка.Загрузить(Файл);

    Исключение

    Сообщить(ОписаниеОшибки());

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

    КонецПроцедуры

    Код не мой, рабочий.

    Reply
  8. Ёпрст

    (7) Гы.. Какая наивность…

    Reply
  9. Ёпрст

    +8 Сам то хоть раз пробовал ?

    :))))))))))))))))))))))

    Reply
  10. Душелов

    Я наверное что-то упустил в 7.7…

    Reply
  11. Ёпрст

    (10) Нет. Штатно pdf не вывести.

    Reply
  12. Sla

    супер!

    предложение — сделать масштабирование (100%, по ширине, страница целиком)

    Reply
  13. Душелов

    (12) Автомасштаб автоматически работает при растягивании формы.

    Добавил свойство «Масштаб» для ручной установки масштабирования.

    Reply
  14. Ёпрст

    (13) Мот добавишь метод LoadFromFile … ?

    чтоб при открытии формы сразу открывался нужный pdf…

    Reply
  15. Ёпрст

    Ё… уже добавил …скоростной.

    Reply
  16. trufela

    Спасибо

    Reply
  17. allexor

    Классно!

    Есть предложение — добавить функции редактирования файла pdf, или программно заполнять определенные поля в pdf

    Reply
  18. brr

    (9) Ага, не загружает. Плюс автору.

    Reply
  19. Душелов

    (17) Для редактирования берем активикс от адобе (про версии) и читаем мануал по его методам.

    Reply
  20. hame1e00n

    Клево, спасибо, плюсую

    Reply
  21. allexor

    (19) а где взять то активикс от адобе (про версии)???

    Reply
  22. Душелов
  23. ge_ni

    Просто спасибо!!!

    Reply
  24. bookworm1c

    (2)На фига «погремушка», если пишете , что она фиговая?

    Reply
  25. Душелов

    (24) Какая такая «погрумушка» и где она «фиговая»?

    Reply
  26. Душелов

    * погремушка

    Reply
  27. voler
    Reply
  28. voler

    Ошибка лезит на WinXP SP3

    Reply
  29. WERY_NOOB

    для iPhon`а точнее для одного из его прибабахнутых приложений на ПК нужен framework 3.5 sp1 так вот эта штука жутко ругается на компоненту

    Reply
  30. poirus

    Попытался поставить начала ругаться, у меня стоит 3 net. Но вопрос не в этом у меня задача простая надо сделать импорт из pdf файла обшарил все что можно это единственная компонента которая хоть как-то работает. Может кто подскажет команду чтобы через shell сразу конвертнуть в txt. Программ таких куча, но вот не задача все они крайне плохо переводят в текст. Если это делать руками в adobe reader то получается гораздо лучше. Есть ли возможность сделать это через эту компаненту но автоматизированно а не по нажатию кнопки сохранить как текст

    Reply
  31. johnZZZ

    не могу понять как повесить на форму. Вродь все поставилось все прописалось в реге но работать не хочет. 1С 7.7 релиз 27. Может кто кинет .ert с кодом подкльчения!!!!???????

    Reply
  32. johnZZZ

    не могу понять как повесить на форму. Вродь все поставилось все прописалось в реге но работать не хочет. 1С 7.7 релиз 27. Может кто кинет .ert с кодом подключения!!!!???????

    Reply
  33. johnZZZ

    не могу понять как повесить на форму. Вродь все поставилось все прописалось в реге но работать не хочет. 1С 7.7 релиз 27. Может кто кинет .ert с кодом !!!!??????? Очень надо, стоит работа.

    Reply
  34. IronDemon
    Reply
  35. lex81
    Reply
  36. Spacer

    Есть такие пожелания, думаю несложные для доработки, но полезные:

    1. Добавить свойство в котором хранится полный путь к загруженному файлу.

    2. Добавить метод СохранитьДокумент() для программного сохранения в нужном формате.

    Reply
  37. DemonFM

    Windows 7 32 bit не подключается. Несколько раз пробывал регистрировать, не получилось. Что делаю не так?

    Reply
  38. 1cmax

    вот такая ошибочка. что может означать

    мПутьКФайлу — тип строка, путь к файлу

    мПолеКартинки.ЗагрузитьДокумент(мПутьКФайлу);

    Произошла исключительная ситуация (Dushelov.PDFViewer1C): Object reference not set to an instance of an object.

    Reply
  39. 1cmax

    какбэ есть соображения на тему?

    Reply
  40. macbeth

    (38) DemonFM, Возможно нужно из под Админа. Могу ошибаться

    Reply
  41. DemonFM
    macbeth

    (38) DemonFM, Возможно нужно из под Админа. Могу ошибаться

    Пробывал не проходит. Даже вручную из консоли пытался зарегистрировать, два экрана ошибок….

    На Win Server 2003 x64 зарегистрировалась, но вызывает ошибку как в сообщении (30). Net FrameWork 3.5 удалять не планируем.

    есть решение проблемы?

    Reply
  42. Sasha255n

    Вообще теоритически вещь нужная теперь пробую как подключть к своей базе

    Reply
  43. gentle

    (39) 1cmax? вы решили эту проблему?

    Reply
  44. 1cmax

    Уже не помню.. )))

    Reply
  45. mikhailv

    Win 7 x64: вываливает ошибки при переходе по закладкам документа.

    Программного метода Найти() нет.

    Не подошла.

    P.s. за 5 лет ни одного коммита?

    Reply
  46. Ёпрст

    (46) Автора нет в живых уже давно. Коммитить некому

    🙁

    Reply
  47. MadDAD

    (46), (32)

    Немного доработал. Добавил программный поиск. Добавил пример использования под 7.7

    Поиск:

    мПолеКартинки.Найти(СтрокаПоиска, Сначала, ТочноеСовпадение, ПоВсемуДокументу, Следующий, ОбратныйПоиск);

    Reply
  48. MadDAD

    исходники на GitHub — https://github.com/DmitryDreytser/Dushelov.PDFViewer1C

    Reply
  49. CheBurator

    (49) спсб!

    Reply
  50. user1156120

    Скачал Dushelov.Pdf1C.zip, запускаю reg.bat, появляется ошибка:

    RegAsm : error RA0000 : Could not load file or assembly Dushelov.PDFViewer1C.dll or one of its dependencies. Operation is not supported…

    Подскажите в чем может быть ошибка?

    Reply
  51. user1156120

    И вопрос к MadDAD. Как с Вами связаться, чтобы получить от Вас помощь… Пробовал написать Вам через этот форум но сообщение не отправляется!

    Reply
  52. MadDAD

    (52)

    И вопрос к MadDAD. Как с Вами связаться, чтобы получить от Вас помощь… Пробовал написать Вам через этот форум но сообщение не отправляется!

    Я тут не часто бываю.

    Что-нибудь конкретное про зависимости пишет?

    В комплекте идет библиотека «PDFLibNet.dll» она должна располагаться рядом с «Dushelov.PDFViewer1C.dll»

    Т.е. нужно весь комплект полностью распаковать в один каталог.

    Reply
  53. user1156120

    А можно Ваш e-mail? Я бы хотел за денежку к Вам обратиться чтобы добить этот вопрос, для терминальных юзеров очень бы хотелось иметь просмотр pdf внутри 1с, без запуска внешних приложений…

    Распаковывал всё содержимое папки, и в C:WINDOWSsystem32 клал… при любых вариантах возникает ошибка: RegAsm : error RA0000 : Could not load file or assembly … or one of its dependencies. Operation is not supported.

    На других форумах прочитал, что это может быть связано с контролем имен на .NET3.5 и 4. Пробовал разными способами делать «disable strong name verification». Еще много чего попробывал, но ничего не помогает.

    Вобщем нужна профессиональная помощь…

    Reply
  54. MadDAD

    PDFLibNet.dll для работы требует MSVCR90.dll, MFC90.dll, MSVCM90.dll

    нужно установить — Microsoft Visual C++ 2008 Redistributable Package (x86)

    Reply
  55. MadDAD

    А так же нужно снимать «блокировку файлов скачанных из интернета», это тоже мешает их регистрировать.

    Reply
  56. SLnet

    Запускаю батник, появляется ошибка:

    Installing ActiveX…

    —————————————————

    Microsoft .NET Framework Assembly Registration Utility 4.7.3062.0

    для Microsoft .NET Framework 4.7.3062.0

    © Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

    RegAsm : error RA0000 : Не удалось найти входную сборку «Dushelov.PDFViewer1C.dl

    l» или одну из ее зависимостей.

    Microsoft ® CLR Native Image Generator — Version 4.7.3062.0

    Copyright © Microsoft Corporation. All rights reserved.

    WARNING: This syntax is deprecated or you mis-typed your command. Run «ngen /?»

    to display a list of the currently supported parameters.

    Error: The specified file or directory «Dushelov.PDFViewer1C.dll» is invalid.

    —————————————————

    Done.

    WServer 2012 R2

    Делал:

    Устанавливал Microsoft Visual C++ 2008 Redistributable Package (x86)

    microsoft visual c++ 2015

    .NET3.5

    Файлы все в одной папке на диске C:PDFViewer

    Reply
  57. MadDAD

    (57) Правой кнопкой мыши по файлу -> Свойства -> Внизу нажать «Разблокировать»

    Reply

Leave a Comment

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