V8Unpack 2.0




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

73 Comments

  1. MMF

    странная идея хранения .header перекочевала и в эту версию. Header это всего-навсего

    { описание заголовка файла }

    TFileHeader = class

    private

    FCreated: TDateTime;

    { время создания файла }

    FModified: TDateTime;

    { время последнего изменения файла }

    FAttributes: TFileAttrSet;

    { атрибуты файла }

    FName: string;

    { имя файла }

    public

    при этом

    { аттрибуты файла }

    TFileAttributes = (faNormal, faReadOnly, faDir, faHidden, faSystem);

    TFileAttrSet = set of TFileAttributes;

    8 байт — дата создания, 8 байт — модификации, 4 байта аттрибуты, имя файла в юникоде.

    Зачем плодить файлы? если вам интересны эти поля — устанавливайте их на соответствующих файлах данных. Хотя лично я бы выкинул бы их нафиг. У вас и так еле ползает эта утилита, а вы еще эту бодягу разводите.

    Reply
  2. disa_da

    Файлы .header используются при unpack/pack — тут я ничего не менял.

    А в режиме parse/build создаются только файлы с данными.

    Reply
  3. disa_da

    А за информацию по атрибутам огромное спасибо. Но вот мне ни разу не попадались файлы, в которых бы эти атрибуты были заполнены. Было бы интересно на такие файлы посмотреть.

    Reply
  4. tormozit

    (1) А че, можно быстрее все сделать? (чтобы как в конфигураторе летало)

    Reply
  5. disa_da

    (4) Распаковака в памяти делается быстро. Все остальное время занимает запись на диск. Поэтому чем быстрее диск, тем быстрее будет работать.

    Reply
  6. MMF

    (4) распаковка УТ (аналог вашего Parse, т.е. с разбором всех base64, с 1С-именами файлов и т.п. преобразованиями) — 32 сек, сборка — 27 сек

    Reply
  7. brix8x

    я рад за «распаковку УТ» 😉 только из комментария непонятно: распаковка УТ это или название программы или распаковка Управления торговлей, а «аналог вашего Parse» — это дистанцирование от «жуткого V8Unpack» или ссылка на некую волшебную программу? 😉

    в общем не понял … сорри …

    Reply
  8. MMF

    (7) УТ — конфигурация Управления торговлей (т.е. файл *.CF), аналог вашего Parse — подразумевалось, что результат распаковки на диск — в преобразованном из внутреннего формата виде (http://slil.ru/25659603) А приведение мною замеров времени — не только членомерение, но и подтверждение того, что есть еще резервы для ускорения и не только в «записи на диск» дело.

    Reply
  9. disa_da

    (8) Мда. Круто. Прям таки завидую, белой завистью естественно. Но теперь мы знаем к чему стремиться — это уже хорошо =)

    Reply
  10. disa_da

    (8) Проверил сейчас на УТ (старенькой правда) — 52 секунды. Но это без преобразования в осмысленные имена.

    И все таки запись на диск составляет процентов 90. Видимо есть способы писать быстрее, осталось их узнать.

    Reply
  11. tormozit

    Может кэширование записи на диск?

    Reply
  12. MMF

    (10) используй профайлер, а не умозрительные 90%. Однозначно DWORD CV8File::_httoi(char *value) надо переписать (учитывая кол-во вызовов).

    Жестоко выглядит:

    pFileData = new BYTE[FileDataSize];

    ****

    FILE *file_in = fopen(filename_in, «rb»);

    учитывая размеры cf с образами распределенки и/или конфы поставщика.

    Reply
  13. MMF

    (12+) потерялось ret = fread(pFileData, 1, FileDataSize, file_in);

    Reply
  14. disa_da

    (12) Пока что приоритетнее все-таки преобразовывать в имена 1С, а потом и наращивание производительности можно занятся. Профайлером под VC6 никогда не пользовался, может посоветуешь что-нибудь? Или в VS2005 что-нибудь есть?

    Reply
  15. MMF

    (14) AQTime, тока он денег стоит, ежели белый

    Reply
  16. Ghost mail

    MMF, так может присоединишься к коллективу disa_da, brix8x и иже с ними. И совместными усилиями сделаете «красивую» утилиту ???

    Reply
  17. MMF

    (16) у меня детки дома по лавке скачут голодные, мал мал меньше, ждут, когда я краюху хлеба принесу. Альтруизм в больших количествах мне не доступен.

    Reply
  18. kitt

    Не глядя плюс за исходники, дома гляну. Автор спасибо!!

    Reply
  19. tojocky

    Автор спасибо! уверен что будут новые идеи!

    Reply
  20. tojocky

    MMF Но жмуриться не надо! у всех есть проблемы… а если будем по одиночестве работать то ничего не добьемся!

    Reply
  21. tojocky

    еще такой вопрос! как можно открыть файл .1CD или .dt файл?

    Reply
  22. tojocky

    К стати… есть бинарный вариант для распаковки hbk файл! кому нужно оброщайтесь!

    Reply
  23. BorovikSV

    для файлов *.dt

    http://www.infostart.ru/projects/2217/

    Reply
  24. tojocky

    (23) Спасибо!

    Reply
  25. vladnet

    Насколько понял не распаковывает обработки с паролями на модуле, даже если этот пароль известен?

    Reply
  26. harmit

    Данная распаковщик допускает ошибки в командах «Исключение» и «КонецЕсли»;

    Исправил кто?

    Reply
  27. Zergos

    Вот уж мега-спасибо!

    С помощью тулзы успешно провёл даунгрейд внешней обработки с 8.1 до 8.0. .)

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



    One Ass

    Reply
  28. artbear

    (0) Разборку файлов не удалось довести до «человеческих» имен папок?

    Reply
  29. disa_da

    (28) Все дело в том, что у меня нет реальных задач, где бы такая функциональность понадобилась. Все с чем мне приходится сталкиваться — решается через тот функционал, который есть. А просто сделать ради сделать неинтересно!

    Напишите на чем угодно преобразование в осмысленные имена (например на том же 1С) и я добавлю это в V8Unpack. Ничего сложного там нет, правда MMF ругался что некоторые данные хранятся замудренно, но я думаю и это можно решить. Но сразу предупреждаю — перебирать все GUID’ы и где и как хранятся данные каждого вида метаданных занятие ну очень нудное.

    Вот если иметь реальную задачу, группой, да еще бы платил кто-нибудь за это — дело сразу пойдет =). Или кризис дойдет до такого момента, что работы совсем не будет, тогда можно и распаковку будет продолжать =)

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

    Reply
  30. artbear

    (29) Давай обработку, вдруг руки дойдут или время найду 🙂

    Reply
  31. disa_da

    (30) Положил сюда

    Reply
  32. disa_da

    (30) И ссылка http://ifolder.ru/11722513

    Reply
  33. Evg-Lylyk

    (0) Супер вещь. Что то не нашел в описании что означает PARSELEVEL={0|1|2}

    На счет профилировщика VC6 он примитивен до нельзя… работает только в DEBUG запускаешь его через меню далее все как в 1С8 список точек их время и количество запусках (пишет в окне сообщений). А еще он есть только в Prof версии.

    Reply
  34. MSensey

    Исправь ссылку http://svn2.assembla.com/svn/V8Unpack/track/

    Reply
  35. acsent

    Будет ли ГУЙ?

    Reply
  36. tormozit

    Кто нибудь нашел способ добавить новую форму во внешнюю обработку?

    Reply
  37. tormozit

    (36) Я таки нашел, но гемор это БОЛЬШОЙ. Хочется API уже наконец заиметь.

    Reply
  38. darj

    (32) по ссылке файлик удален 🙁

    Reply
  39. bambr1975

    (38) рискну предложить посмотреть публикацию http://infostart.ru/public/69976 — честно говоря, смысл обработки выложенной в (32) был заимствован там целиком.

    Reply
  40. tormozit

    _

    Reply
  41. mozz

    Конвертнул исходники в VS 2010 может кому пригодятся… Архив с исходниками во вложении.

    Reply
  42. KVS

    Как собрать обратно уже с открытым кодом?

    Reply
  43. Famza

    Спасибо

    Reply
  44. Sergey_Murzinov

    Безоной разработки по жизни ни как, точно.

    Reply
  45. pmtvv

    хорошая вещь, спасибо

    Reply
  46. lustin

    (41) архив исходников VS2010 скачивается битым с Инфостарта

    Reply
  47. Софтэксперт

    Весьма полезная вещь для анализа внутренней структуры

    Reply
  48. mozz

    (46) Проверил вроде не битый… Может временный баг был?

    Reply
  49. lustin

    (49) сейчас отлично — видимо был глюк Битрикса

    Reply
  50. bissov

    Не могу запустить утилиту, может есть мануал какой на эту тему.

    Reply
  51. Elisy

    Предлагаю ознакомиться с аналогичной разработкой, написанной на C# и .Net Framework. Была идея организовать контроль версия для конфигураций 1С:

    http://infostart.ru/public/103834/files/

    Reply
  52. simnn

    а документацию к программе где посмотреть?

    Reply
  53. serezhka87

    Скачал. Будем смотреть что это за зверь. =)

    Reply
  54. zarius

    Кто нибуть пробовал EPF запаковывать? При UnpackAll.bat — распаковываются нормально, PackAll.bat — результата не дает…

    Я так понимаю что в результате распаковки должен создаться каталог с файлами (это есть) и в нем в том числе должны быть файлы с расширением .unp (этого нет). Фактически в каталоге только файлы:

    FileHeader

    куча *.header

    куча *.data

    Пробовал обработки и 8.1 и 8.2. В какую сторону смотреть?

    Вообще, реально добавить с помощью данной разработки произвольный макет в существующую обработку?

    Reply
  55. EmpireSer

    Супер! Особая благодарность за открытый код! Спасибо!

    Я именно такое и искал!

    Вот только жалко, что последняя запись в SVN числится 2008 годом.

    Reply
  56. Kamikadze

    как запустить инструмент?

    Reply
  57. babys

    Обращаюсь к разместившему здесь от имени автора, пора автору опять учить 1С 🙂

    В 17 релизе не работает.

    Reply
  58. Elisy

    (59) babys,

    Попробуйте на 17 релизе C#-аналог, может будет работать

    http://infostart.ru/public/103834/

    Reply
  59. zavsom

    А можно разжувать что запускать то? Мне нужно например увидеть в рарс альфа 5.0 текст в закрытых модулях общего модуля — скачал, запускаю приложение — что то моргает на экране и тишина… ЧЯДНТ ? подскажите что нужно по шагам чтобы это запускалось.

    Reply
  60. leonet

    v8unpack Версия 3.0

    Оптимизировал сборку .cf(.epf|.erf) файла. На больших конфигурациях вылетала «Segmentation fault».

    Исходники и собранные бинарники здесь.

    Проект для codelite IDE. Workspace создаем в корне (иначе грабли при сборке по F5) далее добавляем проект v8unpack.project.

    Всем удачи!

    Reply
  61. Sabfir

    С помощью этого инструмента можно ли заменить тип реквизита обработки и тип элементов на форме.

    Было бы здорово иметь такую возможность, или подскажите как самому это доделать.

    Заранее благодарен.

    Reply
  62. Manticor

    Под Windows 8 не запускается V8Unpack.exe. Может кто то сталкивался — библиотеки какой не хватает?

    Reply
  63. SeiOkami

    (64) Manticor, попобуй запускать от имени админа

    Reply
  64. SeiOkami

    Можно ли этим приложением извлечь из базы необходимые модули (не из конфигурации, а именно из базы)?

    Reply
  65. Mi4man

    Подскажите плиз, где инструкции, описание и т.п. ???

    Reply
  66. Gotcha

    При попытке распаковать файл конфигурации БП 2.0.64.27, происходит unpacktofolder error in creating file!, ближе к концу файла.

    Успевает распаковаться 13107 файлов. А жаль, я уж размечтался привинтить свой любимый Tortoise SVN+Merge

    Reply
  67. smilohov

    Кто может быстро помочь починить базу после сетевого сбоя? Прошу откликнуться.

    email: smilohov@mail.ru

    skype: smilohov

    Reply
  68. amiralnar

    Спасибо огромное за программу!! Она спасла меня!

    Мне нужно было найти старый релиз 2.1.10.2, а у меня была конфигурация с релизом 2.1.7.1, и все обновления, которые не хотели ставиться ни при каких условиях.

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

    Все ссылки на всех обменниках давно протухли, половина обменников позакрывалась, и взять следующий файл поставки было негде!

    Но с этой программой мне удалось выполнить восстановление поставки, распаковав мою конфигурацию, и файл обновления этой конфигурации в одну папку, а потом собрав из этой папки конфигурацию обратно! И все начало нормально обновляться!

    Reply
  69. sss999

    получится файл dt ею распарсить на файлы?

    Reply
  70. zekrus
    Reply
  71. МихаилМ

    это вопрос к 1с , а не к распаковщику . распаковщик распаковывает так, чтобы можно было обратно запаковать.

    Reply
  72. zekrus

    Смысл теряется в распаковке. Цена вопроса 2 строки кода.

    Reply
  73. user598128_able123

    (74) поподробнее пожалуйста.

    Reply

Leave a Comment

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