Вывод ресурса в СКД только один раз, а не во всех группировках




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

    Утро доброе!

    Можете то же самое сбросить, но для РегистраХозрасчетныйОстатки.

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

    Reply
  2. SGordon1

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

    Reply
  3. quebracho

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

    Reply
  4. echo77

    (3) quebracho, нет, здесь именно такое решение нужно

    Reply
  5. echo77

    (2) SGordon1, В Кросс-таблице создаешь не одну, а две группировки по номенклатуре. При чем обе группировки на одном уровне, а не одна вложенная в другую.

    В одной группировке выводишь только Количество, а в другой только Обороты

    Reply
  6. SGordon1

    (5) echo77, спасибо все получилось!

    Reply
  7. quebracho

    (4) echo77,

    Возможно ты недопонял мою мысль. Вместо поле1 в колонки добавляешь группировку «детальные записи», и для нее в выбранных полях также указываешь ресурс «Количество оборот». Эффект получишь идентичный.

    Reply
  8. cleaner_it

    Судя по скриншотам — результат не изменился

    Reply
  9. Vladimir Litvinenko

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

    Решение работающее, кстати его аналог уже был опубликован здесь http://infostart.ru/public/20848/. В свое время эта публикация помогла сделать красивый вывод в СКД, вместо километрового отчета. На комментарии тоже обратите внимание.

    Reply
  10. Fragster

    http://infostart.ru/public/248019/

    То же самое, но ИМХО более правильным способом: без изменения запроса, без создания вычисляемого поля, только с помощью настроек СКД

    Reply
  11. quebracho

    Выходит, публикация жуткий БАЯН 🙂

    Reply
  12. TMV

    (11) quebracho, подобные примитивные вещи уже давно разобраны по профильном сайте об скд.

    Reply
  13. TMV

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

    Reply
  14. Vladimir Litvinenko

    (13) Ну за что же тут минус ставить? Тут приведена ссылка на публикацию 2009 года, которая имеет заголовок, не отражающий суть. Вторая ссылка ведет на вчерашнюю публикацию. А профильный сайт об СКД скорее мертв, чем жив, если Вы имеете ввиду 1cskd.ru.

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

    Reply
  15. PavelZnaikin

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

    Reply
  16. jonybanchicov

    Поставлю + и по чему:

    1.Оформлено на 5.

    2.Суть статьи для начинающих изложена исчерпывающе

    3.Эта статья будет поисковиками проиндексирована, а попробуйте в курсе по СКД найти сразу что нужно. Сам

    помню, как с СКД разбирался по книжке 4 года назад. Вот жуть то была…

    А осуждать Вас, автор и обсуждать нужно! Критика всегда полезна!

    Reply
  17. leotom

    Считаю, довольно понятно изложенно

    Reply
  18. StaticUnsafe

    + только из за оформления

    Reply
  19. tehas

    а как называется программа которой скрины делал такие?

    Reply
  20. bayce

    Решение простого вопроса, но низложено понятным языком.

    Ставлю + статье.

    Reply
  21. laf

    + статье. Много времени уходит у начинающих на отладку и настройку. Подскажите — с какой книги лучше начинать работу с СКД. Каждый раз будто заново начинаю. Где все-таки более систематизировано изложено?

    Сползаю часто на простые отчеты без СКД, т

    Reply
  22. echo77

    (19) tehas, такие скриншоты(точнее эффект рваных краев) можно получить с помощью программы Techsmith snagit и ее программы Snagit editor, которая идет в комплекте

    Reply
  23. gentle

    Спасибо, то что надо!

    Reply
  24. honore

    Спасибо!

    Reply
  25. waol

    Спасибо! сам не дошел до такого трюка. Плюс превосходное оформление статьи

    Reply

Leave a Comment

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