Перенос остатков баальшого регистра




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

8 Comments

  1. ssp_

    Чтобы хромая старушка быстрее бегала (или хотя бы просто могла передвигаться), ей можно дать костыли (SQL), заставить сбросить лишний вес (свёртка) или гонять пинками, как делает эта программа.

    Reply
  2. hogik

    Если использовать данную разработку, то до того как размер файла достигнет 1 гигабайта. См. http://infostart.ru/projects/1725/

    Reply
  3. hogik

    “почему она делает это так долго, совершенно не понятно?”

    Читают и записывают при открытом индексном файле и установленном порядке чтения по индексу, а не в физической последовательности. 😉

    Reply
  4. mr_jpa

    к 3: это-то как раз понятно ;-), не понятно почему 1С пошли таким путем. Просто у нас была ситуация в июле 2007 года, когда на открытии периода ночью база встала, а на утро 40 пользователей ДОЛЖНЫ работать. Пришлось изобретать быстрый способ решения ситуации. Далее в конце года делали свертку базы (размер около 12 гб ;-). Если интересует кого, могу описать что и как делали. Сверка была произведена за 7 часов в новый год.

    Reply
  5. CheBurator

    (4) Да, было бы интересно почитать.

    Это точный диагноз, что в длительном времени переноса остатков причиной является большой индексный файл? Имхается мне, что это тут не при чем…

    Reply
  6. zaic

    И мне что-то имхается, что они еще движения пересчитывают за месяц, а не только «тупо копирует все записи остатков с предыдущего месяца на текущий»…

    Reply
  7. hogik

    (4)

    “не понятно почему 1С пошли таким путем”

    Причин для этого несколько, например:

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

    2) Выполнение еще кое-чего, что без индекса будет работать плохо. См. сообщение (6) от zaic.

    3) … 😉

    (5)

    “Это точный диагноз…большой индексный файл?”

    Нет. Точнее, не только из-за этого. Однако, в DBFной версии 1Са читают и записывают, не задумываясь, с использование индекса. Например, при изменении структуры таблицы она переписывается по записям в рабочий каталог при открытых индексных файлах и установленного порядка просмотра – по индексу. Что абсолютно не требуется, работает значительно медленнее и не требует предварительного анализа для выбора алгоритма обработки. Я обнаружил только одно место, где производится чтение в физической последовательности – некоторые этапы в “Тестирование и исправление информационной базы”. Внутри DBEng32.dll вообще не предусмотрено чтение таблицы в физической последовательности, если у таблицы имеется индексный файл. И в тестировании ИБ они обманывают сами себя – удаляют описание индексов из словаря данных.

    Reply
  8. ildus78

    вообще-то 1С в новый период не переносит записи с нулевыми остатками (закрытые нулевые итоги на конец месяца), автор, как я понял, тупо переносит все подряд? не станет ли регистр от этого еще баальше?

    Reply

Leave a Comment

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