Отмена проведения документов без движений




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

9 Comments

  1. Ele1234567

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

    Reply
  2. Alex_E

    Грамотно воспользоваться наверное никто не сможет, т.к. после обмена проведенные документы должны быть проведены, а не сняты с проведения, «отловить» те которые не проводятся легко с помощью обработки Групповое проведение документов с флагом останавливать при ошибке, чтобы сразу эти ошибки исправлять.

    Если же снять флаг проведения после загрузки, тогда встанет ешё одна задача — отловить какие документы таки надо провести, а какие и должны быть не проведенными…

    Reply
  3. gutentag

    …Хм-м, любопытный случай. У меня были похожие:

    В 1-случае, попросил дописатьв обмен данными «галку» = не проводить документы при загрузке.

    Во 2-случае, купил готовый обмен данными, удовлетворяющий мои требования.

    Reply
  4. insurgut

    (1) Ele1234567, все, что делает обработка — снимает признак проведен. Всегда можно проверить перед обработкой документы, не устанавливая галочку «Снимать с проведения документы без движений».

    Reply
  5. insurgut

    (2) Alex_E, все верно, конкретно в моем случае документы выгружаются только проведенные. Априори предполагается, что все, что выгрузилось — должно было быть проведено 🙂

    Reply
  6. Alex_E

    (5) Так стоит в публикации это особо отметить

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

    — штатные обмены в типовых имеют настройку проводить или нет документы при загрузке, а флаг проведения переносится в любом случае. Это имеет очень большое значение, т.к. уменьшается размер файла обмена и соответственно время обмена, что при большом количестве документов может быть очень критично. Следующий «тонкий» момент типовых обменов — это выгрузка не только новых, но и измененных документов, что автоматически приводит к необходимости их перепроведения после загрузки, и тут флаг проведения должен точно соответствовать исходной базе. Вашей обработкой могут воспользоваться люди с типовым обменом, и вместо ожидаемого результата вполне могут получить геморой…

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

    Reply
  7. insurgut

    (6) Alex_E,

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

    Время загрузки действительно уменьшается на время проведения документов, но размер файла выгрузки от этого никак не зависит.

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

    Были документы без движений. Остались без движений, только непроведенными. Да и нет типовых ручных обменов между, например, УТ и БП. Я не видел. Всегда приходится «допиливать» правила, используемые в настройках обмена типовых конфигураций, которые заточены на использование планов обмена данными. В остальном:

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

    соглашусь, делал под конкретную ситуацию, в принципе можно доработать по принципу вкладки отложенных движений документов на форме монитора обмена данными. На досуге займусь 🙂

    Reply
  8. Alex_E

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

    Про то,

    Были документы без движений. Остались без движений, только непроведенными.

    — никак не доыведу джо Вас мысль, что потом надо будет разбираться какие не проведены «правильно», а какие просто потому, что не проводились, что связанов поиском , что проводить, что не проводить, и при большом объеме документов — это гемор ещё тот.

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

    Reply
  9. insurgut

    (8) Alex_E, опять же на своем опыте — смысла выгружать ежеквартально например данные о непроведенных документах — нет (а зачастую ежеквартально выгружаются небольшие фирмы, и обычно в таких фирмах человек тщательно следит за документами, они бывают либо в состоянии проведен, либо помечен на удаление). На самом деле случай частый, что делать с такими документами, повторюсь — что обработка по умолчанию лишь сообщает о таких документах, и только установив признак обработки — она будет снимать признак «Проведен» с таких документов. Просто действительно следует оформить эту обработку в более удобном и менее прозрачном виде, например в виде таблицы со списком действий.

    Reply

Leave a Comment

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