Материальный отчет МХ-20 для БП 3.0




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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. WrongLane

    Хороший отчет.

    Только учетная цена почему-то не заполняется.

    Можно это исправить?

    Reply
  2. Омский Домовой

    (1) WrongLane, Добавить можно, но вот без партионного учета что будет являться данными для вычисления той самой учетной ценой (начальное сальдо, конечное сальдо или комбинации оборотов и сальдо) Я просто даже не задумывался над этим вопросом (да и заказчик не просил). А действительно скажи формулу расчета и приделаем цену.

    Reply
  3. mdie

    (2) я сделал так: взял остаток суммы и поделил на количество в остатке

    Reply
  4. berator37

    А можно по e-mail

    Reply
  5. Омский Домовой

    (3) mdie, А если остатка нет на конец но есть обороты. Это длинная, спорная тема. На самом деле там не сложно подпилить под себя так как хочется.

    Reply
  6. Омский Домовой

    (4) berator37, Смотря что

    Reply
  7. mdie

    (5) ну меня попросили реализовать расчет цены по аналогии с инвентаризацией — вот и сделал :-). Спасибо за шикарнейший вариант на СКД

    Reply
  8. kauksi

    Пишет Поле не найдено «Организация» в версии 32.7

    Reply
  9. Омский Домовой

    (8) kauksi, Только что проверил на 3.0.32.7 работет. Может что нибудь в настройках пошевелили?

    Reply
  10. starjevschik

    подтверждаю ошибку (8) kauksi — действительно такая ошибка на такой версии.

    Разбираться не стал, нашел другой рабочий вариант.

    Reply
  11. Омский Домовой

    (10) starjevschik, Прошу прощения обновленная версия действительно загоняет.Сейчас постараюсь исправить.

    Reply
  12. Омский Домовой

    (10) starjevschik, Видимо глюк релиза. Однако причину так и не нашел. При обновлении на 3.0.33.15 работает. Кроме того добавил подитоги по субсчетам

    Reply
  13. polos75

    Подтверждаю, 3.0.33.19 — ошибка есть.

    Удалил Организацию из набора и из макетов — отчёт заработал. Дальше не разбирался.

    Reply
  14. Julia99990

    Отчет не работает, пишет поле «Организация.ОКПО» не может быть использовано в группировке «Склад», в версии 3.0.36.11

    Reply
  15. Омский Домовой

    (14) Julia99990, Думаю не сложно поправить. Обработка на этом релизе не тестировалась

    Reply
  16. cmpros78

    Не выводится учетная цена

    Reply
  17. egvv

    БП 3,0 релиз 3,0,44,200 — запустил, работает. Автору респект!

    Reply
  18. Ludmilka

    Не работает! Пишет поле «Организация.ОКПО» не может быть использовано в группировке «Склад». Как исправить?

    Reply
  19. German_Tagil

    (18) Тоже самое — не работает

    Reply
  20. Омский Домовой

    (18) Схему компановки посмотреть нужно в конце концов убрать проблемную группировку

    Reply
  21. German_Tagil

    Там не в схеме компоновки дело — в макете

    Reply
  22. Омский Домовой

    (21) Ну так а макет где? Разве не в СКД? (Если честно я сам уже не помню что там делал)

    Reply

Leave a Comment

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