Сервер управленческих отчетов




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

32 Comments

  1. ardn

    Непонятен сценарий использования этого сервера отчетов.

    1. Те аналитики, которых я знаю, уже умеют или учатся пользоваться 1С-ными отчетами. Прикол 1С в том, что она позволяет гибко настроить отчет — вывести нужные поля, настроить отборы и тд. У вас же заранее заданный набор настроек у отчета — программист будет бегать добавлять новые настройки каждый раз, как появится запрос на нестандартный отчет? В конце-концов настроек таких будет миллион, и как с ними будут разбираться пользователи?

    2. Идея хранения отчетов с одной стороны хороша. Но с другой.. База данных постоянно «живет», меняется. Не будет ли проблем с тем, что аналитик воспользуется устаревшими данными?

    У вас реально используется данная разработка?

    Reply
  2. andy23

    (1) ardn,

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

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

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

    2. Почему аналитик должен воспользоваться устаревшими данными? Там подписано когда отчет сформирован, если пользователь решает, что данные устарели он нажимает кнопку «Обновить» и получает обновленный отчет, главное чтобы на стороне 1С была запущена обработка.

    Бывает так, что аналитику трудно по названию отчета понять, что там за информация. В данном случае выбрав отчет из списка, пользователь сразу видит, что он из себя представляет (выводится сохраненный html). Если отчет был давно сформирован, то обновляет его (идет запрос к 1С). Хранятся последние 5-ть сформированных отчетов.

    Да используется.

    Reply
  3. AlX0id

    (2)

    По п.2 — все эти «аналитики» все равно не захотят думать, актуален ли отчет или нет — будут жамкать «Обновить» постоянно. Странный плюс, в общем.

    // ЗЫ. К тому же SQL-сервер так или иначе кэширует результаты одинаковых запросов, так что выигрыш совсем не факт, что будет.

    Reply
  4. andy23

    (3) AlX0id, Ну и пусть себе жмакают. Это не плюс, это такое потребительское качество программы, перед тем как обновить отчет, знать как он выглядит. Ведь есть отчеты которые могут формироваться долго -для пользователя все что >10 сек. уже долго. И «аналитики» могут испытывать разочарование, если это не то, что они ожидали. Здесь же все чётенько увидел-узнал-жмякнул, плюс пока отчет формируется пользователь может пойти посмотреть другие отчеты, т.е. все процедуры асинхронные.

    Reply
  5. aspirator23

    Тоже сталкивался с ситуацией, когда руководитель не хотел запускать 1с.

    Весьма грамотный руководитель. Мне говорит, удобно иметь один всегда актуальный отчет.

    Пришлось тоже на его компьютере разместить экселевский лист, который обновлялся каждые полчаса.

    В котором были все необходимые базовые даные. Их ему было нужно не так много, чтобы владеть ситуацией.

    Касса, расчетный счет, продажи, запасы.

    Было это еще при 7.7. Сейчас бы наверное сделал на веб-сервисах.

    Reply
  6. as

    Идея очень интересная. По сути это упрощенный аналог монитора ERP для УТ 11 и 1С ERP.

    Reply
  7. andy23

    (6) as, ну можно и так сказать… еще хочу прикрутить графики и диаграммы — будет эдакий дашбоард (dashboard)

    примерно вот так это будет выглядеть: http://reportsserver-reportsserver.rhcloud.com/

    Reply
  8. cleaner_it

    (7) интересно попробовать графики. Бета-версию будете выкладывать? )

    Reply
  9. andy23

    (8) cleaner_it, да, планирую

    Reply
  10. Franco

    Скорее напоминает

    https://qubequ.com/

    чем QlikView

    Reply
  11. andy23

    (10) Franco, Посмотрел КуБеКу, что-то 6-ть скриншотов меня не вдохновили, конечно очень интригует «…и многое другое». Пытался узнать цену, она у них высылается по запросу, но в ответ тишина… Думаю, либо они не могут сложить цену на свою программу, либо почуяли конкурента…

    Reply
  12. kostia.lopuhin

    (11) про цену ответили, надеюсь вам пришло письмо.

    Извините если это немного оффтоп, но отвечу про QuBeQu — на мой взгляд наша система скорее ближе к QlikView, чем к Серверу управленческих отчетов — насколько я понял, основная задача у сервера — это представить руководителю в удобном для восприятия виде отчеты из 1С. У нас же цель немного другая (хотя это конечно тоже есть) — по нашему опыту в 1С часто не хватает информации для построения управленческих отчетов и принятия управленческих решений, т.к. система прежде всего бухгалтерская (если говорить допустим про УТ и УП). А у нас можно легко строить отчеты которые из 1С не получишь, довводить рядом свои данные (что люди часто сейчас делают в Excel), например расходы которые не отражаются в бухгалтерии, сводить бюджеты и т.п..

    Мы планируем скоро подробнее описать кейс про интеграцию с 1С (в том числе про сведение нескольких баз).

    Reply
  13. nSpirit2

    Хотелось бы посмотреть как будет выглядеть отчет на 800 позиций плюс. Базу это не разгрузит а как дела с контролем прав ?

    Reply
  14. andy23

    (12) kostia.lopuhin, ух ты сам разработчик ответил! Ну спасибо! Да, довводит данные считаю неплохая задумка. Я сам об этом подумывал в отношении графиков — например, отметить вот с этого числа приняли гениального менеджера и вот смотрите как продажи вверх полезли… Ну я бы не стал говорит, что УТ и УП система прежде бухгалтерская, на этом сайте за такое вас могут закидать помидорами. p.s. А цена что-то так и не пришла…

    Reply
  15. andy23

    (13) nSpirit2, отчет на 800 позиций это простите как? 800 товарных групп? База будет разгружена вот в каком отношении, когда делается запрос из 1С, данные сохраняются в промежуточной БД sqlite, первоначально формируем запрос за весь промежуток работы фирмы (будет долго), ну а потом информация будет подливаться за текущие периоды. Ну про контроль прав: главное сейчас сделать на что хочется посмотреть, а дальше думать как это закрыть 😉

    Reply
  16. kostia.lopuhin

    (14) случайно на эту тему попал, интересная) Написал в ЛС.

    Reply
  17. andy23

    (16) Да получил ответ, спасибо!

    Reply
  18. nSpirit2

    (15) А как тогда быть с изменениями в данных. Если честно не нашел я там данных про sqllite в описании. Эта штука тупо ходит через ком и делает запросы в скд. Причем результат без отборов без группировок и без контроля прав. И работает судя по всему через Web — сервис.

    Идея хорошая надеюсь будет развиваться.

    Reply
  19. cleaner_it

    Есть проблема с извлечением схемы СКД для последующего построения отчета — не нужно обрабатывать спецсимволы. Так, вместо & должен быть &_amp_;- без знаков _. Аналогично со знаками неравенства

    Reply
  20. andy23

    (19) cleaner_it, ок я поправлю, выложу чуть позже, а пока можете сами исправить — открывайте файл ServerReporsNodeJSPortableDataserver.js ищите «_.unescape(» и убирайте эту функцию

    Reply
  21. cleaner_it

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

    Reply
  22. andy23

    (21) cleaner_it, есть возможность указывать период отчета непосредственно на клиенте (браузере) перед формированием отчета, для этого в настройках отчета должен быть включен признак «Использовать период»

    Reply
  23. cleaner_it

    (22) я не это имею в виду. Если в СКД задать период как &МойПериодНачала — исполнитель отчетов его не поймет, он рассчитан на &НачалоПериода

    Reply
  24. cleaner_it

    Для платформы по созданию коммерческих приложений пока сыровато, но задел весьма хороший.

    1. Нужна возможность авторизации

    2. Нужна возможность менять список отчетов местами

    3. Нужен нормальный туториал по созданию простейшего произвольного отчета (именно в произвольных отчетах и находится весь потенциал)

    4. Обработка «Исполнитель отчетов»… Давайте ее переименуем в «Сервер управленческих отчетов».

    Именно она и выступает в роли сервера. Сам сайт взял на себя клиентские функции по выводу данных.

    5. Будет отлично, если администрирование списка отчетов будет происходить на стороне 1С.

    Тогда можно будет и права нормально расписать.

    PS:

    Я бы часть функций вынес в общие модули, а лог в регистр сведений.

    Серьезные дядьки не будут держать постоянно запущенный экземпляр базы с обработкой

    Node.js стоит попробовать не portable, по той-же причине.

    Reply
  25. cleaner_it

    Еще момент, о котором говорили выше — права. Если обеспечить вызов функций из базы под определенным пользователем — то встроенный контроль прав будет работать нормально.

    Reply
  26. andy23

    (24) cleaner_it, Спасибо, за комментарий

    Согласен, что на готовый продукт разработка не тянет. Была мысль, что программа заинтересует разработчиков и будет желание развивать проект совместно до коммерческого варианта. Отсюда и хвалебные оды посвящённые Node.js Считаю, что это мощной штукой с большим будущим, читал что новый Windows будет идти с предустановленным Node.js Вот так! Но значимого интереса я здесь не заметил (

    Все моменты о которых написано можно доработать, в том числе отказ от отдельного экземпляра 1С — открывать сеанс через com-соединение. С portable версией Node.js тоже никаких проблем — она предназначена только для тех, у кого у кого не проинсталлирован Нод.

    Reply
  27. cleaner_it

    (26) у меня есть интерес)

    Часа три ковыряю произвольный тип отчета — не взлетает. Изменения в index.html не отображаются.

    Удаляю целиком весь произвольный отчет — все равно выходит какой-то вариант.

    Уже совсем не работает, никакой вариант.

    Руководство было-бы нелишним, хоть минимальное. Где, что, от чего зависит.

    ////////////////////////////////////////////////////

    Начать хотя-бы с этого

    Движок

    NodeJSPortableDataserver.js

    Панель пользователя

    NodeJSPortableDatapublicuser.html

    Панель администрирования

    NodeJSPortableDatapublicadmin.html

    Отчеты

    NodeJSPortableDataDataInfoBase1Reports

    Список отчетов с настройками (запросы, схема СКД, и т.д.).

    NodeJSPortableDataDataInfoBase1Reports
    eports1.json

    В нем можно поменять порядок следования отчетов.

    Важно! Список отчетов должен быть уложен в одну строку

    {«name»: меняем на
    {«name»:

    Меняем отчеты местами (внимательно смотрим за «,» в конце строк)

    {«name»: меняем на {«name»:

    Произвольные отчеты описываются отдельно, с помощью JS

    NodeJSPortableDataDataInfoBase1ReportsR_№_Outputindex­.html — внешний вид

    NodeJSPortableDataDataInfoBase1ReportsR_№_Outputmodul­e.js — движок

    NodeJSPortableDataDataInfoBase1ReportsR_№_Outputdata.db — заполняется из 1С

    Папка заданий. В этой папке 1С считывает задания, и выполняет их через обработку «ИсполнительЗаданийСерверОтчетов»

    NodeJSPortableDataDataInfoBase1Jobs

    Reply
  28. andy23

    (27) cleaner_it, о у меня в команде появился технический писатель, здорово! )

    >> Удаляю целиком весь произвольный отчет — все равно выходит какой-то вариант.

    как удаляешь, сам каталог?

    Для начала лучше там каталоги/файлы руками не удалять

    я просто не знаю, как ты и что делаешь, давай попробую рассказать как сделать новый произвольный отчет:

    через админку добавляешь новый отчет устанавливаешь тип — пользовательский

    Поле Socket ID — нужно вписать некий уникальный идентификатор, например dolgi

    Далее он понадобиться в index.html

    Если в вкратце, то для транспорта между серверной и клиентской частью используется модуль node.js http://socket.io/ (это удобная обертка для web socket) для этого и нужен этот идентификатор

    Заполняешь текст запроса

    Жмешь кнопку сохранить, далее появиться папка отчета например

    Папка отчета: D:888NodeJSPortableDataDataInfoBase1ReportsR17\r

    Вот туда тебе нужно и положить index.html и module.js

    Чуть позже постараюсь описать про эти файлы

    Reply
  29. cleaner_it

    (28) это пройденный этап) Возможно, дело как раз в сокете. Я удалял отчет и руками, и через админку — но сокет оставлял прежним.

    Если сегодня наберусь сил — покажу на скриншотах

    Reply
  30. deminded

    Я так понимаю подход «Делаем срез данных (запрос) за достаточно большой промежуток времени и сохраняем (это делает обработка на стороне 1С, используется sqlite)» называется «Витрины данных», нечто промежуточное между прямыми отчетами и полноценным OLAP

    Reply
  31. andy23

    (30) deminded, ну типа того — накапливаем информацию в нужными измерениями и ресурсами, в нужных группировка за произвольные периоды. Некий аналог у 1С есть — «агрегат» для регистров, только храниться это здесь во внешней БД. Таким образом не нужно за прошлые периоды обращаться к БД 1С.

    Reply
  32. aaa_pol

    Мануала нет, после установки NodeJSPortable прописывает базу с демоданными, когда подключил к живой УТ11, удивился откуда тут в Справочниках бакалея и ботинки и прочая лабуда в других справочниках, пришлось очистить БД веб сервачка. По умолчанию, в поставке, из отчетов только два: «Остатки денежных средств», «Расчеты с контрагентами» + панель с Спр.Контрагенты; р/с; Номенклатура; структураОрганизации.

    Добавление нового отчета не очевидно, куда прописывать Socket ID? Одним словом надо находить время что бы нырять в код и искать что здесь к чему, хотелось бы решение «достал из коробки и работает», опять же это к вопросу об отсутствии мануала. Вопрос к автору: будьте любезны хотя бы кратко изложить как подключить любой из стандартных отчетов конфигурации?

    Reply

Leave a Comment

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