Универсальное тестирование работоспособности конфигурации




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

16 Comments

  1. Jetoo

    Отбор по метаданным бы!

    Reply
  2. DimanYa

    Обработка одназначно заслуживает внимания.

    Особенно для обновления очень переписанных конфигураций.

    Подкоплю денег и скачаю.

    И поддерживаю Jetoo отбор по метеданным было бы хорошо сделать.

    Reply
  3. intrata

    Отбор по метаданным можно добавить. Если так нужно, будет время — добавлю 🙂

    Reply
  4. kapustinag

    Да, нужная вещь. Делали для себя нечто подобное. Смотрю — есть возможность проверять из форм документов запуск внешних печ.форм. Тогда, может быть, можно и по другим внешним обработкам пройтись? Ясно, что полностью проверить в автоматическом режиме не получится. Но хотя бы запускается/не запускается проверить.

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

    Хотел было предложить — если найдется время на развитие, то можно добавить возможность тестирования под неполными правами. (Скажем, выбирать профиль полномочий, для которых нужна выборочная проверка по отдельным метаданным). Но это на самом деле не требуется. Если обработка делает все это под правами текущего пользователя, то нужно зайти в базу под нужным пользователем и запустить проверку.

    Reply
  5. intrata

    Ну проверять обработки можно добавить.

    Но по правам пользователя… Там на форме вообще забито предупреждение, что запускать обработку и проверять следует только на копии, а там я думаю полные права себе найдете:

    Во-первых: Изменение данных, Во-вторых: Увеличение регистраций объектов в обмене, в объектах доступа, версионировании, так же еще много чего может случится. Так что запускать в центральной работающей базе не рекомендуется.

    Reply
  6. medv

    (5) firma-modul, иногда проявляется вариант, когда не работает именно под пользователями с неполными правами. Возможно это имелось в виду.

    Reply
  7. intrata

    Ну тогда точно нужен отбор по метаданным

    Reply
  8. yandextesting

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

    Reply
  9. intrata

    Спасибо. смотрели, черпали) Но ее там очень долго и сложно настраивать…

    Reply
  10. K_Mixa

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

    Для печатных форм я думаю также будет полезно проверить документы с разными значениями реквизитов составного типа (например в «Реализации товаров и услуг» реквизит сделка может быть разных типов и очень часто программисты дорабатывая печатную форму обращаются к какому либо реквизиту (в данном случае сделки)через точку просто забывают что там может быть совершенно другой объект метаданных)

    А так вещь как я уже сказал должна быть хорошая…

    Reply
  11. intrata

    Ну для детальной проверки нужно подключать конфигурацию по тестированию. Это сложно и затратно по времени. А так лучше проверить хоть так, чем вообще никак.

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

    Любопытно. Возможность фильтра по метаданным и набор различных документов для тестирования была бы хороша.

    Reply
  13. tormozit

    В подсистеме Инструменты разработчика реализован мощный инструмент

    Тестирование метаданных — автоматическая проверка метаданных

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

    Опция тестирования форм путем их создания, открытия и закрытия

    Опция тестирования элементов форм как обычных так и управляемых (меньше), включающая

    Интерактивное изменение полей ввода

    Интерактивное добавление, редактирование, завершение строки в табличных полях и таблицах формы

    Переключение страниц панелей и групп страниц

    Тестирование прикладных объектов путем их создания, копирования, записи, проведения, отмены проведения

    Тестирование внешних метаданных из выбранного каталога

    Отображение результатов в виде полного имени операции и чистого описания ошибки, при выборе которого выполняется переход к строке модуля в конфигураторе

    Reply
  14. serega3333

    в эту бы обработку еще АПДЕКС — индекс производительности прикрутить простейший, цены бы не было

    Reply
  15. Vetal012

    Хорошая обработка !

    Reply
  16. ZhokhovM

    Проверка печатных форм для обычных форм не универсальная, много ошибок в обработке, не качайте!

    Reply

Leave a Comment

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