Примеры отчетов на СКД (система компоновки данных)




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

36 Comments

  1. Русский

    А чего тут принципиально нового по сравнению с теми же отчетами из книги «Хрусталева Е. Ю. Разработка сложных отчетов. СКД»? Вот если бы хотяб показали как с помощью СКД обработать (сложной обработкой) универсальную коллекцию (вместо обычных переборов и методов) тогда бы да, ну или привели пример как настройки связать с элементами управления (не таб. полем, а полями ввода, флажками и пр.), чтоб не лазить каждый раз в форму настройки и все иметь под рукой, вот тогда бы плюс, а так на троечку 🙂

    Reply
  2. MOA2

    Не надо сильно шерстить автора. Мне, как новичку в 8.1, данный материал очень пригодится для самообразования.

    Reply
  3. acsent

    (1) Когда писались эти отчеты, про книгу еще никто не знал.

    Иногда зыбываешь некоторые моменты, а посмотреть негде

    Reply
  4. Zapal

    вещь правильная

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

    хорошо бы еще типа библиотеки функций замутить (УстановитьПараметр() и т.п.), те что в типовых не хватает

    Reply
  5. z-alexey

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

    Reply
  6. z-alexey

    И можно ли из компоновки данных подключиться к другой 1С базе, которая тоже на 8.1 и выдернуть от туда данные? Через COM-например?

    Reply
  7. Vitek

    (6)А тебе с какой целью?

    Можно сначала подключиться, дернуть данные, а потом подсунуть их компоновке.

    Reply
  8. Vitek

    (1)+1. Но в качестве «быстрого старта» нормально.

    (4)А в типовых кстати почти все есть, с расшифровкой только проблемы некоторые…

    Reply
  9. RomDron

    C расшифровкой в последней платформе глюки, если программно настраивать. А так — книга Хрусталева — отличный учебник по СКД — Всем качать!! (я купил)

    Reply
  10. DiDiDi

    Где скачать эту книгу Хрусталева???

    Reply
  11. artbear

    (0) почти не ОФФ 🙂

    Кто-нибудь знает ответ на вопрос по СКД ?

    http://infostart.ru/forum/forum14/topic9440/messages/

    Reply
  12. anig99

    (0) блин… Сделай лучше описание (: А то пол часа искал (: Добавь ключевые слова СКД, система компоновки данных

    Reply
  13. asg1978

    Все хорошо, а вот одним файлом сделать было все отчеты не судьба?

    Reply
  14. baton2008

    Для новичков — нормально, можно чтото потестить, но добавили бы примеры поинтереснее. Особенно в плане вывода информации

    Reply
  15. MrXaN

    Автору большой плюс , но можно 1 архивчик со всеми вариантами отчетов, а то это очень жестоко так раскидывать один по сути материал

    Reply
  16. Stepanstudent

    спасибо за старания.

    Reply
  17. asg1975

    Да лишний раз потренироваться на примерах не помешает!

    Reply
  18. Skellar

    Да отличный материал, правда не хватает примеров работы с макетами в самом скд.

    Reply
  19. extalionos

    Спасибо

    Reply
  20. extalionos

    Спасибо

    Reply
  21. temakozlov

    Спасибо

    Reply
  22. Софтэксперт

    Спасибо! Все очень наглядно!

    Reply
  23. orsprog

    для новичков материал отличный и вполне наглядный а вот как с помощью СКД обработать (сложной обработкой) универсальную коллекцию (вместо обычных переборов и методов)это уже своими мозгами дойдут те кому этого так хочется, не все же за счет чужого потраченного времени и ума…автор молодец

    Reply
  24. kavrov
    orsprog пишет:

    для новичков материал отличный и вполне наглядный а вот как с помощью СКД обработать (сложной обработкой) универсальную коллекцию (вместо обычных переборов и методов)это уже своими мозгами дойдут те кому этого так хочется, не все же за счет чужого потраченного времени и ума…автор молодец

    Полностью согласен

    Reply
  25. Владимир Зайцев

    Рекомендую

    Reply
  26. Владимир Зайцев

    Хорошая обработка

    Reply
  27. eryomenko

    Спасибо, очень пригодилось при изучении СКД

    Reply
  28. leraks

    Как раз изучаю СДД спосибо от меня +

    Reply
  29. EarlyBird

    Полезная штука.

    Reply
  30. ljolsen

    И я с энтим делом маюсь… Денег накоплю и скачаю обязательно

    Автору респект!

    Reply
  31. yak127

    Спасибо, очень полезная информация.

    Reply
  32. mentozavr

    Да дело хорошее для новичков, только они есть в свободном доступе и бесплатно. Автору за работу и ум — респект

    Reply
  33. dins23ib1

    (1) Санёк, вот у меня тоже встал такой же вопрос, если кто нибудь может помочь, отпишитесь

    Reply
  34. KVD77

    статья хоть и старая, но все же. А как сделать вариант «6. По всем контрагентам

    Дополнение отчета всеми контрагентами (через объединение наборов)», но для варианта когда несколько измерений, например документы контрагента, получается если добавить в первый запрос еще одно измерение то по нему никакого дополнения котрагентов не будет, т.к. при объединении со вторым запросом значение добавленого измерения (Документ) будет NULL.

    Reply
  35. bird_777

    надеюсь поможет разобраться с СКД !

    Reply
  36. alex_4x

    Примеры это здорово, и автору спасибо. Но само понятие СКД — это бред Нуралиева.

    Reply

Leave a Comment

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