Особенности разработки во Фреш




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

20 Comments

  1. zeegin

    А чтобы упростить аудит специалистам фреша пользуйтесь АПК, начиная с версии 1.2.1 можно проверять расширения на соответствие стандартам.

    Reply
  2. asved.ru
    В текущем исполнении нельзя разграничить ресурсы процессора и используемой оперативной памяти

    Это не нужно — теряется весь смысл multitenancy. А обрезать ресурсы особенно прожорливым вызовам можно уже сейчас.

    Ограничение пока есть только по занимаемому дисковому пространству

    Вы путаете Фреш и ГРМ.

    Это может дать некоторые послабления при прохождении аудита за счет снижения требований к разработкам.

    Нет, задача аудита не в этом.

    Нельзя одно и то же расширение опубликовать дважды. Придется менять имя расширения

    Немного недоходчиво. В одну ИБ (в том числе разделенную) нельзя установить два расширения с одинаковым именем, даже в различные ОД. Посему добавляйте GUID.

    Передача данных из сервиса должна…

    выполняться на клиенте.

    Используйте расширения безопасности

    Никто вам никакого Excel.Application не даст. И многого другого тоже. В целом лучше обходиться на сервере без небезопасных методов.

    В приложении БП 3.0 доступно АРМ- автономное рабочее место. … Создается ГРМ от нескольких минут …

    Еще раз повторяю: ГРМ — совершенно другой сервис. Не нужно вносить путаницу в терминологию.

    Reply
  3. kwazi

    (1) спасибо. Попробуем

    Reply
  4. kwazi

    (2)

    В приложении БП 3.0 доступно АРМ- автономное рабочее место. … Создается ГРМ от нескольких минут …

    Еще раз повторяю: ГРМ — совершенно другой сервис. Не нужно вносить путаницу в терминологию.

    Имелся в виду АРМ конечно. Поправлю в тексте.

    спасибо

    Reply
  5. kwazi

    (2)

    Используйте расширения безопасности

    Никто вам никакого Excel.Application не даст. И многого другого тоже. В целом лучше обходиться на сервере без небезопасных методов.

    Все верно. Работа с приложениями типа эксель на сервере исключена. Только на клиенте.

    Тем не менее можно использовать ВК. Такие, например, как печать ШК.

    Reply
  6. kwazi

    (2)

    Ограничение пока есть только по занимаемому дисковому пространству

    Вы путаете Фреш и ГРМ.

    Пока нет. Я думаю это вопрос времени. Тем не менее в тарифе КОРП уже есть ограничение по размеру базы (Комплексная автоматизация — до 8 Гб ,

    остальные приложения без ограничений)

    Reply
  7. user619273_alevtina

    Спасибо.

    Reply
  8. zeegin

    (5) Ну, например метод Результат = УправлениеПечатью.ДанныеQRКода(«111», 0, 190); с БСП 3.0.1 доступен в установленном безопасном режиме, его можно вызывать из расширения не требуя установку безопасного.

    Reply
  9. pallid

    (8) может не сюда, но раз речь об АПК и расширения

    стал пробовать проверку, выдает ошибку:

    Обновление конфигурации из хранилища завершилось с ошибкой:

    Соединение основной конфигурации с хранилищем расширений конфигураций невозможно

    Ошибка обновления конфигурации из хранилища

    Reply
  10. kwazi

    (9) флуд не в тему 🙂

    вы похоже не к тому хранилищу цепляетесь. Вам нужно хранилище конфигурации, а вы соединяетесь с хранилищем расширения.

    Reply
  11. DrAku1a

    То чувство, когда работаешь в компании «Фреш 25″…

    Reply
  12. denis1c@

    Статья интересная, как вводная. Давайте продолжение с большими подробностями и примерами.

    Reply
  13. user619273_alevtina

    Статья интересная. Хочется продолжения с примерами.

    Reply
  14. kwazi

    (13) спасибо! Обязательно подумаю.

    Reply
  15. Dipod

    (1)АПК — это автоматизированная проверка конфигураций?

    Reply
  16. zeegin

    (15) Да

    Reply
  17. interests
    По возможности старайтесь не использовать работу с временными файлами на сервере. Для объектов типа ТекстовыйДокумент, JSON, XML это легко решается.

    Подскажите, а как можно загрузить файл XML на клиенте? Если метод ЧтениеXML не работает

    Reply
  18. kwazi

    (17) делайте на сервере. Просто не используйте временные файлы.

    https://wonderland.v8.1c.ru/blog/novye-instrumenty-dlya-raboty-s-dvoichnymi-dannymi-obespechivayut-kak-posledovatelnyy-dostup-k-danny/

    Reply
  19. Tarlich

    Это описание особенностей или реклама ?

    Reply
  20. kwazi

    (19) считайте как вам удобнее. Для себя я выводы уже сделал.

    фреш успешно занял свою нишу. Проект находится в стадии роста — современные тенденции подталкивают к этому. Хотел помочь новичкам.

    Reply

Leave a Comment

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