Экспорт конфигурации из базы данных (Прямой режим)




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

62 Comments

  1. artbear

    Как быть с клиент-серверной версией?

    Reply
  2. coder1cv8

    а когда для выгрузки cf был нужен монопольный режим?… ) «бета» пишется с одной «т».

    А так, за «выгрузку без установленной платформы», конечно плюс!

    Reply
  3. MMF

    (1) для клиент-серверной вообще элементарно

    Reply
  4. German

    Даешь выгрузку конфигурации в mdf. Что бы с файловой можно было работать как с серверной…

    Reply
  5. artbear

    (3) Как?

    Reply
  6. Donat

    (5) А там конфигурация, в одной табличке хранится.

    Reply
  7. ValeriVP

    (0) а зачем две програмулины (для 1CD и DT)? не лучше ли одну сделать?

    Reply
  8. BorovikSV

    (7) разумеется можно, но тогда такой продукт не выйдет никогда

    когда делал DT — не было опыта работы с 1CD.

    А так можно потом сделать общую сборку. Ну только когда все части хорошо обкатаны.

    (3) Разумеется элементарно. Но только львинная доля присутствующих смаху этого не сделает.

    Причина: Нет соответствующей квалификации.

    Reply
  9. BorovikSV

    И неужели кикто ничего не скажет насчет скорости экспорта? 🙂

    Ведь сравните время экспорта средствами 1С и этой утилиты.

    Иногда на порядок показатели отличаются

    Reply
  10. tormozit

    Экспортирует быстрее конечно чем платформа. Молодец! Ну в платформе явно криво кэширование сделано. Это еще на партнерском и тут отмечалось в частности Rebelx’ом. RAM-disk для этого начали использовать с переопределением путей для системных папок. А теперь еще в разы быстрее cf сохраняется. Вот только хочется быть уверенным, что там все в порядке и это именно основная CF, а не CF базы данных.

    Reply
  11. BorovikSV

    как раз это CF базы данных

    Reply
  12. tormozit

    Лично мне нужна будет возможность указания каталога приемника через командную строку

    Reply
  13. tormozit

    Еще бы для скуля турбоутилиту сделали бы. German, ну где же она???

    Reply
  14. German

    (14) Для скуля можно сообразить .. на досуге навояю

    Reply
  15. BorovikSV

    (13) работа с командной строкой будет добавлена в финальной версии

    Reply
  16. Gamm

    Вот еще бы импорт обратно. А то бывает портится в файловой базе таблица config и кранты. А так загрузил внутрь рабочий CF и все отлично.

    Reply
  17. BorovikSV

    (17) во первых не всегда заливка сработает, ведь может и сама база уже быть битая

    а во вторых заливка конфы без реструктуризации — как на бомбе сидеть.

    а реструктуризацию реализовать — это считай езе одну 1С написать 🙂

    Reply
  18. Gamm

    (18) Так если ту же конфигурацию заливать что и была то и реструктуризации не надо.

    Reply
  19. German

    (18) всегда можно вызвать реструктуризацию принудительно (Тестирование и исправление)

    Reply
  20. BorovikSV

    (20) Герман это с точки зрения клиент серверной версии — все просто.

    с точки зрения файловой — все происходит на порядок сложней.

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

    На самом же деле все может быть намного хуже. А платформа лишь споткнулась на таблице CONFIG.

    Такую базу штатными средствами часто не исправишь.

    Заливка CONFIG — пройдет удачно лишь в случае физической целостности БД.

    Короче говоря каждая ситуация уникальна, и требует индивидуального рассмотрения!

    Reply
  21. glek

    Странно: выгрузил программой и 1С-кой. В первом случае размер ЦФ-ка 67,1 метр, во втором — 67,9. Когда пsтаюсь обїединить конфу с ЦФ-ком, выгруженным программой, 1С-ка схлопывается с ошибкой формата потока. Это так задумано? или я чего-то не знаю?

    Reply
  22. BorovikSV

    (22) не можете дать базу?

    Reply
  23. glek

    (23) могу. как?

    Reply
  24. BorovikSV

    (25) Уже несколько человек просили разработать VCL-компоненту (для Delphi) для работы с *.1cd.

    Те кому интересна будет эта наработка пожалуйста как-нибудь проявитесь.

    Reply
  25. mmj14

    (25) Интересное дело эта компонента, если конечно в исходниках.

    Reply
  26. tormozit

    Даешь исходники! Я бы контекстную подсказку научил методам общих модулей…

    Reply
  27. tormozit

    (27) Хотя нет. Это я замахнулся слишком)

    Reply
  28. zag2art

    Сделал cf — своей упп-шной базы, попробовал сравнить в конфигураторе — конфигуратор вылетел с ошибкой потока. Жду финальный, безглючный релиз

    Reply
  29. tojocky

    (25) интересное предложение… может лучше в с++ писать утилитку?

    Может выложишь исходни на разборку *.dt, и *.1cd! за одно посмотрим и может и предложение будут?

    Reply
  30. BorovikSV

    (30) Специально для тебя я должен движок на C++ переписывать? 🙂

    Reply
  31. saver77

    Автору Большое Человеческое СПАСИБО!

    Reply
  32. tojocky

    (31) Может дашь на Delphi а мы сделаем и для с++?

    Reply
  33. BorovikSV

    (33) Может ты дашь мне доллар а я сделаю из него кусочек хлеба?

    Reply
  34. Abadonna

    (33)> Может дашь на Delphi

    Забавный вид сексуальных фантазий :)))))))))

    Reply
  35. BorovikSV

    (35) Не говори. я бы так не сформулировал 🙂

    Reply
  36. tojocky

    (34) ну что сказать! я думал… что раз свободный проект… помочь хотел. но видимо что он становиться платным!

    (35)видимо у тебя плохие манеры!

    Reply
  37. BorovikSV

    (37) ты разве видел где то упоминание что проект «свободный»?

    То что рядом с кнопкой «Скачать» не стоит цена — это лишь означает, что проект для свободного скачивания.

    Reply
  38. tojocky

    (38) Понятно!

    Reply
  39. tojocky

    (38).может присоединиться и копать вместе?

    Reply
  40. BorovikSV

    (40) Окопы?

    Reply
  41. zag2art

    Када ждать обновления?

    Reply
  42. BorovikSV

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

    Reply
  43. 4361fmv

    Ошибка потока

    Reply
  44. BorovikSV

    (44) Версия бета. Я знаю про этот косяк. выгружает нормально если нет удаленных записей. т.е. если не удаляли никаких объектов метаданных.

    Reply
  45. 4361fmv

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

    Reply
  46. 4361fmv

    Отменил все пометки удаления, всё равно «Ошибка формата потока»

    Reply
  47. BorovikSV

    (47) Нужно выполнить «Сжатие информационной базы» в конфигураторе. Тут пометки на удаление ни причем

    Reply
  48. liric

    Свет мигнул. — 1с не запустилось. chdbfl.exe исправило пару ошибок. Потом ошибка формата потока после авторизации. тулза CFExport.exe сделала конфиг. но он тоже с ошибкой формата потока . Че делать? все кэши потер и на другом компе пробовал. БП 1.6

    Reply
  49. kefimov

    Выскакивает «Ошибка формата потока данных», ничего не помогает.

    Попроббовал данной утилитой вытащить конфигурацию, получилось.

    Но при загрузки конфигурации в 1С, выдается ошибка «Структура конфигурации несовместима» … странно, 1С то не переустановливал и не обновлял… «1С:Предприятие 8.1 (8.1.15.14)»

    Reply
  50. Abadonna

    (51) Ну, так читай описалово:

    Данная обработка является ознакомительной версией, т.е. не предназначенной для полноценного использования.

    В силу разных причин выходной файл получается битый. Это связано в первую очередь с замудренностью формата базы данных 1С 8.Х (*.1cd).

    «Война» с форматом ведется постоянно, но переменным успехом.
    Reply
  51. alexkozin

    неплохая парсилка

    Reply
  52. dimon_tb

    Спасает когда у клиентов падает база! Спасибо большое!

    Reply
  53. ][p

    оч приятная вещица, спасибо )

    Reply
  54. igo-osetro

    Спасибо автору! Полетела как то база у клиента «Ошибка формата потока» наверное у многих она встречалась, так вот все препробывал тестирование и исправление разными способами, кэш чистить, но вот только эта обработка спасла меня ))) Спасибо большие вам !!!!

    Reply
  55. phil1n

    Спасибо большое, выручила

    Reply
  56. SERJ_1CC

    Не пашет нефига, виснет и все…

    Reply
  57. mgmac

    Обработка очень помогла, спасибо !

    Reply
  58. Spirit11

    А с 8.3 работает?

    Reply
  59. wills

    Так же «ошибка формата потока», перепробовал вытащить различными способами, и tool_1c пробовал, вытаскивал конфу, но при загрузке в новую базу, таже ошибка, соответственно конфа видимо битая. Но есть еще CONFIG SAVE — сохраненная конфа, она загружается, но выдается сообщение, мол надо сделать обновление.

    Нету такой обработки которая могла бы из файловой в SQL загрузить таблицы? В SQL с подобной проблемой тоже сталкивался и решил ее путем замены таблицы CONFIG на CONFIG из другой базы. В файловой такой трюк не получиться, разбить на таблицы нужно.

    Reply
  60. Johny_v

    А можно, используя ваши разработки, как-то сохранить обработки или отчеты как внешние?

    Reply
  61. BorovikSV

    (63) Johny_v, Вопрос не понял

    Reply
  62. Team leader

    Подлечил битую базу при помощи данного инструмента.

    — не давало войти в конфигуратор: по отдельности выгрузил Цф и данные, подлечил — затем снова собрал.

    Спасибо +1, на дворе 2018 до сих пор актуальна.

    Reply

Leave a Comment

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