<?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='\
Хм, А просто условие убрать на полные права и в «иначе» записать
На самом деле не очень страшная история, глядя на название хотелось таких ужасов, чтобы мороз по коже=)
По мне мораль, что все нужно тестировать, прежде чем накатывать.
(1) karpik666
Как посмотреть, если пользователь под полными правами не может зайти ни в один журнал документов, ни провести документ из списка….
Так все и было протестировано, только под неполными правами) Что так будут вести себя «полные права» ожидалось меньше всего)
В итоге да, было убрано условие на полные права ..
Да-да-да, знакомый до боли затык. Влипал я так с полными правами тоже…
История на тему «какие траблы могут случиться, если дорабатывать систему, уже доработанную рукожопами». Да, в общем, любые.
А можно вообще про каждую обнаруженную ошибку статью писать (в принципе, эта статья как раз такая и есть). А можно анекдоты постить. А почему нет, если начисляют по 10 СМ за каждую?
(4) vasyak319, в этой статье кроме обнаруженной ошибки (достаточно серьезной, и, наверное, стоящей того, чтобы поделиться), приведен скромный опыт сокращения запроса РЛС путем передачи фиксированного массива в параметр сеанса и кроме того, нашелся сотоварищ по влипанию в подобную ситуацию. А 10 стартмани это скорее приятный бонус, а не цель…
(5) да все влипали. В кучу разных ситуаций, ибо не оскудела земля русская рукожопами. Мне как-то вообще попалась конфа (КАТАП), доработанная платиново-иридиевым эталоном рукожопа.
Чувак писал что-то вроде:
Показать
ВыбКлиент-список значений на форме отчёта. Уродливые кнопки для его редактирования — всё, как положено. При этом первое, что делала процедура Сформировать — очищала ВыбКлиент и заполняла заново примерно таким же алгоритмом.
В некоторых документах был булевый реквизит, который на форме документа выглядел флажком с заголовком «Орехова Т.». В процедурах ПередЗаписью проверки типа
Итэде итэпэ. И что?
А вы приводите пример заурядной проблемы, причины которой очевидны, способ выяснения проблемных мест очевиден и способ исправления тоже очевиден.
(6) vasyak319,
Видимо в этой организации Иванова Светлана будет работать до победного, а если и уволиться, то в вакансии на ее место будет обязательное требование: Требуется человек с именем «Иванова Света» или изменить на соответствующее в ЗАГС=)
(6) vasyak319, боюсь показаться нудным, но способ сокращения запроса РЛС вроде ничего себе так, хотя и не протестирован на производительность)
Был у меня коллега по фиксе, месяц назад, тоже прогер, скажешь ему пару слов на «родном программистском» — и на душе полегче, да вот уволили по сокращению штатов, так, видимо, везде сейчас. Перекинулся парой слов с вами — и тоже хорошо, тоже большое спасибо.
Скоро напишу «серьезную» статью по РЛС, а тут — извиняйте, ежели чего…
(8) ну так форум что ли отменили?
(9) karpik666, точно, как-то об этом не подумал)
(6) vasyak319, (7) karpik666,
Видимо в этой организации Иванова Светлана будет работать до победного, а если и уволиться, то в вакансии на ее место будет обязательное требование: Требуется человек с именем «Иванова Света» или изменить на соответствующее в ЗАГС=)
А как надо писать?
(11) Templ, как минимум, если конфигурация нетиповая,
Тогда пользователю с любым именем можно назначить функционал Светы Ивановой)
(8)
таки да.
(11) Templ, зависит от ситуации. В том конкретном случае годилось:
или:
или даже:
Запомни, Templ, никаких констант в коде! Никогда! Или я приду за тобой… Не, ну почему в этом форуме нет зловещих смайликов? Вообще никаких нету 🙁
У нас есть вещи и пострашнее констант. Например Запросы в цикле. Соответсвенно тормоза не хилые. (но это не я)
(13) vasyak319, А чем так страшны константы в коде,особенно вне транзакций?
(15) alyaev.a.v, по-моему вы путаете прикладные объекты Константы с термином «константы в коде».
(16) vasyak319, Возможно, я просто подумал коммент про константы относился к «ТекущийПользователь=Константы.ТотЕдинственныйПользовательКоторомуМыРазрешаемУродоватьЗаказ КакБогЧерепаху.Получить()»
а похоже он относился «Если ТекущийПользователь.Наименование=»Иванова Света»»,
попутал 🙂
(5)
Опасная штука. Если массив будет большим, условие (IN) будет выполняться через построчное создание ВТ (сколько элементов массива — столько insert-ов) и левое соединение с ней.
(18) Allexe8.1, спасибо за предупреждение, протестирую.
Предварительно выяснено, что «простые» отчеты из типовой конфигурации формируются со «включенным» РЛС значительно быстрее, чем на стандартных запросах ограничений доступа, проведение документов тоже работает быстро.
Скорость выполнения сложных самописных отчетов увеличивается путем заполнения массива перед формированием отчета теми организациями, по которым установлен отбор, а не всеми доступными. После формирования массив снова заполняется разрешенными организациями.