<?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='\
Непонятен сценарий использования этого сервера отчетов.
1. Те аналитики, которых я знаю, уже умеют или учатся пользоваться 1С-ными отчетами. Прикол 1С в том, что она позволяет гибко настроить отчет — вывести нужные поля, настроить отборы и тд. У вас же заранее заданный набор настроек у отчета — программист будет бегать добавлять новые настройки каждый раз, как появится запрос на нестандартный отчет? В конце-концов настроек таких будет миллион, и как с ними будут разбираться пользователи?
2. Идея хранения отчетов с одной стороны хороша. Но с другой.. База данных постоянно «живет», меняется. Не будет ли проблем с тем, что аналитик воспользуется устаревшими данными?
У вас реально используется данная разработка?
(1) ardn,
1. Есть аналитики которым совсем трудно в 1С и настроить отборы для них проблема. С другой стороны, есть отчеты, которые не требуют особых настроек и там не нужна такого рода гибкость.
Сценарий использования — есть директор фирмы — умеет открывать браузер, фэйсбук знает, вконтакте знает, 1С не знает. Хочет смотреть остатки денег, продажи, долги.
Отчетов может быть много, для этого там есть поиск. Но если их будет еще больше, то конечно можно реализовать систему тэгов, фильтров и т.п.
2. Почему аналитик должен воспользоваться устаревшими данными? Там подписано когда отчет сформирован, если пользователь решает, что данные устарели он нажимает кнопку «Обновить» и получает обновленный отчет, главное чтобы на стороне 1С была запущена обработка.
Бывает так, что аналитику трудно по названию отчета понять, что там за информация. В данном случае выбрав отчет из списка, пользователь сразу видит, что он из себя представляет (выводится сохраненный html). Если отчет был давно сформирован, то обновляет его (идет запрос к 1С). Хранятся последние 5-ть сформированных отчетов.
Да используется.
(2)
По п.2 — все эти «аналитики» все равно не захотят думать, актуален ли отчет или нет — будут жамкать «Обновить» постоянно. Странный плюс, в общем.
// ЗЫ. К тому же SQL-сервер так или иначе кэширует результаты одинаковых запросов, так что выигрыш совсем не факт, что будет.
(3) AlX0id, Ну и пусть себе жмакают. Это не плюс, это такое потребительское качество программы, перед тем как обновить отчет, знать как он выглядит. Ведь есть отчеты которые могут формироваться долго -для пользователя все что >10 сек. уже долго. И «аналитики» могут испытывать разочарование, если это не то, что они ожидали. Здесь же все чётенько увидел-узнал-жмякнул, плюс пока отчет формируется пользователь может пойти посмотреть другие отчеты, т.е. все процедуры асинхронные.
Тоже сталкивался с ситуацией, когда руководитель не хотел запускать 1с.
Весьма грамотный руководитель. Мне говорит, удобно иметь один всегда актуальный отчет.
Пришлось тоже на его компьютере разместить экселевский лист, который обновлялся каждые полчаса.
В котором были все необходимые базовые даные. Их ему было нужно не так много, чтобы владеть ситуацией.
Касса, расчетный счет, продажи, запасы.
Было это еще при 7.7. Сейчас бы наверное сделал на веб-сервисах.
Идея очень интересная. По сути это упрощенный аналог монитора ERP для УТ 11 и 1С ERP.
(6) as, ну можно и так сказать… еще хочу прикрутить графики и диаграммы — будет эдакий дашбоард (dashboard)
http://reportsserver-reportsserver.rhcloud.com/
примерно вот так это будет выглядеть:
(7) интересно попробовать графики. Бета-версию будете выкладывать? )
(8) cleaner_it, да, планирую
Скорее напоминает
https://qubequ.com/
чем QlikView
(10) Franco, Посмотрел КуБеКу, что-то 6-ть скриншотов меня не вдохновили, конечно очень интригует «…и многое другое». Пытался узнать цену, она у них высылается по запросу, но в ответ тишина… Думаю, либо они не могут сложить цену на свою программу, либо почуяли конкурента…
(11) про цену ответили, надеюсь вам пришло письмо.
Извините если это немного оффтоп, но отвечу про QuBeQu — на мой взгляд наша система скорее ближе к QlikView, чем к Серверу управленческих отчетов — насколько я понял, основная задача у сервера — это представить руководителю в удобном для восприятия виде отчеты из 1С. У нас же цель немного другая (хотя это конечно тоже есть) — по нашему опыту в 1С часто не хватает информации для построения управленческих отчетов и принятия управленческих решений, т.к. система прежде всего бухгалтерская (если говорить допустим про УТ и УП). А у нас можно легко строить отчеты которые из 1С не получишь, довводить рядом свои данные (что люди часто сейчас делают в Excel), например расходы которые не отражаются в бухгалтерии, сводить бюджеты и т.п..
Мы планируем скоро подробнее описать кейс про интеграцию с 1С (в том числе про сведение нескольких баз).
Хотелось бы посмотреть как будет выглядеть отчет на 800 позиций плюс. Базу это не разгрузит а как дела с контролем прав ?
(12) kostia.lopuhin, ух ты сам разработчик ответил! Ну спасибо! Да, довводит данные считаю неплохая задумка. Я сам об этом подумывал в отношении графиков — например, отметить вот с этого числа приняли гениального менеджера и вот смотрите как продажи вверх полезли… Ну я бы не стал говорит, что УТ и УП система прежде бухгалтерская, на этом сайте за такое вас могут закидать помидорами. p.s. А цена что-то так и не пришла…
(13) nSpirit2, отчет на 800 позиций это простите как? 800 товарных групп? База будет разгружена вот в каком отношении, когда делается запрос из 1С, данные сохраняются в промежуточной БД sqlite, первоначально формируем запрос за весь промежуток работы фирмы (будет долго), ну а потом информация будет подливаться за текущие периоды. Ну про контроль прав: главное сейчас сделать на что хочется посмотреть, а дальше думать как это закрыть 😉
(14) случайно на эту тему попал, интересная) Написал в ЛС.
(16) Да получил ответ, спасибо!
(15) А как тогда быть с изменениями в данных. Если честно не нашел я там данных про sqllite в описании. Эта штука тупо ходит через ком и делает запросы в скд. Причем результат без отборов без группировок и без контроля прав. И работает судя по всему через Web — сервис.
Идея хорошая надеюсь будет развиваться.
Есть проблема с извлечением схемы СКД для последующего построения отчета — не нужно обрабатывать спецсимволы. Так, вместо & должен быть &_amp_;- без знаков _. Аналогично со знаками неравенства
(19) cleaner_it, ок я поправлю, выложу чуть позже, а пока можете сами исправить — открывайте файл ServerReporsNodeJSPortableDataserver.js ищите «_.unescape(» и убирайте эту функцию
(20) я написал отзыв уже после того, как разобрался с причиной) И с параметрами еще проблема была, насколько я помню (период в отчетах задается только предопределенными параметрами)
(21) cleaner_it, есть возможность указывать период отчета непосредственно на клиенте (браузере) перед формированием отчета, для этого в настройках отчета должен быть включен признак «Использовать период»
(22) я не это имею в виду. Если в СКД задать период как &МойПериодНачала — исполнитель отчетов его не поймет, он рассчитан на &НачалоПериода
Для платформы по созданию коммерческих приложений пока сыровато, но задел весьма хороший.
1. Нужна возможность авторизации
2. Нужна возможность менять список отчетов местами
3. Нужен нормальный туториал по созданию простейшего произвольного отчета (именно в произвольных отчетах и находится весь потенциал)
4. Обработка «Исполнитель отчетов»… Давайте ее переименуем в «Сервер управленческих отчетов».
Именно она и выступает в роли сервера. Сам сайт взял на себя клиентские функции по выводу данных.
5. Будет отлично, если администрирование списка отчетов будет происходить на стороне 1С.
Тогда можно будет и права нормально расписать.
PS:
Я бы часть функций вынес в общие модули, а лог в регистр сведений.
Серьезные дядьки не будут держать постоянно запущенный экземпляр базы с обработкой
Node.js стоит попробовать не portable, по той-же причине.
Еще момент, о котором говорили выше — права. Если обеспечить вызов функций из базы под определенным пользователем — то встроенный контроль прав будет работать нормально.
(24) cleaner_it, Спасибо, за комментарий
Согласен, что на готовый продукт разработка не тянет. Была мысль, что программа заинтересует разработчиков и будет желание развивать проект совместно до коммерческого варианта. Отсюда и хвалебные оды посвящённые Node.js Считаю, что это мощной штукой с большим будущим, читал что новый Windows будет идти с предустановленным Node.js Вот так! Но значимого интереса я здесь не заметил (
Все моменты о которых написано можно доработать, в том числе отказ от отдельного экземпляра 1С — открывать сеанс через com-соединение. С portable версией Node.js тоже никаких проблем — она предназначена только для тех, у кого у кого не проинсталлирован Нод.
(26) у меня есть интерес)
Часа три ковыряю произвольный тип отчета — не взлетает. Изменения в index.html не отображаются.
Удаляю целиком весь произвольный отчет — все равно выходит какой-то вариант.
Уже совсем не работает, никакой вариант.
Руководство было-бы нелишним, хоть минимальное. Где, что, от чего зависит.
////////////////////////////////////////////////////
Начать хотя-бы с этого
Движок
NodeJSPortableDataserver.js
Панель пользователя
NodeJSPortableDatapublicuser.html
Панель администрирования
NodeJSPortableDatapublicadmin.html
Отчеты
NodeJSPortableDataDataInfoBase1Reports
Список отчетов с настройками (запросы, схема СКД, и т.д.).
NodeJSPortableDataDataInfoBase1Reports
eports1.json
В нем можно поменять порядок следования отчетов.
Важно! Список отчетов должен быть уложен в одну строку
{«name»: меняем на
{«name»:
Меняем отчеты местами (внимательно смотрим за «,» в конце строк)
{«name»: меняем на {«name»:
Произвольные отчеты описываются отдельно, с помощью JS
.html — внешний вид
e.js — движок
NodeJSPortableDataDataInfoBase1ReportsR_№_Outputindex
NodeJSPortableDataDataInfoBase1ReportsR_№_Outputmodul
NodeJSPortableDataDataInfoBase1ReportsR_№_Outputdata.db — заполняется из 1С
Папка заданий. В этой папке 1С считывает задания, и выполняет их через обработку «ИсполнительЗаданийСерверОтчетов»
NodeJSPortableDataDataInfoBase1Jobs
(27) cleaner_it, о у меня в команде появился технический писатель, здорово! )
http://socket.io/ (это удобная обертка для web socket) для этого и нужен этот идентификатор
>> Удаляю целиком весь произвольный отчет — все равно выходит какой-то вариант.
как удаляешь, сам каталог?
Для начала лучше там каталоги/файлы руками не удалять
я просто не знаю, как ты и что делаешь, давай попробую рассказать как сделать новый произвольный отчет:
через админку добавляешь новый отчет устанавливаешь тип — пользовательский
Поле Socket ID — нужно вписать некий уникальный идентификатор, например dolgi
Далее он понадобиться в index.html
Если в вкратце, то для транспорта между серверной и клиентской частью используется модуль node.js
Заполняешь текст запроса
Жмешь кнопку сохранить, далее появиться папка отчета например
Папка отчета: D:888NodeJSPortableDataDataInfoBase1ReportsR17\r
Вот туда тебе нужно и положить index.html и module.js
Чуть позже постараюсь описать про эти файлы
(28) это пройденный этап) Возможно, дело как раз в сокете. Я удалял отчет и руками, и через админку — но сокет оставлял прежним.
Если сегодня наберусь сил — покажу на скриншотах
Я так понимаю подход «Делаем срез данных (запрос) за достаточно большой промежуток времени и сохраняем (это делает обработка на стороне 1С, используется sqlite)» называется «Витрины данных», нечто промежуточное между прямыми отчетами и полноценным OLAP
(30) deminded, ну типа того — накапливаем информацию в нужными измерениями и ресурсами, в нужных группировка за произвольные периоды. Некий аналог у 1С есть — «агрегат» для регистров, только храниться это здесь во внешней БД. Таким образом не нужно за прошлые периоды обращаться к БД 1С.
Мануала нет, после установки NodeJSPortable прописывает базу с демоданными, когда подключил к живой УТ11, удивился откуда тут в Справочниках бакалея и ботинки и прочая лабуда в других справочниках, пришлось очистить БД веб сервачка. По умолчанию, в поставке, из отчетов только два: «Остатки денежных средств», «Расчеты с контрагентами» + панель с Спр.Контрагенты; р/с; Номенклатура; структураОрганизации.
Добавление нового отчета не очевидно, куда прописывать Socket ID? Одним словом надо находить время что бы нырять в код и искать что здесь к чему, хотелось бы решение «достал из коробки и работает», опять же это к вопросу об отсутствии мануала. Вопрос к автору: будьте любезны хотя бы кратко изложить как подключить любой из стандартных отчетов конфигурации?