Оборотно-сальдовая ведомость по счету плоская




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

23 Comments

  1. sytkosa

    Плюсую только за то что это сделанно на СКД, автор развивай продукт

    Reply
  2. molot

    >> Не забываем плюсовать

    За подобный коммент к такому барахлу — минус жирный.

    Reply
  3. MaxS

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

    Есть же описание и скриншоты, которые характеризуют обработку. И если она вам не нужна, то не стоит скачивать ради того, чтобы оценить сложность запросов и функциональную насыщенность. )

    (1) Развиваться будет по мере требования заказчика, а не просто так. 😉

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

    Reply
  4. dimaxx

    +1 Скинь на мыло ) Не могу скачать dimaxx@yandex.ru

    Reply
  5. dimaxx

    Пасиб )

    Reply
  6. sytkosa

    (2) Странно или я отстал от жизни или ОСВ на СКД есть только в Бухгалтерии КОРП… Поэтому развивай продукт… Было бы неплохо если бы получился аналог Интерактивной ОСВ 2.53 для 7-ки

    Reply
  7. molot

    (3) Собственно, разозлила не столько скудная функциональность (каждый волен выкладывать то, что ему кажется полезным), сколько откровенная просьба за это плюсовать. А так — резковато я конечно, извини…

    Reply
  8. MaxS

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

    я вот тоже не люблю спам и просьбы которые сыпятся в интернете. 😉

    (6) Как-то искал ОСВ на СКД, не нашел. Трудно пока загадывать какое будет развитие этой обработки…

    Reply
  9. rasswet

    если даты не выбраны хотелось бы видеть полностью по всей базе

    Reply
  10. rasswet

    подсмотрел как работать с настройками СКД из формы. Раньше выводил таб поле, как Хрусталева пишет, но внешний вид мне там не нра. Заодно узнал новую гл функцию. вобщем мне с этой точки зрения интересно было))

    поучицца)

    Reply
  11. hakim-aka

    Как опыт для для изучения сгодится. Только если внимательно почитать ту же Хрусталеву и побродить по форуму на инфостарте, то можно найти рекомендации: в СКД параметры запроса типа «Дата» оформлять на закладке «Компоновка данных» конструктора запроса. Или тоже самое можно сделать ручками если его взять вот в такие скобки — {(&ДатаОкончания)} прямо в тексте запроса.

    Reply
  12. Регистратор

    Набор стандартных бух отчетов на СКД реализован 1С в Бухгалтерии КОРП

    Reply
  13. GVr

    В УПП 1.2.22.3 странная ошибка:

    {ОбщийМодуль.ОбщегоНазначения(4683)}: Поле объекта не обнаружено (новнаяОрганизация)

    ЗначениеИзПараметраСеанса = ПараметрыСеанса[Сред(ИмяПараметра, 3)];

    Reply
  14. Lidia

    Спасибо. Эх если бы на пару месяцев пораньше, а то пришлось делать «плоский»

    остаток самой. И наконец, работает и для БП, где нет складов,

    все остальные веомости по ТМЦ имеют эту ошибку.

    Reply
  15. MaxS

    (13) поправил

    странно, что код

    Организация = глЗначениеПеременной(«ОсновнаяОрганизация»);

    приводит в ступор УПП

    Reply
  16. Shum23str

    А для БП 2.0 подойдет?

    Reply
  17. Shum23str

    Сам себе отвечаю: да, в 2.0 отлично запустилось и работает

    Reply
  18. 1cvirus

    простенько и со вкусом

    Reply
  19. harisov_r

    Как раз бухгатерии нужно было в Эксел выгрузить количество и сумму по 41 счету. Спасибо! Плюсую.

    Reply
  20. SvetLanaGil

    Спасибо, спасло при формировании инвентаризации по забалансовым счетам.

    Reply
  21. Светлый ум

    Формируется по забалансовым — за это плюс

    Reply
  22. Светлый ум

    Свой аналог состряпал, Отчет по проводкам (плоский) для УПП 1.3, КА 1.1 на СКД:

    http://infostart.ru/public/434760/

    (Обычная и управляемые формы)

    Reply
  23. MaxS

    (22) Светлый ум, там не плоский, а с иерархией, судя по скриншоту. Множество группировок, значит в excel нельзя фильтровать строки, считать итоги по колонке, загружать результат в другую ИБ.

    Reply

Leave a Comment

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