Трассировка кода V8




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

39 Comments

  1. tormozit

    Если запись выполняется сразу (в реальном времени), то это должно ОЧЕНЬ сильно замедлять работу программы. Думаю замедление будет зачастую такое, что никто даже не захочет этим пользоваться. Поэтому если сделано именно так, то рекомендую все таки рассмотреть вариант без записи в бд, а просто строить дерево в памяти.

    Reply
  2. DrAku1a

    А стандартный механизм трассировки от 1С чем плох то?

    Reply
  3. VNSh

    Спасибо, может очень пригодиться.

    В ссылке на тему форума нужен завершающий слэш, иначе она не работает.

    Reply
  4. mr.Kot

    Грусно как-то от того, что усложняется БП от версии к версии.

    Reply
  5. BorisMor

    (2) DrAku1a, а под стандартными вы что подразумеваете ?

    Мне вообще грустно, что нет в 1С нормальной системы логрования (с разбиением сообщений на типы, указанием временем, запись в отдельную базу). На C# пользуюсь библиотекой NLog – любо дорого.

    ps

    Вот моя поделка по этой же теме

    http://infostart.ru/public/127171/

    Reply
  6. vec435

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

    Reply
  7. vec435

    «стандартный» http://infostart.ru/public/101391/

    Reply
  8. DrAku1a

    (5) да, да, именно — (7)

    Reply
  9. DoctorRoza

    Отмечусь, чтобы запомнить, на всякий случай!!

    Reply
  10. BorisMor

    (6) vec435, а как вызвать данное окно?

    Я только стеком пользуюсь.

    Reply
  11. BorisMor

    (8) DrAku1a, это не совсем трассировка.

    Последовательности вызова не вижу.

    Reply
  12. romansun

    (2)

    Есть два инструмента — замер производительности и стек вызовов.

    В замере всё хорошо, только нет одной единственной чертовой колонки… Номера вызова строк по порядку.

    Ну, а стек тоже хорош, но он немного не про то. Попробуйте отрассировать проведение дока, увидите.

    (1) +1, да, надо что-то такое делать, в ДЗ, в xml или еще как-нить. В справочник медленно.

    Reply
  13. romansun

    Я вообще надеюсь на 1С. Весьма непросто разбираться в чем-то новом, в частности на УФ, без мощного набора инструментов.

    У них же модулей теперь немерено, к примеру:

    УчетНДС

    УчетНДСБП

    УчетНДСВызовСервера

    УчетНДСВызовСервераПовтИсп

    УчетНДСКлиентСервер

    УчетНДСПереопределяемый

    Reply
  14. vec435

    (10) BorisMor, это моя обработка. но по сайту можно найти что-то вроде «анализ кода»

    Reply
  15. DrAku1a

    (12) в регистр сведений попробуй. быстро вроде бы…

    Reply
  16. romansun

    (15)

    иеархический справочник хорош и мощен прежде всего своим

    «УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ »

    Собственно, это единственная причина использования справочника. В РС такую штуку сделать нельзя. В принципе, и просто в ДЗ выводить не слишком удобно — удобно иметь иерархическую таблицу, к которой можно писать всякие разные хитрые запросы.

    В данном решении есть еще колонка с временем, но она ни о чем, ибо оно 1С-ное в пределах секунды. Допилить до тысячных, и можно свой замер производительности делать, с блэкджеком и с возможностями снимать производительность попроцедурно, помодульно, «поветочно» и кто как еще придумает.

    Reply
  17. iceflash

    Хм, вспомнил подобное (не по механике, но по смыслу, правда так и не удалось протестировать), из плюсов:

    — без изменения конфы,

    — без тормозов

    из минусов — это именно анализ, «без трассирования прохождения кода на лету при нажатии вот этой кнопоньки» Кстати как насчет стандартного стека вызовов в конфигураторе 1с?

    только анализ кода, и даже более лучше графическое представление:

    http://infostart.ru/public/78976/

    Reply
  18. Yashazz

    За предложение массово менять код типовой конфы как-то очень хочется минуснуть. Или вы потом будете поддержку ручками согласовывать, отслеживать изменения каждого модуля?

    Идея стара как мир, разве что с появлением возможности грузить туда-сюда исходники её реализация упростилась…

    Reply
  19. romansun

    (18)

    поддержку?

    Это инструмент получения данных для изучения конфигурации. По сути, делается это один раз — получается дерево вызовов нужного процесса и отдается системным аналитикам.

    После этого «отработанный материал выбрасывается». Либо база с накопленной статистикой остаётся для дополнительного анализа.

    Reply
  20. bk-81

    (5) BorisMor, а что из перечисленного не умеет ЗаписьЖурналаРегистрации?

    Reply
  21. адуырщдв

    Где то я уже видел такое. Может конечно ошибаюсь.

    Reply
  22. NoRazum

    «;» Не единственная проблема

    Еще когда в начале функции определяются переменные.

    Разные контору пишут одну и туже конфу ))

    Reply
  23. romansun

    (22)

    вычищал вроде все варианты с «перем»… все, да не все 🙂

    если не сложно, скиньте пример такой функции

    Reply
  24. NoRazum

    Бухгалтерия 2.0 последняя конфигурация.

    Общие модули. В некотрых нормально, некоторых ошибка.

    Reply
  25. aim

    Иногда нужно посмотреть «живую» трассу, а иногда нужно посмотреть точки ветвления и от чего программа пошла по этому пути, зависимости. Но это так — к слову. Но вот если верно, что (как Вы пишете), что сложность программы от20 к30 увеличивается на порядок, то это конечно да. Мне уже начало было казаться, что 1С единственная и неповторимая, но при общей непрозрачности 1С кода… 1С может повторить судьбу всех своих монструозных собратьев. Был Мультикс — пришел Юникс; был Windows — пришел Apple, Android и т.д; был IBM x86 — появился ARM.

    Reply
  26. romansun

    (26)

    о, спасибо за коммент.

    Да, согласен со всем. В целом в 1С инструментов маловато и, в принципе, при таком положении дел мы можем получить некие огромнейшие софтины с открытым бесполезным кодом, в которые можно будет только что писать костылики, поскольку объять необъятное будет невозможно просто сидя в отладке.

    Вот очень очень не хотелось бы этого.

    Сложность 2.0-3.0, думаю, раза в два-три выросла с увеличением количества задействованных модулей в 6-7 раз… Ну, это общая 1С-ная тенденция усложнения и платформы и конфигураций. На курсах 1С часто говорят преподы про это — раньше раз-раз и готов специалист, а щас смотришь, а уже не меньше года на подготовку надо.

    Reply
  27. pumbaE

    В связи с выходом новой версии снегопата и возможности его работы в режиме отладки, есть идея использовать данную разработку, как каркас по трассировке кода. Сейчас уже можно поставить две точки останова в начале процедуры, например обработки проведения, и в конце, запустить определенный скрипт, который сам будет нажимать F11 и записывать вызовы в базу.

    Можно ли будет использовать ваш код для этого?

    Reply
  28. romansun

    (28)

    да, конечно, без проблем. Будет очень любопытно взглянуть на результат.

    Reply
  29. pumbaE

    (29) предварительная реализация пока такая http://screencast.com/t/KQvjn99m , вывожу в дерево и даю возможность перейти в необходимую процедуру при клике на строке дерева. В дальнейшем думаю необходимо будет добавить возможность сохранять стек и анализировать. Это пока сырой вариант, но на дерево вызовов в УТ11 иногда уже страшно становиться смотреть.

    Reply
  30. pumbaE

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

    Reply
  31. romansun

    (31) хм…..

    Reply
  32. Paul_Nevada

    Привет!

    Интересно и ДРУГОЕ — КАК сами разработчики типовых не запутываются в этих «деревьях»??? Наверняка же они пользуют какие-то вспомогательные инструменты… У кого из вас есть какие мысли (а, может, и информация) на эту тему?

    Reply
  33. romansun

    (33) СППР используют…

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

    Reply
  34. pumbaE

    (34) сомневаюсь. Вроде и есть тестирование http://v8.1c.ru/o7/201308do/index.htm , но вот почем-то ни разу не хвастаются автоматическим тестированием, покрытием тестами, как регрессионное тестирование позволяет на этапе помещения в хранилище сразу уведомлять разработчика, что есть проблемы с тестами, с производительностью и т.д… Ну а СППР используют, тут согласен 🙂

    Reply
  35. Paul_Nevada

    (34) поясни, пожалуйста, что есть «СППР» и «тестовое покрытие»???

    Reply
  36. romansun

    СППР

    http://v8.1c.ru/model/

    насчет тестирования — читайте про юнит-тестирование, TDD и т.п.

    http://infostart.ru/video/w167567/

    http://habrahabr.ru/post/82842/

    http://forum.infostart.ru/forum26/topic58819/

    Reply
  37. Paul_Nevada

    (37) СПАСИБО!

    Reply
  38. ssa

    Может пригодиться. Спасибо!

    Reply

Leave a Comment

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