<?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='\
Спасибо! Очень наглядно и понятно!
Добавлено, в архив добрых дел:)
(2) Скажите пожалуйста, где можно взглянуть на этот архив?
Спасибо! Очень полезная статья))
Интересная статья, первый вариант — не всегда понятно что группа свернутая, а остальные варианты со стрелочками дают понять что там что то есть.
Но например у нас, в большинстве случаев пользователь понимает что внутри группы что то есть, но боится нажимать чтобы ничего не сломать, поэтому вторая проблема доказать пользователю что когда развернешь группу ничего не сломается и заполненная тобою форма в течении добрых минут 20 не закроется.
(5) У меня, к счастью, подобных случаев пока что не было. Вы как решаете данную проблему?
Наверное самый лучший вариант это III.
Проблемы 4 и 5 варианта в том, что делается серверный контекстный вызов для изменения видимости элементов формы. При тяжелых формах это бывает довольно затратным. Однако, плюсы 4 и 5 варианта в том, что всегда программно можно узнать состояние группы, свернута или развернута. В типовых сворачиваемых группах этого очень не хватает.
(6) Мы используем agile методолгию Scrum, по ней мы раз в две недели пользователям по видео конференции показываем то что сделали, и вот такие моменты, не только с группами показываем. Например «Кстати вот в этом примере в таблице нет кнопок переместить, но можно нажать еще, и выбрать там кнопку переместить», вообщем так советами при демонстрации повышаем граммотность пользователей)
(7)В принципе начиная с платформы версии 8.3.7 изменения свойства видимости (на чем построены 4 и 5 варианты) уже не требует вызова сервера (см.https://its.1c.ru/db/metod8dev#content:5898:hdoc) . Для этого так же надо чтобы в конфигурации режим совместимости стоял начиная от 8.3.7 и выше.
Но тогда придется продублировать код. т.е. функция
должна разделиться на 2 — одна для сервера, вторая для клиента (к сожалению директива компиляции &НаКлиентеНаСервере в модуле формы недоступна). Для функции же
надо изменить директиву компиляции и сделать ее
.
Я посмотрел, у меня после этих изменения, почему-то все равно идет вызов сервера при сворачивании или разворачивании 4/5 вариантов. Скорее всего неявный. Будет время, разберусь где
(9) Судя по всему, не для всех элементов формы это работает. Если изменять видимость Группы или Табличной части то серверный вызов выполняется. Если элемент связанного с реквизитом формы типа строка, тогда серверного вызова нет.