Отладка дополнительных отчетов и обработок (Управляемые формы 8.3 БСП)




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

27 Comments

  1. dsdred

    А по проще то ни как?

    Почитайте, еще в 8.3.9 появилась Аннотация &Вместо: http://v8.1c.ru/o7/201603module/index.htm

    Есть и другие варианты отладки попроще:

    https://infostart.ru/public/827126/#4P

    Reply
  2. davdykin

    Да, решение со снятием с поддержки конфы не эффективно, посмотрел я «https://infostart.ru/public/827126/#4P» какой-то не очень просто вариант.. там километр кода.

    Когда появились расширения я сделал для основных конфигураций по расширению. В нем я перехватывал:

    1. ПРоцедуру добавления внешней печатной формы из файла и писал путь к файлу в коментарий

    2. Процедуру печати, если в коменте путь к существующему файлу, то открывал его вместо загруженного.

    Таким образом данное расширение весит не много, можно подключать на живые базы, мои узкие задачи — отладка печатных форм, закрыло полностью.

    Reply
  3. dsdred

    (2)

    «https://infostart.ru/public/827126/#4P» какой-то не очень просто вариант.. там километр кода.

    Там статья про регламенты с использованием БСП: Дополнительная обработка и отчеты просто, а в самом низу 4 пункт «Отладка» с ссылкой на статью где около 10 строчек кода и с одной строкой в случае если вы в доп обработке храните параметры и вам надо протестировать с сохраненными параметрами.

    Просто данная статья как я думал будет о том как тестировать доп обработки которые могут быть Командой, регламентом, формой, отчетом… А тут только про команду, да еще и метод который снимает с поддержки.

    Команды вообще тестировать проще до добавления в допы. На форму ссылку на документ вывести и все протестировать, после чего уже добавлять обработку в допы.

    Reply
  4. motorkuzbassa.it

    А зачем снимать с поддержки? модуль же можно в расширение «вместо«, закинуть..не?

    Reply
  5. davdykin

    (3)Чего-то я не понял как вы хотите протестировать печатную форму до подключения? В любом случаи правка конфы — не вариант.. если вы сидите в одной конторе можно копию поправить, а вот если у вас на обслуги фиг пойми сколько… это вообще не вариант.

    Reply
  6. aagubarev

    (4)

    Не слышал, поведайте на примере?

    Reply
  7. dsdred

    (5)

    Чего-то я не понял как вы хотите протестировать печатную форму до подключения

    Наша беседа это тот случай когда комментарии лучше статьи…

    Reply
  8. dsdred

    (6)Шутите?

    Вот пример с вместо

    https://infostart.ru/public/829577/#2P

    В первом комментарии ссылка на 1с с подробной документацией, даже с картинками.

    Reply
  9. v_id

    Намного полезнее devtools освоить

    Reply
  10. davdykin

    (7) Нет, ваш способ мне не нравиться, и вот почему:

    Все-таки у вас процедура вызывается не через стандартные механизмы, соответственно будут «пробелы» в отладке, что, на мой взгляд, не очень удобно., для обычных форм была такая штука, ВнешниеПечатныеФормы.epf, вещь отличная, но не на БСП. Я сделал вот такое расширение, первый раз промаялся долго, в районе получаса часа, затем по аналогии для других конфигураций.

    Пользоваться очень просто:

    1. Подключаем расширение

    2. Загружаем форму во внешние (при этом в коментарии прописывается путь к файлу, который и будет вызывать)

    3. ТЕстируем.

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

    Reply
  11. dsdred

    (10)На вкус и цвет как говорится.

    П.С. Если все комменты собрать и нормально заилюстрировать и по типам команд разбить отличная статья выйдет

    Reply
  12. zeegin

    Доп отчеты и обработки это легаси, используйте расширения.

    Reply
  13. Bassgood

    (9) Осваивать этот большой инструмент только ради отладки внешних обработок?

    Ничего посложнее не нашлось? 😉

    Reply
  14. dsdred

    (12)

    Доп отчеты и обработки это легаси

    Это всего лишь Ваше мнение, а не реальность.

    1 Более менее дорабатывать можно в расшерении с версии 8.3.9, а что делать если режим совместимости 8.3.8 или младше?

    2 Доп обработки позволяют создавать команды, регламенты, формы и т.д. с хранимыми параметрами без добавления констант и прочих прелестей.

    3 Позволяют делать горячее обновление которое не требует перезахода клиентом.

    4 Позволяет легко настраивать видимость под конкретных пользователей.

    П.С. Сам я использую расширения уже более 3-х лет и очень уважаю данную возможность и слежу за развитием, но доп отчеты и обработки в плане регламентов и добавления формы обработки использую регулярно.

    Reply
  15. v_id

    (13)Весь не нужно (хотя полезно со все точек зрения), а в части отладки его установка и запуск проще и лучше документированы чем текущий способ. Обычно следующий вопрос, «а как отладить запрос»

    Reply
  16. Bassgood

    (15) Все зависит от характера работы прогера — если дорабатывает конфиги внешних заказчиков (аутсорс или фриланс), то использование данной подсистемы будет нецелесообразным (для доработок зачастую достаточно пары-тройки внешних консолей и далеко не всегда есть возможность ее встраивания в конфу заказчика), если идет разработка крупного проекта или постоянные доработки своих конфигов (штатный прогер) — другое дело, подсистема будет полезна, а встраивать ее во все базы только ради использования тех же внешних 2-3 консолей — ну как бы и нафиг оно нужно?

    p.s. Плюс подсистема реализована на обычных формах, каждый раз запускать обычный режим приложения для ее использования тоже постепенно начинает вымораживать, нежели простое открытие внешних консолей.

    Reply
  17. v_id

    (16)Похоже вы давно ИР не пользовались. Есть вариант в виде расширения, для отладки достаточно работать под толстым клиентом.

    Reply
  18. acsent

    может проще у обработки сделать форму и там выбирать объект и вызывать команду модуля?

    https://infostart.ru/public/84922/

    Reply
  19. МимохожийОднако

    Любопытно посмотреть применение этого метода на компьютере с базовой версией ) без патчей и кряков ))

    Reply
  20. aagubarev

    Почитал комменты, спасибо за подсказки и критику.

    Reply
  21. aagubarev

    (19)

    Какого именно?

    Reply
  22. МимохожийОднако

    (21) Их много всяких.

    Reply
  23. user858962

    Спасибо автору! Очень помогло.

    Reply
  24. aagubarev

    (23)

    Спасибо Вам, сейчас есть методы попроще)

    Reply
  25. yurikmellon

    (24) огласите весь список, пожалуйста (с)

    Reply
  26. aagubarev

    (25)

    Например: https://infostart.ru/public/73691/

    Reply
  27. yurikmellon

    (26) сенькс

    Reply

Leave a Comment

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