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




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

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 не будет опубликован. Обязательные поля помечены *