Отрицательные остатки по регистрам учета затрат




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

    Для какой конфигурации предназначена обработка? По скриншоту предполагаю что для УПП (РАУЗ)? Или ошибаюсь?

    Побольше бы в описании информации.

    Reply
  2. makas

    (1)

    Для какой конфигурации предназначена обработка? По скриншоту предполагаю что для УПП (РАУЗ)? Или ошибаюсь?

    Побольше бы в описании информации.

    Имхо для БП

    И информация нужна…

    Reply
  3. kapustinag

    И зачем было трудиться? Делать обработку, публикацию…

    В любом типовом отчете пользователь может сделать отбор типа «Конечный остаток» < 0 — и получить желаемое с любыми доп.отборами и группировками.

    Reply
  4. Гость

    (3) kapustinag, Рада что у Вас такие образованные и самостоятельные пользователи!

    Reply
  5. KoIIIka42

    kapustinag, Рада что у Вас такие образованные и самостоятельные пользователи!

    Reply
  6. yegorovnv

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

    Reply
  7. kapustinag

    (4) Гость, (5) KoIIIka42, Конечно, пользователи у нас разные. Как и везде. Но к тем пользователям, в обязанности которых входит анализ отрицательных остатков и устранение причин — требования повыше, чем к обычному кладовщику. Они должны уметь пользоваться такими возможностями программы, иначе не смогут нормально выполнять свои производственные обязанности.

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

    Reply
  8. n_lintek

    Всем добрый день! Вообще разные бываю ситуации. Иногда надо и обработку сделать, иногда и научить.. Спс за коммент №3 , очень полезен был.

    Reply
  9. CagoBHuK

    Любой программист, умеющий писать на языке 1С, должен уметь пользоваться отборами СКД. Если он этого не умеет, то пишет подобного рода обработки.

    Reply
  10. tadem

    (3) kapustinag,

    Спасибо, добрый человек!

    а то сижу ищу минусы через поиск.

    Ну не крутые мы программеры а так. юзеры ))))

    Reply
  11. kapustinag

    (11) tadem, всегда пожалуйста. Правда, не пойму, за что я удостоился таких благодарностей.

    Reply
  12. tadem

    (12) kapustinag,

    а вы бы знали что мне официально по поддержки ответили ))))Люблю 1с-ников ))))Такое ощущение что по ИТС садят отвечать тех кто программу первый раз в глаза видит.

    Reply
  13. jonybanchicov

    Просто и без лишних заморочек. Мои бухгалтера оценили. Автору огромное СПАСИБО!

    Reply
  14. jonybanchicov

    По поводу комментария (3), мои бухи сказали : замучались мы мышкой и тыкать по отчетам!!!!!

    Reply

Leave a Comment

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