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




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

32 Comments

  1. 911service

    Вот бы еще по кредиторской такую.

    Reply
  2. webcisp

    ПО кредиторке есть подобие

    http://infostart.ru/public/172119/

    Задолженность поставщикам по срокам долга (УПП 1.3/БП 2.0)

    Reply
  3. webcisp

    Да,забыл спросить — а чем этот отчет отличается от стандартного в УПП ?

    Reply
  4. alexnov

    (3) webcisp, думаю можете сравнить со стандартным:

    Reply
  5. 911service

    Там без учета отсрочки по договору

    Reply
  6. ssn5810

    попробовал открыть в ут 10.3

    {Форма.Форма.Форма(32)}: Поле объекта не обнаружено (мДействиеФормыВыполнитьВнешнююОбработку)

    УниверсальныйОтчет.мДействиеФормыВыполнитьВнешнююОбработку = Новый Действие(«ДействияФормыВыполнитьВнешнююОбработку»);

    Reply
  7. WellMaster

    Скачал в надежде, что этот отчет будет учитывать «Допустимое число дней задолженности», выставляемое в договоре контрагента. Запустил, сравнил со встроенным. Все тоже самое. Отчет не работает на заявленный функционал.

    Группировки строк: Контрагент, Договор, Документ расчетов с контрагентом (реализация)

    UPD. Сорри, оказывается там дальше еще один ряд колонок. В нем как раз таки все правильно.

    Спасибо.

    UPD2. Колонки хоть и есть, а вот данных в них нет. Не работает. Пруф в аттаче

    Reply
  8. alexnov

    (7) WellMaster, свойство в договоре нужно добавить «Количество дней отсрочки» (код 00000000027) и «Лимит ДЗ» (код 00000000038). Скорее всего из-за этого. Честно говоря уже не помню, но думаю если текст запроса помотрите будет понятно чего не хватает в Вашей базе. Скорее всего какого-то совйства нет или в договоре или у контрагента.

    Reply
  9. WellMaster

    (8) Да, вчера ковырялся в коде. Действительно нету этих свойств. Ну добавлю я их, а их еще и заполнять придется? А зачем, если есть реквизит договора «Допустимое число дней отсрочки»?

    Reply
  10. alexnov

    (9) WellMaster, ну придется заполнить конечно. У нас в УПП 1.3.34.1 нету такого реквизита (.

    Reply
  11. manoff

    Пытаюсь отчет прикрутить у УТ 10.3 свойства у договора заполнил, проверил даже в дебагере, находит их. НО в отчете графа лимит ДЗ напротив соответствующего договора не заполняется. Ну и просрочку не обсчитывает.

    Что не так могу делать?

    Reply
  12. manoff

    (7) Если разобрался как с ним работать, отпиши пожалуйста

    Reply
  13. WellMaster

    (12) manoff, нет, написал свой отчет )

    Reply
  14. manoff

    (13) WellMaster, Поделись :))

    Reply
  15. WellMaster

    (14) manoff, уже поделился судя по всему 🙂

    Reply
  16. AlexBar

    (105) Gazza,

    С каких это пор в УПП нет реквизита «Допустимое число дней отсрочки»? Этот реквизит существовал еще с первых редакций УПП. То же самое и с суммой задолженности.

    Reply
  17. Mx00

    (13) WellMaster, если есть возможность поделись отчетом Дебиторская задолженность по срокам долга с учетом дней отсрочки

    Reply
  18. WellMaster

    (17) Mx00, Так вроде скачивается нормально. Или нету SM? Могу кинуть, если не в минусах.

    Reply
  19. Mx00

    (18) Скачать я скачал, но там нужно заводить свойства, а ты писал про «Допустимое число дней отсрочки», вот мне как раз по этому реквизиту нужно, если у тебя именно так, то буду очень благодарен 🙂

    mx(аt)mail.ru

    Reply
  20. WellMaster

    (19) Mx00, Так скачай в моих публикациях: http://infostart.ru/public/178020/

    Reply
  21. iln00r

    Неплохо было бы систематизировать все отчеты по дебиторской/кредиторской задолженности

    Reply
  22. pvlunegov

    Скачал. Запустил в УТ 10.3. Ошибка

    {Форма.Форма.Форма(32)}: Поле объекта не обнаружено (мДействиеФормыВыполнитьВнешнююОбработку)

    УниверсальныйОтчет.мДействиеФормыВыполнитьВнешнююОбработку = Новый Действие(«ДействияФормыВыполнитьВнешнююОбработку»);

    ЗАмечательно! Спасибо за супер отчет с небольшими ошибочками…

    Reply
  23. pvlunegov

    Коли отчет не тестировали для всех типовых конф, то хоть напишите в описании, в каких конфах отчет железно работает.

    Получается я скачиваю, и потом оказывается что автор не тестировал свою работу на типовой конфе Ут 10.3

    Reply
  24. pvlunegov

    Зашел в конфигураторе в вашу обработку. В процедуре ПриОткрытии закомментировал строки:

    Процедура ПриОткрытии()

    УниверсальныйОтчет.мДействиеПолеВводаВидСравненияПриИзменении = Новый Действие(«ПолеВводаВидСравненияПриИзменении»);

    УниверсальныйОтчет.мДействиеПолеВводаЗначениеПриИзменении = Новый Действие(«ПолеВводаЗначениеПриИзменении»);

    УниверсальныйОтчет.мДействиеКоманднаяПанельФормыПечать = Новый Действие(«КоманднаяПанельФормыПечать»);

    //УниверсальныйОтчет.мДействиеФормыВыполнитьВнешнююОбработку = Новый Действие(«ДействияФормыВыполнитьВнешнююОбработку»);

    //УниверсальныйОтчет.мДействиеКоманднаяПанельФормыСправкаФормы = Новый Действие(«КоманднаяПанельФормыСправкаФормы»);

    //УниверсальныйОтчет.мДействиеВстроеннаяСправкаonclick = Новый Действие(«ВстроеннаяСправкаonclick»);

    //УниверсальныйОтчет.мДействиеВстроеннаяСправкаonmouseout = Новый Действие(«ВстроеннаяСправкаonmouseout»);

    //УниверсальныйОтчет.мДействиеВстроеннаяСправкаonmouseover = Новый Действие(«ВстроеннаяСправкаonmouseover»);

    УниверсальныйОтчет.ФормаПриОткрытии(УниверсальныйОтчет, ЭтотОбъект, ЭтаФорма);

    КонецПроцедуры // ПриОткрытии()

    После этого отчет стал работать.

    Спасибо! Все ок вроде, будем проверять с менеджерами.

    Если какие-то проблемы будут возникать, напишу.

    Просьба в процедуре ПриОткрытии сделать проверку на имя конфигурации, вот код ниже:

    Процедура ПриОткрытии()

    УниверсальныйОтчет.мДействиеПолеВводаВидСравненияПриИзменении = Новый Действие(«ПолеВводаВидСравненияПриИзменении»);

    УниверсальныйОтчет.мДействиеПолеВводаЗначениеПриИзменении = Новый Действие(«ПолеВводаЗначениеПриИзменении»);

    УниверсальныйОтчет.мДействиеКоманднаяПанельФормыПечать = Новый Действие(«КоманднаяПанельФормыПечать»);

    Если не (Метаданные.Имя = «УправлениеТорговлей» и лев(Метаданные.Версия, 4) = «10.3») тогда

    УниверсальныйОтчет.мДействиеФормыВыполнитьВнешнююОбработку = Новый Действие(«ДействияФормыВыполнитьВнешнююОбработку»);

    УниверсальныйОтчет.мДействиеКоманднаяПанельФормыСправкаФормы = Новый Действие(«КоманднаяПанельФормыСправкаФормы»);

    УниверсальныйОтчет.мДействиеВстроеннаяСправкаonclick = Новый Действие(«ВстроеннаяСправкаonclick»);

    УниверсальныйОтчет.мДействиеВстроеннаяСправкаonmouseout = Новый Действие(«ВстроеннаяСправкаonmouseout»);

    УниверсальныйОтчет.мДействиеВстроеннаяСправкаonmouseover = Новый Действие(«ВстроеннаяСправкаonmouseover»);

    КонецЕсли;

    УниверсальныйОтчет.ФормаПриОткрытии(УниверсальныйОтчет, ЭтотОбъект, ЭтаФорма);

    КонецПроцедуры // ПриОткрытии()

    В моей УТ 10.3 стало работать!

    Reply
  25. petronas

    Уважаемые коллеги, небольшое дополнение. Указанные автором свойства должны иметь тип значений «Число».

    Reply
  26. elephant_x

    а в чем отличие от типового?

    Reply
  27. user834350

    Добрый день

    Если можно дайте ссылку на отчет Дебиторская задолженность по срокам долга с учетом дней отсрочки, у меня SM пока не хватает. Очень нужен.

    Reply
  28. echo77

    Свойство завел, заполнил.

    Что я делаю не так?

    Reply
  29. rpgshnik

    (29) попросите деньги вернуть 🙂 с меня автор 1SM трясет за рабочий продукт

    Reply
  30. alexnov

    (30)если бы этот с позволения сказать «продукт» был рабочий не тряс бы.

    Reply
  31. rpgshnik

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

    Reply
  32. alexnov

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

    Reply

Leave a Comment

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