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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *