Дебиторская и кредиторская задолженность по срокам долга (просроченная задолженность)




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

44 Comments

  1. support

    Тест

    Reply
  2. osiris

    Так это пустышка.

    Reply
  3. McLer

    (2) в смысле пустышка? прикреплена обработка

    Reply
  4. osiris

    У меня firefox он видимо «глотает» расширение. Обработка-epf, но erf (отчет) открылось.

    Reply
  5. McLer

    (4) ну хорошо)

    Reply
  6. Ошибка в модуле объекта(640) мРежимВводаПериода не являет. объектом

    Reply
  7. McLer

    (6) отчет был сделан на основании типового очета конфигурции УТ 10.3.13.2, так же работате в конфигурации УПП. А Вы скорее всего его пытаетесь открыть в другой конфигурации, в которой нет объектка Отчет.УниверсальныйОтчет чем и вызвана такая ошибка.

    Reply
  8. daddy-don

    Так в УПП в каждом документе реализации выводится же задолженность по договору (правда, на уровне плачено-не оплачено, без привязки к срокам).

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

    Какие нюансы отличий этой обработки? К чему идет привязка — к дате договора и срокам просрочки в нем же?

    Reply
  9. McLer

    (8) к сроку просрочки в ней же. Я в описание написал что если конфигурация доработанная таким образом что отгрузки не запрещаются, то отчет очень полезен.

    Reply
  10. daddy-don

    (9) т.е. доработка понимается — достаточно только разблокировать в документах запрет на отгрузку просроченных по задолженности, и все?

    Достаточно ли заполнять типовые условия дебиторской задолженности (срок в договоре), или необходимо еще что-то дописывать плюсом по условиям?

    И какой ставить учет в договоре — должен стоять «по договору в целом», или для получения результата в вашей обработке это не обязательно?

    Reply
  11. McLer

    (10)

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

    Да достаточно.

    Достаточно ли заполнять типовые условия дебиторской задолженности (срок в договоре), необходимо еще что-то дописывать плюсом по условиям?

    Да достаточно заполнять срокт и ничего дополнительно дописывать не надо.

    для получения результата в вашей обработке это не обязательно?

    не важно какой учет стоит в договоре.

    если необходима информация где и что необходимо дописать чтобы разрешить отгрузку могу помочь.

    Reply
  12. daddy-don

    (12) да вроде все понятно, спасибо.

    В РТиУ в ПриПроведении убрать блокировку проведения. Так ведь?

    Reply
  13. McLer

    (12) Да так, только там в ОбработкеПроведения РТиУ вызывается метод в общем модуле.

    По тексту сообщения («Превышено допустимое число дней задолженности по договору«) можно быстро найти необходимую процедуру.

    Reply
  14. Rasty_

    А сохраните, пожалуйста, для Платформы 8.1!

    Reply
  15. McLer

    (14) выложил для 8.1

    Reply
  16. Rasty_

    как то все же не правильно он работает…. по контрагенту уже нет задолженности, а он её выдает..

    Reply
  17. Rasty_

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

    Reply
  18. McLer

    (17) и так анализируются задолженность с учетом дней просрочки!

    у вас скорее всего неправильно заполнен регистр «ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов», это значит что в документах в которых выбран договор с включенным признаком «ведения по документам взаиморасчетов» не всегда указываются документы преодоплаты или отгрузки. проверить это можно сформировав универсальный отчет по этому регистру с группировками: контрагени, документ расчетов с контрагентами, документ движения (регистратор). В очтете видна картина за какую отгрузку каким документов оплатили и также за какое постуление мы заплатили за какое нет и тем самым выделить неправильно оформленные документы.

    Reply
  19. Rasty_

    Дело в том, что у нас разрознены филиалы и Платежки от контрагентов вводятся только в одном филиале. Поэтому нет возможности указывать какая платежка к какому документы относится. Есть ли какой-либо способ всё таки получить дебиторку?

    Reply
  20. McLer

    (19) Или надо чтобы платежки мигрировали в остальные филиалы, или разносить эту информацию только в одном филиале где офорлмяются платежки и соответвенно отчет сможет работать только в нем. Я выложил обработку http://infostart.ru/public/81141/ которая заполняет необходимую информацию в документах.

    P.S.

    Только не забывайте деалть копию базы и тестить на копиях. мало ли какая информация может потерятся.

    Reply
  21. anig99

    (20) Никто не ждёт испанскую инквизицию!

    Собственно обработка тянет на то, чтобы схватить минус. Почему?

    1. Куцее описание

    2. Минимальное изменение относительно типового отчета.

    Что сделать, чтобы минус не появился? Расширить описание отчета(максимально) + накатать статью по правильному ведению учета по документам расчета и его контроля.

    Тут в свое время был бум отчетов до дебиторке, которые получали цифры по просроченному долгу при любых условиях ведения учета.

    Reply
  22. McLer

    (21) описание немного дописал.

    Я и не претендовал на патенты по этому отчету, просто взял типовой немного дописал (вприницпе любой программист мог бы это сделать) и этот отчет очень помог моему клинту.

    «Тут в свое время был бум отчетов до дебиторке, которые получали цифры по просроченному долгу при любых условиях ведения учета» если бы дал ссылку думаю люди были бы тебе благодарны.

    Reply
  23. anig99

    Мои в порядке публикации (статьи и обработки)

    http://infostart.ru/public/20221/

    http://infostart.ru/public/20962/

    http://infostart.ru/public/21038/

    http://infostart.ru/public/21095/

    http://infostart.ru/public/21672/

    http://infostart.ru/public/58966/

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

    Других авторов

    http://infostart.ru/public/19049/ -аналог Вашего

    http://infostart.ru/public/20074/ — тоже

    http://infostart.ru/public/19195/ — тоже

    http://infostart.ru/public/21968/

    http://infostart.ru/public/75917/

    http://infostart.ru/public/19212/

    Reply
  24. McLer

    (23) спасибо. щас себе что-нибудь интересное подберу

    Reply
  25. Rasty_

    Спасибо, попробую.

    Reply
  26. artspeed

    Начал разбираться в отчете. В целом неплохо, но смутило поле интервал, которое заполняется 50000 и больше не меняется. Автор — дай описание этому полю пж. Не понимаю, для чего оно…

    Reply
  27. McLer

    (26) artspeed, стоит начать с того что отчет в реквизите «Интервал» использует типовой справочник Настройка интервалов и его значения от отчета не зависят. В нем задаются интервалы дат по которым будет группироваться задолженность. А 50000 это предусмотрено программистами программы УТ как максимальное количество дней в интервале, что равняется ~137 годам. Думаю больше вряд ли Вам понадобится 😉 Мне кажется Вам нужно побольше изучить программу.

    Reply
  28. artspeed

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

    Я бы так сделал.

    Reply
  29. McLer

    (28) artspeed, нет вы не поняли, я говорил про ограничение в 50000. А реквизит нужен для формирования интервалов по задолженности.

    Reply
  30. artspeed

    теперь понял. спасибо.

    Reply
  31. OscarTT

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

    Reply
  32. McLer

    (32) OscarTT, обновил сегодня публикацию, теперь отчет так же учитывает и кредиторскую задолженность.

    Reply
  33. extremhelp

    Нет дебиторской задолженности 8.1 УТ

    Reply
  34. extremhelp

    Как настроить кредиторскую задолженность УТ 10.3 на 8.1

    Reply
  35. extremhelp

    Как настроить ?

    Reply
  36. extremhelp

    Помогите настроить дебиторскую задолженность

    Reply
  37. McLer

    (37) extremhelp, что у вас конкретно не получается? Настроить отчет? в договорах стоит признак «вести по документам расчетов» ? смотрели мою публикацию про заполнение документов?

    Reply
  38. McLer

    (34) extremhelp, радовались бы что ее нет ;))

    Reply
  39. dimaadidas

    Очень полезная и нужная обработка) Спасибо

    Reply
  40. Harry_Joplin

    Хороший отчет. Но по мне так сильно не хватает вывода Период + Регистратор, общая сумма задолженности видна, а как сформировалась не понятно?

    Reply
  41. McLer

    (41) Harry_Joplin, да так оно и есть, потому что отчет показывает именно остатки взаиморасчетов. А для того чтобы увидеть движения надо использовать отчет «Ведомость по взаиморасчетам с контрагентами» там и регистратор и период, но нет просрочки и долгов по периодам. Да конечно было бы классно попробовать их объединить, но не знаю на сколько это возможно и целесообразно. Посмотрите, возможно есть похожие (может быть платные), отчеты показывающие обороты вместе с просрочкой.

    Reply
  42. lees

    скачал и доработал под себя, спасибо

    Reply
  43. McLer

    (43) lees, пожалуйста.

    Reply
  44. kwl

    Данный отчет очень помог, спасибо!!!

    Reply

Leave a Comment

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