Авторегистрация обработок заполнения табличных частей и внешних печатных форм в информационной базе + Видео-пример использования шаблона — создание внешней печатной формы самостоятельно + Универсальный отчет СКД (набор отчетов в одном с группировками уров




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

24 Comments

  1. Borisych
    Reply
  2. Borisych

    Давно пользуюсь таким способом — решил поделиться с общественностью

    Reply
  3. Збянтэжаны Саўка

    сразу видно профессионала по коду! завидую

    возьму методику на заметочку

    Reply
  4. Borisych

    (4) спасибо

    много интересных задач позволяют получить широкие познания

    альтруизм позволяет помогать новичкам и товарищам в решении интересных задач

    Однажды 30 минут потраченные на объяснение по телефону как зарегистрировать внешнюю печатную форму или ОЗТЧ (точно уже не помню), причем с Параметрами_Авторегистрации сподвигли на этот способ, который теперь используется во всех моих ВПФ и ОЗТЧ

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

    Reply
  5. Збянтэжаны Саўка

    (4)

    > вначале проверял присутствие в конфигурации необходимых метаданных

    хех, у меня также возникла эта мысль вчера, после прочтения твоего поста

    Reply
  6. Borisych

    Также товарищи, в качестве комментария можно указывать число (или релиз как типовые конфиги — например, 1.0.1, 1.0.5, преобразовывать его в число 101, 105 и сравнивая — определить, данная версия обработки более свежая чем используемая или нет)

    Reply
  7. apostal86

    Респект, буду пользоваться с удовольствием))

    Reply
  8. warenic

    Оченно пользительный материал. Спасибо.

    Reply
  9. Borisych

    видео-пример лежит также тут: http://files.mail.ru/BDNTCN

    Reply
  10. orsprog

    Респект, буду пользоваться с удовольствием)) много интересных задач позволяют получить широкие познания

    альтруизм позволяет помогать новичкам и товарищам в решении интересных задач

    Reply
  11. itt

    огромное спасибо за видеоурок, но с правильностью набора текста Вам надо что то делать! Видео можно было бы ужать процентов на 30.. ))))

    Reply
  12. Borisych

    (11) это НЕ коммерческий продукт, itt

    Reply
  13. Evgeny-st

    Спасибо, большое! Очень ценная вещь!

    Reply
  14. Borisych

    пожалуйста! надеюсь на следующей неделе сделать пример для подсистемы БСП

    Reply
  15. zveruga56

    Спасибо за шаблон! Уже прикручиваем!

    Reply
  16. Borisych

    (15) На здоровье ! 🙂

    Reply
  17. frc

    (1)

    код к чему прилагается?

    Reply
  18. Borisych

    (17) frc, код формы, назначенной основной для внешней печатной формы. иногда лениво скачивать, чтобы просмотреть фишки обработки, а так — всё понятно

    Reply
  19. frc

    (18)

    а, ну так пометили бы в статье об этом 🙂

    это действительно удобно.

    Reply
  20. NazarovV

    спасибо большое, особенно за видео!просто и понятно, пригодилосьться на практике!

    Reply
  21. Borisych

    (20) NazarovV, пользуйтесь, коллеги. Присылайте запросы на уже готовые решения — вдруг найдется?

    Reply
  22. NazarovV

    (21) ну я вот что сделал! правда не думаю что кому то будет полезно.. специфично сказать — ничего не сказать! http://infostart.ru/public/157142/

    Reply
  23. Zerkon

    Хочу поблагодарить за профессиональный подход к делу )) Сам все время своих коллег заставляю делать все через внешки, как печатные формы, так и всякие довески. Материал хорошо изложен, теперь буду использовать его для примера. Отдельно спасибо за механизм авторегистрации, самому не было времени разбирать типовое решение.

    Reply
  24. Borisych

    (23) Zerkon, Спасибо за приятные слова!

    Reply

Leave a Comment

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