Анализ проводок




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

14 Comments

  1. gutentag

    Только за увиденно в скриншотах можно поставить плюс(за идею)

    Reply
  2. Арчибальд

    (1) Согласен 🙂

    Reply
  3. flord

    Спасибо! Чуть попозже подготовлю более детальное описание работы обработки и help. Писал ее года 3 назад поэтому сам забыл, как работает весь ее функионал.

    Reply
  4. organizator

    Пригодилась. Полезная штука.

    Reply
  5. Pim

    Наверно, нужный отчёт. Такую бы штуку ЗиК…

    Reply
  6. artbear

    Смотрится очень прилично.

    Reply
  7. wumka

    Обработка несомненно заслуживает внимания, и Автору, конечно же, за работу плюс, но…

    1. Явно не хватает подробного описания, на метод тыка затрачивается много времени.

    2. При выводе на печать таблица получается размером А3, что усложняет работу с такой таблицей.

    3. Есть некоторая «излишность», утяжеляющая обработку, насколько это оправдано не берусь судить, у каждого буха свои тараканы в голове:

    — время проведения док-та;

    — количество, даже в аналитике бесколичественного учёта, нап-р, начисления налогов, заработной платы;

    — сумма в валюте, валюта, даже если выбраны только рубли;

    — колонки «СодержаниеОперации» и «СодержаниеПроводки», по сути, дублируют друг друга;

    — излишне колонка «Количество Проводок».

    4. Поскольку нет описания, то было бы нелишним, чтобы при наведении мышки отражалось назначение иконок.

    Возможно, все излишества можно как-то отключать, но нет подробного описания.

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

    Reply
  8. g789

    Полезный отчет, конечно плюс.

    Правда на Украинской типовой БУ без «напильника» работать не захотел.

    Reply
  9. viacht

    На украинском ПУБе тоже не заработал. Нужен напильник, хотя отчет безусловно интересен и полезен.

    Основная ругань сводиться к следующему:

    ТЗ.СодПров = Опер.СодержаниеПроводки;

    {C:ANALIZPROVODOK.ERT(705)}: Поле агрегатного объекта не обнаружено (СодержаниеПроводки)

    Reply
  10. flord

    (7)

    1. Над этим работаю. В новой версии улучшил описание возможностей обработки.

    2. У меня по умолчанию выводит на А4. Мне кажется тут дело вкаса и каждый сам под себя настраивает параметры страницы.

    3. Все не нужные колонки можно срывать, а на счет пустых согласен их выводить нет смысла. Иногда нужно узнать сколько продобок с определенной корреспонденцией для этого и было сделано количество проводок.

    4. Подписи сделал.

    Reply
  11. flord

    (8) (9) К сожалению типовой БУ украинской по рукой нет. Попозже подпилю чтоб на ней тож работало без «напильника».

    Reply
  12. TREYDER

    Обработка хорошая, не хватает большего количества субконто, всего 3, хотелось бы 5.

    Reply
  13. erthia

    Плюсую. Очень интересная обработка. Возможно ли реализовать вывод в реквизитах субконто периодические, например по состоянию на конечную дату. Сейчас при выводе в Excel выlает «Неизвестный объект». Благодарю за внимание!

    Reply
  14. flord
    Обработка хорошая, не хватает большего количества субконто, всего 3, хотелось бы 5.

    Я в своей практике не видел конфы, где ушли от 3-х стандартных субконто. Это ведь все отчеты перестанут работать.

    Плюсую. Очень интересная обработка. Возможно ли реализовать вывод в реквизитах субконто периодические, например по состоянию на конечную дату. Сейчас при выводе в Excel выlает «Неизвестный объект». Благодарю за внимание!

    Сделать наверное возможно, но сколько времени тогда будет формироваться отчет? Для себя не планировал данные доработки особенно в свете перехода на БП.

    Reply

Leave a Comment

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