Проверка закрытия авансов по 60 и 62 счетам на любую дату с графическим представлением результатов




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

22 Comments

  1. Димча

    Очень нужная вещь.

    Reply
  2. den_vladimir

    Штука полезная!

    Reply
  3. rounder

    Здорово, давно хотел найти что-то подобное!!!

    Спасибо…

    Reply
  4. Доня

    Пригодится полезная вещь

    Reply
  5. CheBurator

    ндя… а 62.22 и аналогичные — типа ручками делайте по старинке? 😉

    Reply
  6. CheBurator

    Раз людям понравилась эта штучка, то пригодится и вот эта: http://infostart.ru/projects/2957/

    Reply
  7. CheBurator

    Просьба также автору пояснить: «при проверки правильности формирования дебиторской и кредиторской задолженности на любую конкретную дату» — счем это в принципе отличается от обычной ОСВ по счету?

    Reply
  8. kde

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

    Данная программа выбирает только тех контрагентов у которых есть по тем или иным причинам ситуации незакрытых авансов, что более удобно чем работать со стандартной ОСВ

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

    Reply
  9. CheBurator

    (8) ок, понятно.

    тогда уже логично добавить сюда же проверку баланса на СЧФ по оборотке и по записям книг продаж/покупок… т.е. например могут быть ситуации когда по книге продаж счф закрыта в ноль, а по ОСВ — на ней висит остаток (или наоборот)

    Reply
  10. CheBurator

    Интересно, а теханализ БУ ситуации с незачтенными суммами — ловит..? не помню…

    Reply
  11. kde

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

    Насчет теханализа БУ не помню чтобы имелась такая возможность, если и есть то менее наглядная.

    Reply
  12. RayCon

    Задумка хорошая, но сделана как-то «на скорую руку». Рекомендую довести до ума следующим образом:

    1. Сделать чёткую иерархию по уровням субконто (Контрагент -> Договор) с агрегацией данных в отдельных строках.

    2. Вместо статуса выводить сумму остатка. Если остаток не равен нулю, то, очевидно, что аванс не закрыт и наоборот: если равен нулю, то, столь же очевидно, что аванс закрыт.

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

    4. Отработать предложение (5) с обязательным указанием номера бухгалтерского счета и валюты цены договора (в отдельных колонках). В идеале суммы по каждой задолженности надо выводить в две строки: в валюте цены договора и в рублях.

    Предложение (9) весьма разумное, но под него лучше сделать отдельный отчет, целью которого была бы именно выверка НДС посредством сопоставления дебиторки-кредиторки с суммами НДС. Алгоритм будет «тяжелее» на ставки НДС и на револьверные разборы частичного погашения авансов «N в M».

    Reply
  13. Buhgalter

    Уже есть внешний отчет 621_622.ert на этом сайте

    он сделан лучше

    Здесь же всё сыро… неработают кнопки обновить/настройка в печатной форме

    Reply
  14. lidia3004

    Хорошо, когда люди сами делают и с другими делятся

    Reply
  15. kde

    Главное отчет работает и выполняет свои функции.

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

    Reply
  16. bb1962

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

    а целая группа аналогичных по назначению отчетов (в демо варианте — 20):

    http://infostart.ru/projects/4669/

    никому не интересна. Почему?

    Почему этот отчет слаб по содержанию? Потому что при работе «от документа»

    проблемы отсутствия зачета аванса решаются перепроведением

    документов, и именно к этому нужно приучать пользователей. Тем более, что регламентное проведение документов нужно также для правильного расчета себестоимости ТМЦ, обнаружения ряда ошибок типа путаницы с субсчетами учета

    ТМЦ и т.п.

    Почему этот отчет слаб по реализации? Коротко. Если отчет строится по одному контрагенту нельзя выполнять запрос по всем контрагентам, да еще потом

    обрабатывать результат запроса в цикле «до упора», т.е. продолжать цикл даже

    после того, когда нужная запись уже найдена. Это грубая ошибка.

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

    Reply
  17. Арчибальд

    (16) Слабый рабочий вариант всегда предпочтительнее сильного неработающего ;))

    Reply
  18. RayCon

    (16)

    >Удивительно. Явно слабый и по задумке и по реализации отчет столь

    >популярен, а целая группа аналогичных по назначению отчетов (в демо

    >варианте — 20): http://infostart.ru/projects/4669/

    >никому не интересна. Почему?

    Известно почему: халява, сэр. 🙂

    Reply
  19. bb1962

    (18)

    А в чем халява? У нас 20 отчетов, на каждый из них никаких ограничений. Ограничение демо-версии только в том, что в

    каждый момент времени можно использовать один, а не все 20

    сразу. Это равносильно тому, что вы скачали бы двадцать отчетов

    с инфостарта и запускали бы их поочереди. Код закрыт? Так код

    этого отчета никакой ценности не представляет.

    Reply
  20. k_georg

    Может быть кого-то заинтересует не отчет, а документ по зачету и корректировке авансов:

    http://infostart.ru/projects/5016/

    Reply
  21. qazwsxqaz7@rambler.ru

    Очень необходимая вещь!

    Reply
  22. анфиска

    Просто и со вкусом 😀 😀

    Reply

Leave a Comment

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