Распаковка файлов *.dt без 1С:Предприятие




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

50 Comments

  1. artem666

    круто,

    Reply
  2. tormozit

    ээ че то маловато даже для начала

    Reply
  3. tojocky

    (2) Согласен! по тихонько будем дальже копать!

    Reply
  4. Aleksey.Bochkov

    Уважаемый! У вас русский язык в школе проходили? 🙂

    Reply
  5. Aleksey.Bochkov

    (+4) Сорри.. только сейчас доходит, что Вы, скорее всего, иностранец.

    Reply
  6. Душелов

    Угу, и точно не англоговорящий.

    Reply
  7. tojocky

    (4) не все изучают русский язык в школе! что-то самостоятельно изучает!

    Reply
  8. tojocky

    (7)что-то= некоторые

    Reply
  9. Душелов

    что-то = кто-то 🙂

    succeful = successful 😉

    Reply
  10. tojocky

    (9) ок исправлю!

    Reply
  11. tojocky

    (10) исправил!

    Если есть предложение, буду рад их услышать!

    Reply
  12. Душелов

    Какие другие этапы планируются?

    Reply
  13. tojocky

    (12) Планируется разбирать распакованный файл! декодировать base64 формат, показывать данные в более в приятном виде!

    Reply
  14. Душелов

    (13) Тогда с нетерпением ждем! 🙂

    Reply
  15. Белый

    (0) теперь все будут DT распаковщики писать? http://www.infostart.ru/projects/2217/ — этого недостаточно? Или этим просто свое «Я» удовлетворено? Ну мол «Я тоже смог» распаковать DT. Честно говоря такого рода утилиты начинают быть похожими на «Консоль запросов», «ОСВ» и т.д., которыми завален портал.

    Ей богу это перебор. Ну научился ты DT распаковывать глядя

    как это делает http://www.infostart.ru/projects/2217/. Судя по комментам еще у автора алгоритм клянчил.

    Ты сначала доделай утилиту, а только потом выкладывай. Добавь возможности которых нет у уже имеющихся утилит. А сейчас это просто EXEшник который распаковывает DT в txt, который требует дальнейшей обработки. т.е. толку никакого…

    Reply
  16. BorovikSV

    (15) >>Судя по комментам еще у автора алгоритм клянчил.

    ага было дело. расспрашивал 🙂

    Тоже не понимаю что толку все с начала начинать

    Reply
  17. tojocky

    (15),(16) По прозьбе(http://www.infostart.ru/projects/2217/index.php?p=5&id=2217%2F#comm) Sol(http://www.infostart.ru/profile/3125/) Добавил то что у меня «Работает»!

    Reply
  18. O-Planet

    Круто: «Возможен распаковка *.dt файлы без программы…»

    — Нужно программиста звать, конфигурацию править…

    — Э-э-э… Пачему праграммист звать канфигурация править, когда возможен распаковка dt файлы без программа!

    Reply
  19. BorovikSV

    в продолжение к (18)

    Гром гремит, земля трясЁтся

    эт DT распакуЁтся 🙂

    Reply
  20. Abadonna

    (0)>Я не англоговорящий и не рускоговорящий!

    Если не секрет: а на каком именно «говорящий»? 😉

    Reply
  21. Душелов

    Накинулись все на человека 🙂

    Reply
  22. Fuego
    Многие спрашивает. ЗАЧЕМ? Отвечу: когда дело косаетья допольнительные возможности каторые 1С не имеет и финансы .. тогда есть смысл.

    А может быть просто начать работу над своим проектом?.. К примеру, я знаю кучу возможностей, которых нет в 1С:Предприятии, но знаю, как их реализовать. Я один. А если собрать коллектив из нескольких программеров?..

    Reply
  23. Душелов

    (22) Ну а поподробнее? 😉

    Reply
  24. Fuego

    (23) о чём подробнее? 🙂

    Reply
  25. Душелов

    (24) > я знаю кучу возможностей, которых нет в 1С:Предприятии, но знаю, как их реализовать

    Reply
  26. Fuego

    (25) ну щас! Взял и рассказал тебе и всем ;)))) Неужели никого не раздражало в 1С-ке то, что там какой-то мелочи, которая так и простися, НЕТ. Не реализована. И хрен когда эти возможности реализуют. Например, СКД пришёл на смену построителю отчета, но лучше стало лишь местами (обыкновенно — задними). Я и сейчас часто пишу на построителе. Потому, что СКД не поддерживает сложные расчеты в итоговых полях. Значение одного поля недоступно в расчете другого. Ну и можно писать и писать…

    Reply
  27. tojocky

    (26) у всех есть что-то нового предложить есть, что 1С еще не имеет! но для начало надо правильно строить скелет (архитектуру) а потом добавить все возможности!

    Может выложим все на бумажку и проголосуем?

    Reply
  28. Sol

    Народ! Действительно непонятно, это что, какая-то профессиональная ревность?

    Уважаемые (мной во всяком случае) люди подняли хай, из-за того что проект пока мал и из-за того что есть другие параллельные проекты?

    Или из-за того, что кто-то влез на их территорию и к тому же выкладывает исходники? Что за мелочная ревность? Никто не умаляет Ваших заслуг — они велики, откуда такие эмоции?

    Во всяком случае это не очередной Ренумератор, написанный в n-сятый раз, а инфа по теме внутренностей Платформы. Не так уж много инструментов в этой области, а открытых — и пальцев одной руки не надо, чтобы пересчитать.

    Человек, как уже упоминалось выше, спросил — ему отказали. ОН что-то накопал — САМ. И поделился, по первой просьбе.

    Это вызывает уважение, вне зависимости от знания человеком русского (английского или любого другого), а также того, много он там накопал или ещё нет.

    Reply
  29. Bacchus

    а где в исходниках 1Cv8Api.h и пр.

    Reply
  30. tojocky

    (29)В 1Cv8Api.h разрабатываю работа с 1С… но еще сырой и не имеет смысл ставить! если хочешь могу ставить! ничего интересного пока еще нет!

    Reply
  31. Fuego

    (26) (27) О каких скелетах и возможностях платформы идёт речь?.. Я никогда не лез в файл формата DT. И никогда не полезу. С таким же успехом и в файл RAR можно лезть. А зачем? Это пакет данных. Нет в нём никаких возможностей платформы. Я даже не утруждал себя скачиванием приведенных здесь материалов. Я нахожу это глупым занятием. Ни о какой ревности и речи быть не может.

    Reply
  32. Bacchus

    (30) ставь, пригодится.

    Reply
  33. Sol

    (31) > Я даже не утруждал себя скачиванием приведенных здесь материалов. Я нахожу это глупым занятием.

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

    И минусы ставить «в отместку» тоже 😉

    Reply
  34. Fuego

    (33) я не говорил, что ветка мне неинтересна. Так что — высказывание не ко мне. И минусы не в отместку ставлю — за содержание, за мысль.

    Reply
  35. angeliccare

    1. Возможен распаковка *.dt файлы без программы 1С:Предприятие 8.0, 8.1.

    Возможна распаковка *.dt файлов …

    2.

    3. Выложыл первый этап программы для открытия *.dt файлы.

    Выложен первый этап, программа для открытия *.dt файлов.

    3. Исходникик могут быть скомпилированны под Windows и Linux.

    Исходные коды могут быть скомпилированы под Windows и Linux.

    4. Как IDE и библиотеки использовал Ultimate++ что позволяет писать программы с единном кодам для Windows, Linux и MacOS. Делает программирование с++ в удовольствие а не в Ад как делает остальные IDE. Последний build u++ можно скачать здесь.

    Как IDE и библиотеки использовал Ultimate++, что позволяет писать программы с единным кодом для Windows, Linux и MacOS, делает программирование с++ в удовольствие, а не в муку, как делают остальные IDE. Последний build u++ можно скачать здесь.

    5. Прозьба ПРИСОЕДЕНИТЬСЯ и поппытаться вместе копать а не по одиночестве! таким образом мы будем в разы быстрее прийти к цели.

    Просьба ПРИСОЕДИНИТЬСЯ и попытаться вместе копать, а не по одиночке! Таким образом мы сможем в разы быстрее прийти к цели.

    6. Моя цель: по больше узнать из нутри 1С (после годы программирования в 1С) и попытаться портировать 1С кофигурации в свободный проект что будем разробатывать вместе.

    Моя цель — побольше узнать изнутри 1С (после лет программирования в 1С), попытаться портировать 1С кофигурации в свободный проект, что будем разрабатывать вместе.

    (Это десяток человеколет — вы в своём уме?)

    7. Многие спрашивает. ЗАЧЕМ? Отвечу: когда дело косаетья допольнительные возможности каторые 1С не имеет и финансы .. тогда есть смысл.

    Многие спрашивает. ЗАЧЕМ? Отвечу: когда дело касается дополнительных возможностей, которых 1С не имеет, и финансов… тогда есть смысл.

    8. 30.12.2008 Добавил Linux (Ubuntu 8.10) бинарникик!

    30.12.2008 Добавил Linux (Ubuntu 8.10) бинарники!

    9. Я не англоговорящий и не рускоговорящий! если находите ошибки просто скажите и я исправлю!

    Я не англоговорящий и не русскоговорящий! Если находите ошибки — просто скажите и я исправлю!

    10. (15),(16) По прозьбе Sol Добавил то что у меня «Работает»!

    (15),(16) По просьбе Sol добавил то, что у меня «Работает»!

    Reply
  36. tojocky

    (35) Спасибо!

    Не понял одно о означает слово «человеколет». Если это человеко-лет, то думаю что это не займет столько времени!

    Reply
  37. tojocky

    (36)(35) Спасибо!

    Не понял одно слово «человеколет». Если это человеко-лет, думаю что это не займет столько времени!

    Reply
  38. angeliccare

    (37) Вы проекты сдавали готовые? Внедрений и других? Если решаетесь — будьте трезвы, не как студент, не расписывающий проект до конца по срокам.

    Reply
  39. angeliccare

    Цитата о Bitrix (это только web-сайт, совместимый с 1С):

    Мы на сегодняшний момент потратили на продукт, грубо говоря, 200 человеко-лет, наверное даже больше. Сколько реально ресурсов можно потратить на разработку системы? Заказчик может оплатить от 1-го до 12-ти месяцев работы команды, составом от 1-го до 3-х человек.

    По моим оценкам 1С 8 как завершённая платформа имеет сложность порядка 500 человеко-лет.

    Для отмерки возьмём ReactOS (клон windows):

    http://www.reactos.org/ru/about_roadmap.html#10

    Windows 2000 — 5000 человеко-лет.

    Они брали исходники других проектов (wine и др.) и не реализуют большое количество компонентов (Internet Explorer, mfc и другие), так что сокращаем до 500-1000.

    «ReactOS does not support MFC, we could potentially do so in the future if someone were to implement it. Of course, one would have to be thoroughly familiar with MFC to do so. »

    Итак. 400-800 человеколет и уже 6 лет интенсивной разработки коллективом (выход в «издание» будет через ещё 4-5 лет).

    Следует быть трезвым. Ваш проект очень похож на ReactOS по трудозатратам. И это — 10+ лет труда коллектива, а не одного человека!

    Reply
  40. angeliccare

    Благодарю, да, действительно «человеко-лет».

    Reply
  41. AraraT

    Где взять файлик 1Cv8Api.h, а то в исходниках его нет…

    Reply
  42. tojocky

    (40) Согласен 100%! потому и вызываю на Помощь!

    (41) файл у меня… но интересного там ничего нет!

    Reply
  43. coldwind

    Потребовалось проверить, есть ли в файле 1Cv8.dt какие-либо данные, и наткнулся на эту «программу».

    Спасибо автору этой программы за открытый исходный код. Он помог мне ответить на простой вопрос — как этот файл запакован. Оказалось, что содержимое файла сжато используя алгоритм deflate. Шапка файла 9 байт (1CIBDmpF1). После этого набросал небольшой скрипт для распаковки файла (нет желания скачивать Ultimate++ и компилировать программу, если быстрее написать скрипт) и решил поставленную мне задачу.

    По существу. Данный проект (изучение структуры хранения данных в 1С) действительно сложен в реализации. Потребуется оптимизировать работу с памятью как при распаковке файла (самое простое, но в исходных кодах не реализовано), так и во время представления конечного распакованного файла в памяти программы (задача не из тривиальных). После представления данных в памяти их можно будет экспортировать в удобном для дальнейшего анализа виде. Некоторые данные в распакованной структуре сначала сжаты deflate, а затем base64 (например, макеты).

    Поэтому без конечной задачи, решение которой действительно востребовано и не может быть решено средствами 1С:Предприятия, браться за такую задачу не рекомендую. Хотя, конечно, программировать ради программирования никто не запрещает.

    «Попытаться портировать 1С кофигурации в свободный проект, что будем разрабатывать вместе.» — утопия, если речь идет о написании своей программы аля «1С:Предприятие».

    Reply
  44. jdo

    С огромным удовольствием присоединюсь к отрытому проекту. (открытому*)

    Reply
  45. МихаилМ

    ❗ ошибка

    на win2003 64bit из dt от демобазы типовой БП 1.6

    cf создался 2,7 ГБ

    Reply
  46. Sergey_Murzinov

    Под Win7x64 ошибка

    Reply
  47. frai

    Отличная вещь. как обстоит дело с новыми версиями?

    Reply
  48. gagtp5

    Супер!

    Reply
  49. Ghost13341

    долго искал.

    Reply
  50. user1012133

    Здравствуйте, возможно ли восстановление информации в битом dt файле?

    В результате заражения вирусом в dt файле оказались уничтожены 256 кб. в самом начале и в самом конце. Сам размер dt файла около 5 Гиг.

    Такой большой размер базы обусловлен в основном картинками, которые особой важности не имеют.

    Можете ли вы помочь восстановить информацию? Какова будет прибл. стоимость восстановления?

    Если не сможете восстановить — какую информацию реально из этого dt файла вытащить?

    P.S. Есть рабочая копия базы 3-недельной давности. За эти 3 недели было добавлено ок. 50 новых документов.

    Спасибо,

    Reply

Leave a Comment

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