<?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С чем плох то?
Спасибо, может очень пригодиться.
В ссылке на тему форума нужен завершающий слэш, иначе она не работает.
Грусно как-то от того, что усложняется БП от версии к версии.
(2) DrAku1a, а под стандартными вы что подразумеваете ?
Мне вообще грустно, что нет в 1С нормальной системы логрования (с разбиением сообщений на типы, указанием временем, запись в отдельную базу). На C# пользуюсь библиотекой NLog – любо дорого.
ps
Вот моя поделка по этой же теме
если построить дерево вызовов только на основе выгруженных модулей то это сократит время при отладке
«стандартный»
(5) да, да, именно — (7)
Отмечусь, чтобы запомнить, на всякий случай!!
(6) vec435, а как вызвать данное окно?
Я только стеком пользуюсь.
(8) DrAku1a, это не совсем трассировка.
Последовательности вызова не вижу.
(2)
Есть два инструмента — замер производительности и стек вызовов.
В замере всё хорошо, только нет одной единственной чертовой колонки… Номера вызова строк по порядку.
Ну, а стек тоже хорош, но он немного не про то. Попробуйте отрассировать проведение дока, увидите.
(1) +1, да, надо что-то такое делать, в ДЗ, в xml или еще как-нить. В справочник медленно.
Я вообще надеюсь на 1С. Весьма непросто разбираться в чем-то новом, в частности на УФ, без мощного набора инструментов.
У них же модулей теперь немерено, к примеру:
УчетНДС
УчетНДСБП
УчетНДСВызовСервера
УчетНДСВызовСервераПовтИсп
УчетНДСКлиентСервер
УчетНДСПереопределяемый
(10) BorisMor, это моя обработка. но по сайту можно найти что-то вроде «анализ кода»
(12) в регистр сведений попробуй. быстро вроде бы…
(15)
иеархический справочник хорош и мощен прежде всего своим
«УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ »
Собственно, это единственная причина использования справочника. В РС такую штуку сделать нельзя. В принципе, и просто в ДЗ выводить не слишком удобно — удобно иметь иерархическую таблицу, к которой можно писать всякие разные хитрые запросы.
В данном решении есть еще колонка с временем, но она ни о чем, ибо оно 1С-ное в пределах секунды. Допилить до тысячных, и можно свой замер производительности делать,
с блэкджеком ис возможностями снимать производительность попроцедурно, помодульно, «поветочно» и кто как еще придумает.Хм, вспомнил подобное (не по механике, но по смыслу, правда так и не удалось протестировать), из плюсов:
— без изменения конфы,
— без тормозов
из минусов — это именно анализ, «без трассирования прохождения кода на лету при нажатии вот этой кнопоньки» Кстати как насчет стандартного стека вызовов в конфигураторе 1с?
только анализ кода, и даже более лучше графическое представление:
За предложение массово менять код типовой конфы как-то очень хочется минуснуть. Или вы потом будете поддержку ручками согласовывать, отслеживать изменения каждого модуля?
Идея стара как мир, разве что с появлением возможности грузить туда-сюда исходники её реализация упростилась…
(18)
поддержку?
Это инструмент получения данных для изучения конфигурации. По сути, делается это один раз — получается дерево вызовов нужного процесса и отдается системным аналитикам.
После этого «отработанный материал выбрасывается». Либо база с накопленной статистикой остаётся для дополнительного анализа.
(5) BorisMor, а что из перечисленного не умеет ЗаписьЖурналаРегистрации?
Где то я уже видел такое. Может конечно ошибаюсь.
«;» Не единственная проблема
Еще когда в начале функции определяются переменные.
Разные контору пишут одну и туже конфу ))
(22)
вычищал вроде все варианты с «перем»… все, да не все 🙂
если не сложно, скиньте пример такой функции
Бухгалтерия 2.0 последняя конфигурация.
Общие модули. В некотрых нормально, некоторых ошибка.
Иногда нужно посмотреть «живую» трассу, а иногда нужно посмотреть точки ветвления и от чего программа пошла по этому пути, зависимости. Но это так — к слову. Но вот если верно, что (как Вы пишете), что сложность программы от20 к30 увеличивается на порядок, то это конечно да. Мне уже начало было казаться, что 1С единственная и неповторимая, но при общей непрозрачности 1С кода… 1С может повторить судьбу всех своих монструозных собратьев. Был Мультикс — пришел Юникс; был Windows — пришел Apple, Android и т.д; был IBM x86 — появился ARM.
(26)
о, спасибо за коммент.
Да, согласен со всем. В целом в 1С инструментов маловато и, в принципе, при таком положении дел мы можем получить некие огромнейшие софтины с открытым бесполезным кодом, в которые можно будет только что писать костылики, поскольку объять необъятное будет невозможно просто сидя в отладке.
Вот очень очень не хотелось бы этого.
Сложность 2.0-3.0, думаю, раза в два-три выросла с увеличением количества задействованных модулей в 6-7 раз… Ну, это общая 1С-ная тенденция усложнения и платформы и конфигураций. На курсах 1С часто говорят преподы про это — раньше раз-раз и готов специалист, а щас смотришь, а уже не меньше года на подготовку надо.
В связи с выходом новой версии снегопата и возможности его работы в режиме отладки, есть идея использовать данную разработку, как каркас по трассировке кода. Сейчас уже можно поставить две точки останова в начале процедуры, например обработки проведения, и в конце, запустить определенный скрипт, который сам будет нажимать F11 и записывать вызовы в базу.
Можно ли будет использовать ваш код для этого?
(28)
да, конечно, без проблем. Будет очень любопытно взглянуть на результат.
(29) предварительная реализация пока такая , вывожу в дерево и даю возможность перейти в необходимую процедуру при клике на строке дерева. В дальнейшем думаю необходимо будет добавить возможность сохранять стек и анализировать. Это пока сырой вариант, но на дерево вызовов в УТ11 иногда уже страшно становиться смотреть.
(0) как идея — включаем тех журнал на CALL, парсим его и получаем фактические вызовы строк и примерно как я в снегопате при отладке делаю, определяю в какой процедуре находится строка и сверяю с предыдущей , получаем дерево вызовов даже без модификации исходных текстов.
(31) хм…..
Привет!
Интересно и ДРУГОЕ — КАК сами разработчики типовых не запутываются в этих «деревьях»??? Наверняка же они пользуют какие-то вспомогательные инструменты… У кого из вас есть какие мысли (а, может, и информация) на эту тему?
(33) СППР используют…
плюс, я думаю, у них есть неплохое тестовое покрытие
(34) сомневаюсь. Вроде и есть тестирование , но вот почем-то ни разу не хвастаются автоматическим тестированием, покрытием тестами, как регрессионное тестирование позволяет на этапе помещения в хранилище сразу уведомлять разработчика, что есть проблемы с тестами, с производительностью и т.д… Ну а СППР используют, тут согласен 🙂
(34) поясни, пожалуйста, что есть «СППР» и «тестовое покрытие»???
СППР
насчет тестирования — читайте про юнит-тестирование, TDD и т.п.
(37) СПАСИБО!
Может пригодиться. Спасибо!