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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *