Обработка копирования тестов 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='\

29 Comments

  1. stae

    Вопрсы распаковывает, что очень удобно если более чем с 1 диска надо распаковать. Зачем переименовывать каталоги? В Data.cab у каталогов русские названия.

    Reply
  2. vek

    Из-за extract`а. Если хотите переделаю, чтобы названия каталогов создавались «оригинальные».

    Reply
  3. vek

    200 с лишним скачиванием и только один комент, или всех все устраивает, или у всех «хорошие наборы напильников» 🙂

    Reply
  4. ermav

    Попробуем, исследуем. Спасибо за труд!

    Reply
  5. musinramil

    создает пустые папки

    Reply
  6. vek

    (4) Пожалуйста.

    Reply
  7. vek

    (5) Результат всегда одинаков? Только создает пустые папки и больше ничего? Опишите что делаете.

    Reply
  8. Elena7

    Таже проблема с пустыми папками?

    Reply
  9. vek

    (9) это утверждение или вопрос? 🙂

    Посмотрю сегодня, в чем проблема. Скажите за какой месяц-год диск ИТС, на всякий случай.

    Reply
  10. Elena7

    май 2009 спасибо что откликнулись

    Reply
  11. vek

    (11) К сожалению мая у меня пока нет, на более ранних можете проверить?

    Reply
  12. vek

    (11) В имени папки назначения есть русские символы? Попробуйте указать в обработке путь к папке и имя оной попроще и латиницей (что-то вроде c: est). Жду результата.

    Reply
  13. Elena7

    Спасибо при указании данной папке все работает

    Reply
  14. vek

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

    Reply
  15. Borisych

    Можно и руками скопировать файлы из Data.cab

    я обычно так и делаю — просто открываю в Total`e и копирую

    правда с этого года нужно изменить первый символ файла «I» на «M» в hex-редакторе, поэтому +

    Reply
  16. Borisych

    Если автор не против — я встрою обработку в свою конфигурацию для подготовки к экзамену ПРОФ — для полной автоматизации процесса.

    Сейчас для загрузки тестов в базу используются файлы *.xls

    Reply
  17. vek

    (17) Поставите в ней ссылку сюда, буду не против 😉 Рад, что кому-то пригодилась.

    Reply
  18. PolAlex2

    Обработка очень удобная. но есть некорректность — На ИТС файлы всегда не соответствуют месяцу диска, потому что диск собирается и штампуется заранее, в пред. месяце. А обработка формирует название каталога по дате файлов.

    В итоге для тестов с мартовского ИТС каталог называется не 03_2010, а 02_2010 (19_02_2010, но дата там кстати совершенно лишняя)

    В результате тесты с мартовского ИТС, а всем кажется что с февральского. Путаница может быть.

    Предлагаю:

    1) увеличивать месяц на 1.

    2) сделать формат вывода «год_месяц» (без дня). Тогда будет нормальная сортировка каталогов в хронологии лет. А то по твоему формату тесты разных лет перемешиваются.

    Reply
  19. helenmem

    Объясните бедной девушке всю последовательность работы с этой программой 😳 плизззз!

    Reply
  20. vek

    (20) Все достаточно просто, на вкладке «Настройка» указываете путь к файлу архива с тестами (если будете распаковывать файлы с дисков, просто смените букву диска на букву вашего привода). Далее на закладке «Основная» указываете вид теста который хотели бы получить и каталог, куда будет произведена распаковка. Нажимаете «Выполнить». Далее, полагаю, объяснения не требуются.

    (19) По первому пункту, не знаю, имеет ли это действительно практический смысл.

    По второму, рациональное зерно есть, можно сделать.

    Reply
  21. PolAlex2

    > (19) По первому пункту, не знаю, имеет ли это действительно практический смысл.

    Ну мне кажется да… у себя я сделал 🙂

    Reply
  22. helenmem

    Спасибочки огромное, vek! :{}

    Reply
  23. manan

    в моей конфигурации «тестирование 1с профессионал» есть возможность получения тестов непосредственно с диска итс:

    http://infostart.ru/public/20107/

    а также куча других возможностей для подготовки к тестированию 1с профессионал по любым тестам для России и Украины

    Reply
  24. vek

    (23) Не за что

    (24) А также не плохо было бы указать в своей конфигурации, где взяли куски кода для получения файлов 😉

    Reply
  25. manan

    (25) да, часть кода для извлечения тестов с дисков итс я где-то подсмотрел, кажется в одной из многих конфигураций для подготовки к тестированию. возможно, этот код там был не родной, а скоммунизденный у Вас. собственно, если это так, выражаю Вам признательность за него.

    Reply
  26. greystone

    Классная обработка. Спасибо. 😀

    Reply
  27. eli1984

    Спасибо за обработку, дает возможность подготовиться к тестам :)))

    Reply
  28. Veduin

    Спасибо за обработку, В сочетании с остальным что тут есть Очень практично!

    Reply
  29. ask001

    Что-то она с дисками 2013 года не работает. Путь на DatabaseStaff1CStorageData.cab поменял, но не помогает.

    Reply

Leave a Comment

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