Отчет по просроченной дебиторской/кредиторской задолженности по дням для УТ (+ настройка выбора даты оплаты из заказа или договоров)




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

35 Comments

  1. dss3

    Хороший отчет. Как раз искал подобный.

    Ошибок пока не обнаружил. Если найду — отпишусь.

    Автору — респект.

    Reply
  2. nikgol2410

    Спасибо, Автору.

    Reply
  3. ivpavlovsky

    Странно, а у меня почему-то ошибка в запросе… УТ 2.3 для Украины

    Reply
  4. KvazaR

    Полезный отчет. Спасибо.

    Reply
  5. Userman

    Не обнаружил группировку строк «Договор контрагента.Вид мзаиморасчетов».

    Но всё равно плюс!

    Reply
  6. Vladimir_Konyrev

    Хороший отчет +

    Reply
  7. ZLENKO

    В чем отличие и преимущества по сравнению с типовым ?

    Reply
  8. NosovK

    На

    «Управление производственным предприятием для Украины», редакция 1.2

    Разработка конфигурации: «ABBYY Ukraine», 2005-2008 (1.2.8.6)

    При попытки запуска выдает:

    {ВнешнийОтчет.ОтчетПоКредитнойЛинии1(436)}: Ошибка при установке значения атрибута контекста (Текст): {(89, 31)}: Поле не найдено «ВзаиморасчетыОстаткиИОбороты.УпрУчет»

    ВзаиморасчетыОстаткиИОбороты.<<?>>УпрУчет = ИСТИНА

    УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;

    Что нужно поменять чтобы он заработал?

    Reply
  9. cheenya

    (8)Отчет написан под Управление торговлей 10.3, возможно в УПП для Украины нет деления на управленческий и бух учет, поэтому попробуйте в тексте запроса убрать условие «ВзаиморасчетыОстаткиИОбороты.УпрУчет = ИСТИНА», может и поможет, точно не скажу, т.к. с УПП я не работаю.

    Reply
  10. NosovK

    Спасибо, все получилось и работает )

    Reply
  11. NosovK

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

    «Управление производственным предприятием для Украины», редакция 1.2

    Разработка конфигурации: «ABBYY Ukraine», 2005-2008 (1.2.8.6)

    Reply
  12. anig99

    (11) попробуй мой отчет (:

    Reply
  13. NosovK

    (12) Пробовал. Не подошла по двум причинам:

    1. В этой обработке долг берется из заказа (у меня учет стоит по заказам) и я для каждого заказа могу индивидуально поставить отсрочку.

    2. СКД — не скажу что это плохо — много чего в ней можно, но универсальный отчет проще и понятнее… Не нужно напрягаться чтобы понять куда тыкать пальцем — все как и во всех стандартных отчетах. Иначе у меня все отчеты универсальные, а один скд )

    Reply
  14. anig99

    (13) вроде с датой из заказа решается штатным отчетом.

    Reply
  15. anig99

    (0) отчет конечно хороший…но простой.

    Reply
  16. anig99

    (0) надо бы скриншотов и описание фенечек

    Reply
  17. cheenya

    (11) посмотрите в договоре у пропавшего контрагента, стоит там галочка «Вести по документам расчетов с контрагентом», без этой галочки в отчет не попадет. Вообще отчет под УТ, на УПП не тестировался.

    Reply
  18. cheenya

    (16) самое странное, что скриншоты были, после обновления сайта пропали :cry:. Согласна, что отчет простой, но и я не гений 😉 1С (только год с 8-кой работаю), надо бы добавить расчет и по банковским дням, пока нет времени. А СКД сейчас только осваиваю, интересная штука.

    Reply
  19. NosovK

    (17) Как раз этой галочки и не хватало

    Спасибо

    Reply
  20. Performer

    Отчет хороший, то что нужно. Минус только в одном, что если покупатель расплатился за отгруженную продукцию и его долг составляет 0, то он все равно попадает в отчет. А в отчете необходимы только должники. Как можно поправить такую ситуацию? Написать еще запрос по должникам и включить в отбор?

    Reply
  21. anig99

    (21) видимо, добавлять отбор по сумме, если отчет это позволяет. Или сумма оплаты неправильно разнесена… В моем отчете точно можно отбирать и можно учитывать или не учитывать условие «вести до документам расчетов»

    Reply
  22. cheenya

    (20) В настройках отчета в Отбор добавьте условие «Долг контрагента» «больше» 0, и будут Вам только должники. И можно по количеству просроченных дней отфильтровать отчет, например вывести, кто больше недели просрочил и т.д.

    Reply
  23. Performer

    (22) Понятно, только тогда «ДолгКонтрагентаУпр» иначе убираются приходные ордера с отрицательными суммами.

    Reply
  24. Performer

    (22) Возникла следующая ситуация. Когда сделал отбор «ДолгКонтрагентаУпр» больше нуля, помимо НЕдолжников исчезли приходные кассовые ордера, как исправить? Еще вопрос, можно ли оплаченные «реализации товаров и усуг» не отображать в отчете, иначе через некоторое время отчет просто захламляется. Буду очень признателен если подскажите как это сделать.

    Reply
  25. AdvP

    отчет красивый а как сумму просроченого долга получить в данном отчете??

    Reply
  26. Mawa_19

    (0) А учитывает ли ваш отчет ордерную схему?

    Например, если документ «Реалиация товаров и услуг» выписан 01.05.2010, а ордер 01.07.2010. Платежка поступила 08.07.2010, число дней задолженности=10.

    Как в таком случае поведет себя ваш отчет?

    Reply
  27. hanio

    Это реально работающий отчет, спасибо огромное спас от многодневного труда, респектище. Плюсанул однозначно.

    Reply
  28. Markin

    В Комплексной Автоматизации отчет работает не корректно. Сколько не пытался крутить с настройками так и не увидел конкретных цифр. Может быть дело в том что этот отчет только для ут.

    Reply
  29. hanio

    У меня не попадают суммы переплат, а так же неплохо бы придумать колонку оплаты до текущей даты чтобы сверка с отчетом «Взаиморасчеты с контрагентами» проходила без калькулятора 😉

    Reply
  30. hanio

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

    Reply
  31. cheenya

    К сожалению 1С и программированием не занимаюсь уже больше года, но если будет время отчет доработаю. Спасибо за отзывы и пожелания.

    Reply
  32. arturbrest

    Люди помогите! Срочно нужен запрос для расчета просроченной дебиторской задолженности, когда я беру запрос из стандартного отчета, то данные уже тогда не сходятся.

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

    Reply
  33. arturbrest

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

    Reply
  34. rkozom

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

    А за отчет 5 баллов однозначно!

    Reply
  35. s_uu

    Добрый день, а есть ли подобный отчет для Управления торговлей 11??

    Reply

Leave a Comment

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