Отладка сложных отчетов на СКД




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

54 Comments

  1. genayo

    «в консоле запросов»?

    Reply
  2. Бэнни

    Можно более быстро и без лишних движений воспользоваться Инструментами разработчика от TormozIT. Там отладить можно все что угодно

    Reply
  3. leosoft

    (2) Бэнни, а можете статью написать также на конкретном примере?

    Reply
  4. genayo

    (4) Не, правильно Велик и могуч русский языка :))

    Reply
  5. sergathome

    (5) Велик могучим русский языка (с) А.Иванов. Уж если на то пошло. 😉

    В худой котомк поклав ржаное хлебо,

    Я ухожу туда, где птичья звон,

    И вижу над собою синий небо,

    Косматый облак и высокий крон.

    Я дома здесь, я здесь пришел не в гости.

    Снимаю кепк, одетый набекрень.

    Веселый птичк, помахивая хвостик,

    Высвистывает мой стихотворень.

    Зеленый травк ложится под ногами,

    И сам к бумаге тянется рука,

    И я шепчу дрожащие губами:

    «Велик могучим русский языка!»

    Вспыхает небо, разбужая ветер,

    Проснувший гомон птичьих голосов.

    Проклинывая все на белом свете,

    Я вновь бежу в нетоптанность лесов.

    Шуршат зверушки, выбежнув навстречу,

    Приветливыя лапками маша:

    Я среди тут пробуду целый вечер,

    Бессмертные творения пиша.

    Но, выползя на миг из тины зыбкой,

    Болотная зеленовая тварь

    Сувает мне с заботливой улыбкой

    Большой Орфографический словарь.

    (с) Александр Иванов

    Автору топика посвящается.

    Reply
  6. buganov

    (2) и под УФ???

    Я, видимо, пропустил релиз ИР под управляемое приложение

    Reply
  7. adapter

    хорошая статья, спасибо!

    Reply
  8. w.r.

    Что за консоль запросов такая волшебная со вставкой из XML?

    Reply
  9. maxx

    (11)Стандартная консоль запросов с ИТС, в справке в этой консоли можно прочитать про кнопку «Заполнить из XML»

    Reply
  10. w.r.

    (12)

    видимо пользовался более старой версией обработки, где не было такой функции. Скачал с ИТС новую версию. Спасибо!

    Reply
  11. mp40

    Спасибо за статью! Тоже брал итоговый запрос в режиме отладки. Но остальных хитростей не знал.

    Reply
  12. KazanKokos

    (6) Где то на лурке была статья про анальную сексуальность грамар-наци. Автор написал много слов и просто сделал опечатки. )

    Reply
  13. Rustig

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

    Reply
  14. maxx

    (16) Спасибо за поддержку. Конечно извиняюсь за опечатки, но те, кто статьи пишет на Infostart (а не просто тролит ), знает, что там собственный редактор, где эти опечатки, ошибки не показываются, а писать сначала в Word а потом переносить на Infostart это неудобно, если статья со скриншотами, картинками. А хотелось успеть «сдать» статью до Нового года!.

    Reply
  15. sergathome

    (15) ОК, зетс райт. Но мину-сователи-то…

    [ ] — место для дополнительного минуса

    Reply
  16. acanta

    (18) Любите смотреть кино — полюбите и рекламу…

    Reply
  17. user619273_alevtina

    Спасибо за идею.

    Reply
  18. boln

    (6) Эт фигня.

    С НАСТУПАЮЩИМ УРА !!

    Он был московский алкоголец

    И даже ванну не имел

    Она же с роду комсомолец

    И вся полна суровных дел !!

    Однажды случей приключился

    На 31 декабря

    С друзьями в бане он на пился

    И стал зелёная сопля !!

    Они ехидски по шутили

    Сменяв товарищу жильё

    И оказался он в квартире

    Прям на постели у неё !!

    Она при шла и стала плакать

    За что мне Боги это всё

    А он воняит как собака

    И маты разные несёт !!

    Со рвал обои и картины

    Везде на пукал на дышал

    Пришол жених её ревнивный

    И во своясе убежал !!

    А он чего ты при ципилась

    Орёт на целый Ленинград

    Но тут она в него влюбилась

    И даже зделала салат !!

    Он бросил пить с того момента

    И стал вобще как огурец

    Потом на речи президента

    Он ей признался на конец !!

    И туд- же Боги Поднебеси

    Блогословили иху связь

    Потом прошол медовый месец

    И дочка Лиза родилась !!

    С тех пор они друг друга любят

    А таг- же тёща и свекровь

    Я призываю добры люди

    Давайте выпьем за Любовь !!

    https://m.vk.com/wall-59599461_442965

    Reply
  19. le_

    Автор, не могли бы вы уделить 10 минут времени на то, чтобы медленно и внимательно прочитать статью и исправить орфографические ошибки и опечатки?

    Статья годная, но ашипка напригаит читать сделать хароший отчёту.

    Reply
  20. maxx

    (22) Исправил ошибки в тексте

    Reply
  21. maxx

    Добавил возможность подгружать внешние наборы данных в консоле отчётов СКД, описано в статье.

    Reply
  22. tormozit

    (7) ИР выпускается в 3-х вариантах: подсистема, портативный и расширение. В управляемом приложении не работает только портативный. Но в управляемом приложении используются обычные формы.

    Reply
  23. tormozit

    (2) Да. В ИР такая задача решается намного проще и универсальнее. Отладчик кстати строковые значения целиком не показывает и обрезает их примерно после 300К (точнее 320000) символов. Причем от разрядности приложения это не зависит. Поэтому если снимок данных для отладки превысит этот барьер (например при наличии больших входных временных таблиц запроса или наборов данных компоновки), то отладить предложенным в статье способом не выйдет. В ИР такой проблемы нет.

    Reply
  24. maxx

    16.01.2019 Добавлена в расширение для отладки отчетов функция, которая позволяет во время отладки в Конфигураторе выгрузить отлаживаемый отчет во внешний отчет (в файл) со всеми настройками в момент точки остановки

    Reply
  25. LexSeIch

    Мир этому дому! Больше решений — хороших и разных! Автору за труд спасибо. А вообще, в споре истина и рождается: читаешь комментарии и видишь разные подходы для решения одной и той-же задачи, мнения и аргументы, а порой и интересная информация просто так, мимолётом, маленьким вкраплением проскакивает. Критика и обсуждения полезны конструктивные. ИМХО.

    Reply
  26. adapter

    отладка скд — быстрый способ:

    1. точка останова на строке вида

    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиСКД ,,,Тип(«ГенераторМакетаКомпоновкиДанных»));

    2. в отладке получаем результат функции из бсп

    ОбщегоНазначения.ЗначениеВСтрокуXML(МакетКомпоновки)

    3. Консоль СКД из ИТС

    без скд в xml и настроек варианта сразу помещаем текст из п.2 в окно

    «Макет для табличного документа XML» Выполнить в табличный документ с текущим макетом

    прим: Если Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»)

    то используем окно «Макет для коллекции XML»

    Reply
  27. TABEZI1234

    Спасибо

    Reply
  28. avz_1C

    Спасибо за труды.

    Reply
  29. Jestery

    (17) Неплохой прием. Спасибо за труд. Не обращайте внимание на троллей.

    Reply
  30. German_Tagil

    дойдет дело до БП 3.0 — будем разбираться

    Reply
  31. maxx

    (33) БП 3.0 это пример был что в всем понятен, а так со сложными отчётами я прежде всего наоборотался в других конфигурациях в т.ч. и нетиповых, отраслевых

    Reply
  32. tormozit

    (3) Сделал свежее видео https://youtu.be/qVGXWU8w1W0

    Reply
  33. Jestery

    (29) Решил попробовать ваш вариант, скачал консоль СКД , так и не понял где там есть окно «Макет для табличного документа XML» , подскажите пож, если нетрудно подробнее по 3 пункту.

    Reply
  34. adapter
  35. SanchoD

    (29)

    отладка скд — быстрый способ:

    Мне функция вернула обрезанную строку. Ну и естественно в консоли вылезла ошибка.

    Как такие варианты обыгрывать?

    Reply
  36. maxx

    (38) Не понял о какой именно функции говорите. Поподробнее напишите.

    Reply
  37. SanchoD

    (39) Я про ОбщегоНазначения.ЗначениеВСтрокуXML(МакетКомпоновки)

    Получил значение этой функции в отладчике оно заканчивается вот так:

    » …..

    Тогда (ЕстьNull(НаборДанных1.Доход13, 0) — ЕстьNull(НаборДанных1.Вычет, 0) — ЕстьNull(НаборДанных1.ВычетСтан…»

    Т.е. не вывело весь текст. Отсюда и вопрос, как-то можно получить весь, не обрезанный текст возвращаемый этой функцией?

    Ну чтобы дальше уже скормить ее консоли.

    Reply
  38. maxx

    (40) Скорее всего у вас очень большая схема. У отладчика есть ограничение на количество символов в строках переменных.

    Думаю. вам надо обернуть эту функцию ещё в одну, которая скинет строку в текстовый файл.

    Например, в общий модуль добавьте, еще одну функцию

    Функция СохранитьТекстВФайл(ИмяФайла, ТекстСтрока)  Экспорт
    
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.ДобавитьСтроку(ТекстСтрока);
    ТекстДок.Записать(ИмяФайла);
    
    Возврат ИмяФайла;
    
    КонецФункции

    Показать

    Тогда вызов будет в отладке как-то так

    СохранитьТекстВФайл(«d::debug.txt»,ОбщегоНазначения.ЗначениеВСтрокуXML(МакетКомпоновки) )
    Reply
  39. SanchoD

    (41) Понял, спасибо. Тоже пришел к выводу, что надо в файл записывать. Искал готовую функцию в ЗУПе. Не нашел. Без расширения значит никак в типовых не обойтись.

    Reply
  40. Andy_NTG

    Вот эта строчка не работает: ОтладкаСКД.ПолучитьЗапросНабора(СхемаКомпоновкиДанных,КомпоновщикНастроек,»ОсновнойНабор»);

    Табло отладки ругается на то, что переменная ОтладкаСКД не определена.

    Reply
  41. Andy_NTG

    (43) С этим разобрался. Не подключил расширение, оказывается. Но возникла другая проблема в УТ 11.4:

    Строка в табло: ОтладкаСКД.ЗапросВСтрокуXML(ОтладкаСКД.ПолучитьЗапросНабора(СхемаКомпоновкиДанных,КомпоновщикНастроек,»НаборДанных»))

    Результат: {ОтладкаСКД ОбщийМодуль.ОтладкаСКД.Модуль(128)}: Значение не является значением объектного типа (Запрос)

    Reply
  42. maxx

    (44) может быть ваш набор данных в схеме СКД называется не «НаборДанных» а по другому

    Reply
  43. Andy_NTG

    (45) к сожалению, нет. Именно так и называется. Правлю как раз тот же отчёт в УТ 11.4, что и в презентации расширения.

    Reply
  44. Andy_NTG

    На УТ 11.4.10.62 и платформе 8.3.15.1700 не работает обработка, как и писал выше. Полезное расширение. Хочется решить проблему с его работоспособностью.

    Reply
  45. maxx

    (47) Сообщите строку кода, где вы делаете остановку в отладке и какой метод или что не работаете ?

    Reply
  46. Andy_NTG

    (48) Отчёт ДебиторскаяЗадолженность, Модуль объекта, процедура ПриКомпоновкеРезультата, строка 64 (МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных, ДанныеРасшифровки);

    )

    Reply
  47. Andy_NTG

    Максим, не проверял работоспособность расширения ещё? Крутое расширение, но не работает, похоже.

    Reply
  48. maxx

    (49)

    (44)

    ОтладкаСКД.ПолучитьЗапросНабора(СхемаКомпоновкиДанных,КомпоновщикНастроек,»НаборДанных»)

    Вы пытаетесть получить запрос у набора данных с именем «НаборДанных», который является не набор-запросом, а набор-объектом, поэтому и ошибка

    Reply
  49. maxx

    (50) ответил вам выше в (51)

    и просьба писать точнее, не «не расширение не работает», а » у меня не работает ваше расширение на моём конкретном примере, похоже я что-то делаю не так или не разобрался»

    Reply
  50. Andy_NTG

    (52) просьба быть внимательнее. Именно расширение не работает, пока не доказано обратное. Я выполнил все инструкции по подключению. Версию платформы и конфигурации я так же указывал. И не разобрались с вопросом именно Вы или в том числе как минимум.

    Reply
  51. Andy_NTG

    (51) Ваше расширение не работает для версии отчёта в УТ 11.4, получается. Либо нужно менять передаваемые параметры каким-то образом.

    Reply
  52. maxx

    (53)я проверил на УТ 11.4 последней версии, все работает

    Reply
  53. Andy_NTG

    (55) хорошо, я понял. Думаю, есть смысл уточнить в инструкции, как подключать набор-объект кроме набора-запроса.

    Reply

Leave a Comment

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