Проверка 62 счета по оборотам 76.АВ




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

25 Comments

  1. mrWatson

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

    Reply
  2. Арчибальд
  3. levran

    (1) Вроде да. Основа запроса: Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, «62, 76.АВ»,,, 1,, «С»); По-моему валютные должно захватить.

    (2) Точно! есть похожее, что-то я не посмотрел сразу, укажу в описании. Спасибо.

    Reply
  4. IamAlexy

    вопрос конечно же туп но все же: везде всегда и у всех 18/118 ?

    Reply
  5. levran

    (4) видимо у моих бухов ответ: да. =)

    Reply
  6. dummy

    (4) прав… у нас и 10%, и 0%…

    Reply
  7. IamAlexy

    (5) везука..

    Reply
  8. KapasMordorov

    Спасибо автору за +

    Годами все одно и то же пишут. Вендор вместо простых и нужных проверок рисует постоянно неправильно работающих монстров (тех. анализ бух. учета, анализ налогового учета, анализ УСН).

    (4)

    хорошо если сальдо на 76.АВ счетом-фактурой образовано. У меня в практике куча бух. справок была (покупателей много было, контрагентов часто путали).

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

    В http://infostart.ru/projects/4821/ даже и формула имеется…

    Отличия в чем?

    Reply
  10. IamAlexy

    (9) хм.. а как же экспресс-проверка которая в типовых 8ках ?

    вроде ничо так — показывает даже на что обратить в нимание и как исправлять…

    Reply
  11. levran

    (8) Не проверил на инфостаре перед тем как выкладывать 🙁 просьба не пинать ногами… Просто решил поделиться +)

    Reply
  12. levran

    to all чо удалять чтоле? … не охотаааа =)

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

    Удалять не обязательно. С добавленными ссылками на аналоги — вполне корректно. Но на урожай плюсов лучше не рассчитывать :)))

    Reply
  14. KapasMordorov

    (10)

    Всегда есть чудные операции, которые эти монстры не учитывают.

    Самое плохое, что 1С не публикует модели учета (документацию) для этих отчетов — т.е. никогда нельзя знать, всё проверено или что-то пропущено.

    Reply
  15. levran

    (13) А я не для плюсов помещал. Первые обработки да, там для плюсов =) а сейчас, когда рубеж пройден, выкладываю для души и общества.

    Reply
  16. levran

    кстати по поиску «76.АВ» таких обработок на инфостаре море, нашел для бух 8.1 отлично!

    Reply
  17. CheBurator

    Сделать обработку нормальной! Учесть ситуацию, что могут быть ставки и отличные от 18! разложить по ставкам…

    Reply
  18. Adoms

    Безусловно + Замечательная и полезная обработка! Еще бы автоматом на сальдо 62,2 недостающие счета фактуры сформировать 🙂

    Reply
  19. svi1

    В шапке таблицы вместо «Оборот Дт 76.АВ» записано «Оборот Дт 62.АВ»

    Reply
  20. levran

    (19) Спасибо. Исправил.

    Reply
  21. levran

    (17,18) Рекомендую посмотреть обработки которые я нашел по поиску. Авторы уже сделали все что нужно, я просто поторопился с выкладыванием.

    Reply
  22. svi1

    Показал отчет бухам.Понравилось.Захотели отчет по проверке Д62 с К76.АВ.Что было сделано на основе Вашего отчета.

    Reply
  23. levran

    (22) очень рад =)

    Reply
  24. wd2000

    Вместо

    тзКонтрагенты.ОборотКт_62 = Окр(Ит.ДО(),2);

    наверно

    тзКонтрагенты.ОборотКт_62 = Окр(Ит.КО(),2);

    Reply
  25. sh_what

    и должен наверно использовать счет 62.2

    Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, «62.2, 76.АВ»,,, 1,, «С»);

    Reply

Leave a Comment

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