УТ: Дебиторская задолженность по интервалам — просроченная и актуальная




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

26 Comments

  1. ZLENKO

    Штатный отчет судя по отзывам (я сам штатным никогда не пользовался — написал свой отчет) редко выдавал правильные суммы. Вы свой тщательно тестировали ?

    Reply
  2. Nefertary

    К каким именно суммам были претензии?

    Возможны разногласия в том, что считать датой возникновения долга.

    И соответственно, в какие интервалы сумма должна попасть.

    Reply
  3. ZLENKO

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

    Начнем с простого — сумма общей задолженности по вашему отчету соответствует отчету «Ведомость по взаиморасчетам с контрагентами» ?

    Reply
  4. Nefertary

    Да, соответствует

    Reply
  5. Nefertary

    Соответствует отчету «Задолженость по контрагентам»

    Reply
  6. ZLENKO

    (2) Проверьте что правильно работает в случае если один документ делает несколько движений по взаиморасчетам (например, отчет комиссионера).

    Проверьте что правильно работает в случае предоплаты (в том числе частичной).

    Reply
  7. Nefertary

    1) Комиссионеров у нас нет, посмотреть не получится.

    2) . Все договоры покупателей ведутся по заказам.В случае предоплаты, при дальнейшем появлении заказа покупателя, предоплата переносится на заказ документом «Корректировка долга». Да, у нас очень аккуратные бухгалтеры 🙂

    Reply
  8. ZLENKO

    (7) » у нас очень аккуратные бухгалтеры »

    Везет вам 🙂

    Reply
  9. iov

    Вариант имеет право быть хотя бы для возможности выбора…

    Reply
  10. anig99

    (3)(5) Сразу добавлю, что отчеты Взаиморасчеты с контрагентами и Задолженость по контрагентам — сами по себе дают разные результаты (по крайней мере в УПП). Во-первых. Задолженность формирует сумму в управленческой валюте через валюту договора. Т.е. если в валюте долга нет, то в задолженности его не увидите… Далее. Вне зависимости от уровня группировки задолженность Дебитовая/кредитовая формируется на основе договора (или сделки, не проверял). Т.е. если захотим посмотреть долг по контрагенту без учета договоров, то нужно врубать режим «Все» иначе получите не ту сумму. Сам сегодня замучился проверять свой отчет.

    Честно говоря группировка, которая представлена на картинке для меня избыточна и только запутывает (: Мухи отдельно, котлеты отдельно. Просроченная задолженность — это одно, а задолженность по интервалам — другое. Хотя если отчет написан на СКД, то это поправимо.

    Reply
  11. Nefertary

    (10)Руководство хотело видеть, насколько просрочена задолженность и кого из покупателей надо теребить в первую очередь.

    Reply
  12. anig99

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

    Reply
  13. Nefertary

    Вот хотели именно с интервалами :). Сказали нарисовать в соответствии с ТЗ — бланком из Экселя. Мне было б проще было просто дни отсрочки посчитать, чем с динамическими интервалами изгаляться

    Reply
  14. Nefertary

    После того, как мне один раз выставили ТЗ на диаграмму Ганта, развернутую на 90 градусов, я уже ничему не удивляюсь

    Reply
  15. macsol

    (14)Дорогу осилит идущий….

    Я когда во франче работал, выполнял любой бред. Пик был — изменение типовой процедуры, которая вызывается в 57 местах системы. Очень полезный опыт. Было сразу понятно, что работать не будет, подошел к РП, объяснил ситуацию, а ему пофиг, тока бы деньги платили. В итоге клиенту впарили, а потом героически исправляли за отдельную плату. Если говорить на чистоту, 99% процентов, того что мы там навнедряли, попросту ненужно. Хорошо, что сейчас у меня есть возможность посылать граждан бухгалтеров, менеджеров и экономистов курить бамбук. И знаешь, не один миллион для собственника уже сэкономил.

    Reply
  16. anig99

    а я сам себе бух, менеджер и экономист (:

    Reply
  17. anig99

    (15) глянь всё-таки мой новый запрос. Он отдельно от обработки выложен. Просто хотелось бы узнать на всех ли машинах он быстрее твоего.

    Reply
  18. anig99

    и чего поменял?

    Reply
  19. Nefertary

    Галку не поставила, когда описание правила 🙁

    Reply
  20. Nefertary

    Чтоб дату обновления не кидала

    Reply
  21. Doctor_EVIL

    добавил свойство — интервалы суммы в интервалах не сменились… 😥

    Reply
  22. Doctor_EVIL

    добавил свойство — суммы в интервалах не сменились… 😥

    Reply
  23. voroninll@rambler.ru

    если есть корректировки долга, то сумма по договору не верна (не отнимает минуса).

    Reply
  24. OscarTT

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

    Reply
  25. Nefertary

    (24) OscarTT,

    Только дебиторка.

    Reply
  26. ranger

    Анна,привет.

    Сравнил этот отчет со штатным в УТ 10.3.21.1 и почему-то ваш отчет дает задвоение по всем строчкам.Возможно из-за вашего левого соединения.

    Делал похожий отчет для БП 2.0.Но я сдвигал интервал возникновения задолженности с учетом отсрочки.

    Reply

Leave a Comment

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