DBFScruber или чистильщик DBF




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

32 Comments

  1. Скажите пожалуйста как создать ODBC соединение и где прописать путь к базе? Извиняюсь за ламерский вопрос, но яне понял.

    Reply
  2. proskurin

    Пуск — Администрирование — Источники данных ODBC

    Там вкладка «Пользовательский DSN» жмем добавить, выбираем драйвер (dBASE Driver ). Затем выбираем каталог (указать каталог с базой данных), задаем название, например, «DbfScruber», версия таблиц — 5.0.

    Дальше все должно заработать, только не забудьте указать правильную дату в ini файле.

    Reply
  3. Не заработало. Выдал ошибку: [Microsoft][Драйвер ODBC dBase] Индекс не найден.

    Reply
  4. proskurin

    Довольно странно, индексы для удаления вообще не используются. Кроме указания каталога и названия, ничего менять не надо, хотя там, в настройках ODBC, и есть возможность выбрать индексы, их не нужно указывать, поскольку все-таки у 1С формат немного другой (Fox).

    Reply
  5. proskurin

    Кто-то пробовал уже? Поделитесь удачными свертками…

    Reply
  6. proskurin

    В идеале, конечно, надо использовать Microsoft Visual Foxpro ODBC Driver, хотя, повторяю, ODBC dBase, тоже будет работать. Если что-то не работает — ковыряйте свой ODBC, для этого и сделано разделение. Программка просто выполняет нужные запросы.

    Reply
  7. «Обработка структуры 1Cv7.dd» останавливается на 1% или 11% и ошибка:

    [Microsoft][Драйвер ODBC dBase] Индекс не найден.

    Reply
  8. proskurin

    Пишите, пожалуйста, на адрес sbs@sbs.com.ua. Мне необходимо повторить ситацию, для этого надо знать:

    1. Версию драйвера

    2. Операционная система

    3. Появляются ли документы после анализа dd файла?

    Все было проверено мной на W2k3 / W2000 / Win XP без SP —

    работает четко.

    Reply
  9. proskurin

    Только что проверил на лицензионной Win XP SP2 со всеми последними обновлениями, чем черт не шутит 🙂

    Все работает четко.

    Reply
  10. После нажатия кнопки Анализ, пишет ошибку «Обработка структуры 1Cv7.dd» 2%», и сообщение об ошибке «Run-time error ‘-2147217900 (80040e14)’: [Microsoft][Драйвер ODBC dBase] Индекс не найден.». Я уже по всякому перепробовал настраивать драйвер и все равно одна и таже ошибка. (Windows XP Pro SP2, 1C v7.7.008, размер базы 1,7Гб., драйвер Microsoft dBase Driver (*.dbf))

    Reply
  11. Автор .., а вы не могли бы пояснить, работает ли ваша программа с Регистровыми базами ??? .. я так догадываюсь, что ваша программа только для бухгалтерского учета.

    Reply
  12. proskurin

    Работает с регистрами тоже.

    Почему не работает в вашем случае не могу сказать.

    Попробуйте другие драйверы, которые понимают dbf.

    Возможно, что-то с ADO или MDAC…

    Reply
  13. Если я не ошибаюсь ADO и MDAC .. это не дрова …а архитектуры доступа к БД.

    Reply
  14. почему-то удалилось все содержимое документов, а сами документы остались. что делать ??

    Reply
  15. proskurin

    Видимо, повторить. Для начала. Скорее всего, не закончилась очистка 1SJOURN.DBF.

    Reply
  16. Автор, вы мне ответите что нибудь по моему вопросу или как ??? Еже ли дело только с драйверами доступа к БД, то посоветуйте где их можно взять !!!

    Reply
  17. proskurin

    Для Denton. К сожалению, поскольку у меня никогда не возникала описанная ситуация, я не искал пути ее решения. Если Вам удасться решить вашу проблему — напишите сюда. Могу так же выложить исходные коды на VB, кому интересно.

    Reply
  18. В VB я не силен и проблему не смог решить, но было бы очень не плохо, если вы автор опубликуете подробную статью как работает ваша программа.

    Reply
  19. Исходники где можно посмотреть? Вещь хоть и сама по себе несложная , но интресная с точки зрения обучения VB и 1С.

    Reply
  20. gunner_Hans

    Все живет, все работает. Автору сенкс и +1

    Reply
  21. mihenius

    Хотелось бы тоже самое, но только с пометкой на удаление, а не физическое удаление из таблиц

    Reply
  22. karat60

    +1, а исходники можно ??

    Reply
  23. proskurin

    Исходники выложил как есть, однако на комментарии не рассчитываем — давно это было

    Reply
  24. ERMAKoff

    Прошу прощения, а вот этот пункт каким образом можно выполнить? «7. Переносим остатки на утро указанной даты.»

    Reply
  25. warit

    Мне помогло решить проблему с индексами: [HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesXbase]

    «BDE»=dword:00000002

    Reply
  26. luckymarina

    У меня такой вопрос: я не могу перепровести те документы, которые остались после чистки, т.к. нет ничего на остатках. Может, нужно сразу провести документы с остатками??

    Reply
  27. luckymarina

    У меня такой вопрос: я не могу перепровести те документы, которые остались после чистки, т.к. нет ничего на остатках. Может, нужно сразу провести документы с остатками?? И еще: при тестировании проверять физическую/логическую целосность, производить пересчет итогов и служебной инфо, или только упаковку?

    Reply
  28. luckymarina

    С предыдущими вопросами разобралась. Только появилась новая проблема: база не проходит тест на логическую целосность. Как можно ее решить?

    Reply
  29. Performer

    После обрезки базы «комплексная» сбилась нумерация, теперь новый созданный документ записывается номер 0000000001. Ну и так как этот номер уже существует ругается что номер не уникальный. Каждый раз поправлять номер тоже не айс. Может кто подскажет как исправить проблему?

    Reply
  30. vitalyb

    хорошо справляется с поставленными задачами, мне очень сильно помогло при свертке базы 🙂

    Reply
  31. AndreyBuka

    Пуск — Администрирование — Источники данных ODBC

    Там вкладка «Пользовательский DSN» жмем добавить, выбираем драйвер (dBASE Driver ). Затем выбираем каталог (указать каталог с базой данных), задаем название, например, «DbfScruber», версия таблиц — 5.0.

    Дальше все должно заработать, только не забудьте указать правильную дату в ini файле. при тестировании проверять физическую/логическую целосность, производить пересчет итогов и служебной инфо, или только упаковку?

    Reply
  32. xaker1C

    Работает большое спасибо

    Reply

Leave a Comment

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