HTTP-сервис: отчеты [Расширение]




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

15 Comments

  1. tanya_charm

    Отличная штука. Пошел тестировать.

    Reply
  2. serg_infostart

    вещщ!

    Команды для получения ссылки можно добавить на форму если добавить общую форму отчета в расширение (если используется общая форма отчета) и определив функцию в расширении формы например ПриСозданииНаСервере(). Там же можно и другие команды заменить/переопределить. Тут хорошо описана работа с расширениями.

    Reply
  3. rus128

    «Все не приметивные типы приводятся к строке.»

    Все хорошо и красиво описано, но типы все-таки примИтивные 🙂

    Еще две опечатки заметил: «как то по идентификатору» (правильнее было бы «как-то») и «А прост.» в последнем абзаце.

    Reply
  4. Stepa86

    (3) Спасибо, поправлю. Лучше такие вещи в личку писать. И в «А прост.» нет опечатки

    (2) Тогда придется всю форму выносить в расширение, и если она изменится в типовой или уже отличается, то могут быть проблемы. Нашел в БСП какой-то механизм «Подключаемые команды», который по идее должен как раз добавлять команды в формы, но как его прикрутить к форме отчета не придумал. В форме отчета так же есть подготовка по использованию этого механизма, но нет места (или я его не нашел), где можно подрубить через расширения свои команды.

    Reply
  5. DrAku1a

    Может можно в рамках того-же HTTP-сервиса сделать страницу со списком отчетов для выбора? Тогда отдельные ссылки будут не нужны.

    Reply
  6. Stepa86

    (5) 1) Я очень сомневаюсь, что такая страничка, генерируемая полностью автоматом, будет полезна. Если и делать, то как это принято в подсистеме отчетов — на каждый раздел своя панель со своими вариантами.

    2) Основная задумка сервиса — сначала настроить что нужно, а потом использовать. Такая форма со списком в нее не укладывается

    Reply
  7. virtex3

    Здравствуйте.

    Нашел ваше замечательное расширение. Но вот к сожалению не сильно понимаю в программировании 1С.

    У меня в конфигурации нет Справочника ВариантыОтчетов.

    Вместо этого у меня есть Справочники.ИдентификаторыОбъектовМетаданных.

    В этом справочник есть Родительский объект «Отчеты» и куча отчетов, которые ссылаются на родительский объект

    Как заставить работать ваше расширение?

    Reply
  8. androgin

    как опубликовать http-сервис из расширения?

    Reply
  9. Lena272

    спасибо огромное за полезный материал и ссылки!

    подскажите, пожалуйста, как добавить http-сервис из расширения в публикацию?

    галку «Публиковать HTTP сервисы расширений по умолчанию» поставила

    в инструкции написано, что это должно помочь

    но ни в списке HTTP сервисов, ни в vrd файле эти сервисы не появились….

    что-то я делаю не так…..

    Reply
  10. Lena272

    получилось опубликовать http сервис из расширения… в списке расширений для публикации он так и не появился, но из браузера стал доступен, при это в файле vrd его тоже нет…

    Reply
  11. Bene_Valete

    (10) Столкнулась с тем же, оказывается так и должно быть) https://wonderland.v8.1c.ru/blog/web-i-http-servisy-v-rasshireniyakh/ «В настройки публикации на веб-сервере мы добавили флаги, которые позволяют вам автоматически опубликовать все Web-сервисы расширений и все HTTP-сервисы расширений: А если у вас возникнет необходимость опубликовать лишь некоторые из них, то вы сможете это сделать вручную, указав нужные сервисы в vrd-файле.»

    Reply
  12. user1078903

    Добрый день!

    Не получается воспользоваться вашим расширением.

    Моя платформа: 1С:Предприятие 8.3 (8.3.13.1513).

    Моя конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.65.72).

    Во-первых, при установке расширения получил следующие ошибки:

    1. HttpСервисОтчеты (1.0.0.0): Значение контролируемого свойства РежимСовместимости у объекта не совпадает со значением в расширяемой конфигурации

    2. HttpСервисОтчеты (1.0.0.0): Не найден объект Роль.БазовыеПрава

    Первую ошибку устранил так: в конфигураторе открыл свойства расширения и сменил режим совместимости с 8.3.8 на 8.3.12.

    Вторую ошибку устранил так: из основной конфигурации добавил в расширение «БазовыеПраваБП», после чего удалил из расширения «БазовыеПрава».

    После этого расширение активировалось, но при попытке получить любой вариант очёта (пробовал с десяток различных имеющихся в конфигурации) получаю пустой документ (будь то HTML, XLS или JSON — везде пусто, форма есть, а данных нету).

    Подскажите, в какую сторону копать.

    Заранее спасибо!

    Reply
  13. Stepa86

    Поддержкой и адаптацией этого расширения я не буду заниматься. Код открыт, на момент публикации все работало на актуальной на тот момент БСП.

    Reply
  14. Stepa86

    (14) Мне это не интересно

    Reply
  15. acanta

    Спасибо, очень интересно.

    Reply

Leave a Comment

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