Универсальный отчет по метаданным




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2018-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='\

31 Comments

  1. mir-inoy

    {ВнешнийОтчет.УниверсальныйОтчетПоМетаданным(703,3)}: Процедура или функция с указанным именем не определена (СообщитьОбОшибке) <>СообщитьОбОшибке(«Настройка формы не записана:» + Символы.ПС + «- » + ОписаниеОшибки());

    Конфа нетиповая.

    Reply
  2. mir-inoy

    исправил на «Сообщить». Начал копать далее.

    {ВнешнийОтчет.УниверсальныйОтчетПоМетаданным(2047)}: Поле объекта не обнаружено (СохраненныеНастройки) ФормаВыбора = Справочники.СохраненныеНастройки.ПолучитьФормуВыбора(, ФормаВладелец);

    Нет у меня такого справочника.

    В целом отчет достоин «+», т.к. у меня в совсем ни разу не типовой он завёлся и показал всё как я захотел.

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

    Reply
  3. sbv2005

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

    Reply
  4. mir-inoy

    (3) А я и подправил, и пользуюсь им уже 🙂

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

    Я считаю, что отчет, который декларируется как работающий в ЛЮБОЙ конфигурации, должен использовать только свои функции и возможности платформы. А тут и справочник дополнительный (отсутствующий в описании), и функция сообщения об ошибке, которая есть только в типовых (по крайней мере в моей нетиповой отсутствует).

    Вобщем за отчет плюсанул, но доработки нужны. Повторюсь, нужны они чтобы описание совпадало с тем, что человек получит, скачивая отчет.

    Reply
  5. kalapuser

    в типовой УТ для Украины:

    {ВнешнийОтчет.УниверсальныйОтчетПоМетаданным(703,3)}: Процедура или функция с указанным именем не определена (СообщитьОбОшибке)

    <<?>>СообщитьОбОшибке(«Настройка формы не записана:» + Символы.ПС + «- » + ОписаниеОшибки());

    что ДЕЛАТЬ ? 😮 🙁

    Reply
  6. Душелов

    (5) А самому добавить эту процедуру не судьба? Или заменить на «Сообщить»?

    Reply
  7. sbv2005

    (1)(5) Отчет поправил:

    «СообщитьОбОшибке» заменено на «Сообщить»

    Reply
  8. kalapuser

    Ура , теперь запускается, но вылез новый глюк

    {Форма.ФормаНастройкиСтруктурыОтчета(1216)}: Поле объекта не обнаружено (УстановитьФлажкиПапка)

    Кнопка.Картинка = БиблиотекаКартинок.УстановитьФлажкиПапка;

    😮 🙁

    Reply
  9. vvr908

    Уже доводилось перетаскивать универсальный отчет в нетиповую (самописную) конфу, намучился немало. Действительно универсальный отчет был бы однозначно полезен, лови +. Как насчет варианта под 8.2? 😉

    Reply
  10. sbv2005

    (8) Спасибо за тестинг. Отчет поправил, выложен обновленный.

    (9) Спасибо за отзыв, коллега )) Над 8.2 будем работать

    Reply
  11. kalapuser

    Теперь работает, спасибо Автору за ценный инструмент 🙂

    Reply
  12. domino_maria

    Я может бестолковый юзер. НО! Искала на сайте отчет по объектам МЕТАДАННЫХ. Нашла этот отчет, порадовалась. Когда сформировала, поняла, что это — отчет ПО ДАННЫМ. Может быть уточните название — я чего-то не понимаю наверное в терминологии. Мне нужен отчет по структуре объекта метаданных «Справочник. Номенклатура» с перечнем реквизитов, табличных частей. А здесь — перечень элементов справочников.

    Reply
  13. sbv2005

    (12) Есть такой отчет, называется кажется «Структура метаданных», он выводит в виде дерева всю конфигурацию. Поищите его.

    Reply
  14. teseii

    все работает, спасибо! 🙂

    Reply
  15. PaRaDoX

    Спасибо за хорошую обработку, вот только с сохранением настроек проблемы, вываливает кучу ошибок…

    Reply
  16. atlent

    Добавил Регистр Оборотов. Если вид ОБОРОТЫ в отчете сменить на ПУСТО, тогда выводит результат, но нельзя установить период. С установленным видом отчета не выводит ничего. Не подскажите в чём может быть дело?

    Reply
  17. sbv2005

    Странно, я проверил работу с регистрами оборотов. Все в порядке. Попробуйте перезайти в отчет.

    Reply
  18. i132

    Жалко что не работают расшифровки — есть ссылки на общие формы: «ПолучитьОбщуюФорму(«ФормаРасшифровкиАналитическихОтчетов», , ФормаОтчета)»

    Reply
  19. 1801

    Отчет просто замечательный! Однако аналитику часто требуется получение сведений из разных регистров накопления для объединения их в одной итоговой таблице. В принципе, все это можно сводить в Excel, что я с успехом и делаю. Но удобней было бы дать возможность отбора сведений из нескольких регистров прямо при построении (настройке) отчета. Пример: регистры разные — остатки, продажи, закупки, резервы, а итоговая таблица одна (содержит сведения о движении товара и расчет потребности в них). Думаю, после таких доработок люди будут готовы покупать эту вещь.

    Reply
  20. pshunailov

    Отчет неплохой, но не работает механизм сохранения/восстановления настроек отчета в УТ 10.3

    Reply
  21. sbv2005

    (19) Думаю, для таких вещей существует СКД (система компоновки данных)

    Reply
  22. 1801

    (21) Спасибо, уже пользуюсь, но в Вашем отчете вроде тоже почти все как в СКД выглядит, да и поудобней он на мой взгляд. (Правда я не программист, но некоторые вещи могу поправить и сам.)

    Reply
  23. leafoe

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

    Reply
  24. land

    Плюс! но есть небольшой минус — не работают настройки колонтитулов….

    Reply
  25. nick_e

    Я вообще не понял для чего этот отчет!

    Reply
  26. sbv2005

    (25) Мне грустно за Вас ((

    Reply
  27. e.kogan

    Хорошо бы ещё поставить проверку на количество объектов выбранного типа в конфигурации. У меня, к примеру, база, в которой нет регистров накопления — так и в отчёт не зайдёшь, пока не поправишь код. Список возможных видов имеет-таки смысл ограничивать.

    Ну и давно хочется видеть в доступных видах метаданных ещё и регистры расчёта, например. Они не сильно сложнее, честное слово.

    Reply
  28. Pterodaptel

    Тож не понял, зачем этот отчёт

    Reply
  29. atugan

    Интересно увидеть количество ссылок, при формировании по документам. а периодичность по документам — это из разряда фантастики?

    Reply
  30. Alia777

    Мне отчет понравился. Настройки прекрасно сохраняются.

    Reply
  31. Юля789

    УТ11. Не открывается.

    Reply

Leave a Comment

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