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




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

18 Comments

  1. LavS

    Просьба оставлять комментарии;) Интересно понравилась или нет моя обработка?

    Reply
  2. poppy

    (0)Была написана под «…»(и входит в её поставку)

    Кто автор обработки? Разработчик отраслевой конфигурации или Сергей Лавров?

    Reply
  3. LavS

    Автор обработки — один из разработчиков отраслевой конфигурации Сергей Лавров:) Т.е. я являюсь одним из разработчиков:)

    Reply
  4. anig99

    А чем плоха кнопка Изменить? Там достаточно удобная форма — вытащить её и доработать.

    Reply
  5. LavS

    (5) Основная идея в том, чтобы не дорабатывать конфигурацию! Т.к. тогда возникнут проблемы при обновлении. А так, подключая эту обработку, причём можно подключить её на время, а потом отключить, чтобы пользователи случайно не сделали с её помощью что-либо непоправимое:) Вообще давать такую обработку пользователям опасно. Эта обработка специально для внедренцев, для выполнения ими операций с табличными частями, количество строк в которых очень велико и вручную всё прощёлкивать — нереально долго…

    Reply
  6. anig99

    (6) я не говорю о переделке конфы. я говорю сделать такую обработку на основе уже существующей и сделать её подключаемой.

    Reply
  7. anig99

    (6) и да, кстати, такая обработка в руках не всех пользователей опасна (%

    Reply
  8. LavS

    Было прощё своё сделать, чем в чьём-то разбираться… Как-то на днях нужно было доделать групповую обработку, чтобы она могла один символ в номере документа заменять… Сначала хотел сделать потиповому, начал в коде разбираться… В итоге час потратил(), а результата не получил. Плюнул на это дело и дописал на отдельной панели за 10-15 минут нужный мне алгоритм:)

    Reply
  9. LavS

    А по поводу пользователей — это да:)

    Reply
  10. Maruska77

    Спасибо огромное! Очень удобная обработка!

    Reply
  11. LavS

    (11) Спасибо, что попробовали обработку — мне она тоже нравится:)

    Reply
  12. neirfyxbr

    Экономит время .Спасибо. Давно искала.

    Reply
  13. neirfyxbr

    в Комплексная автоматизация, редакция 1.1 (1.1.34.1) не заполняет по заданной настройке .

    Reply
  14. chmv

    Полезная вещь

    Reply
  15. LavS

    (14) neirfyxbr, А вы в макете Параметры_Авторегистрации прописали список документов и табличных частей(нужно писать имена как в конфигураторе)?

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

    Reply
  16. LavS

    (15) chmv, Рад, что оказалась полезной.

    Reply
  17. Apelsinka

    Искала обработку по редактированию табличных частей документа Корректировка записей регистров, т.к. стандартной обработкой это сделать не возможно… К сожалению, ваш вариант не помог…Даже кнопок не появилось… Может потому что я использовала ее в БГУ ?

    Reply
  18. LavS

    (18) Apelsinka, документ корректировка записей регистров кардинально отличается от всех остальных документов, т.к. использует совсем другие механизмы. Вряд ли существует подобная обработка именно для него, т.к. для корректировки записей регистров — нужно писать специальную обработку.

    Reply

Leave a Comment

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