Статистика по количеству документов в разрезе организаций, пользователей и видов документов




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

68 Comments

  1. NeeDiGeo

    Тут еще никто ничего не писал, добавлю от себя — должно работать на всех конфигурациях 8 (БП, УПП, УТ, ЗиУП и пр.), там где у документов есть реквизиты Ответственный и Организация. Зачем нужен этот отчет — да за тем, чтобы например оценить насколько загружены бухгалтера, и может быть пора расширить штат :-). Или наоборот, аргументами потрести перед бухгалтером, который говорит что он не успевает, а как будет видно (или не видно) из этого отчета делает то он не так уж и много 🙂 , значит он просто неэффективно работает.

    Reply
  2. agent100

    Спасиб. Сейчас протестирую. Сразу же пожелание — а можно сразу по всем пользователям и можно с диаграммой? или самому дописать)

    Reply
  3. NeeDiGeo

    Какой ресурс вам нужен в диаграмме? А по поводу пользователей, там и так все пользователи сразу. И отсортировано все по убыванию — некий топ лист «трудокголиков» 🙂

    Reply
  4. molot

    Димон, хорош! А теперь то же самое — только на построителе отчета: чтобы группировки местами менять, отборы там всякие, сортировки…

    Reply
  5. molot

    И код разлочь, нехороший человек :))) Никто не украдет.

    Reply
  6. NeeDiGeo

    Molot нафиг тебе построитель. Заходи в конфигураторе в схему компоновки данных и добавляй свои настройки хоть графики хоть что… 🙂

    Reply
  7. logdog

    а для семерки есть что-нить похожее?

    Reply
  8. molot

    Извини. Даже на заметил, что отчет — на СКД 🙂 Ну хоть настройки-то в интерфейс вывести — а?

    Reply
  9. IronDemon

    Нехватает выбора видов документов

    Reply
  10. IronDemon

    Зачем делать 3 левых соединения? Можно одним запросом все получить.

    Reply
  11. NeeDiGeo

    Привидите пожалуйста код этого запроса.

    Reply
  12. NeeDiGeo

    Я не сомневаюсь что можно, но это мое решение — две ТЗ и соединение в компоновке данных.

    Reply
  13. coder1cv8

    (11) Посмотри мой вариант: http://infostart.ru/profile/12366/projects/1838/ может быть увидишь что-нибудь полезное для себя…

    Reply
  14. grey_yes

    Попробовал в УПП….

    Почему-то не отображает документы дополненные в конфигурацию…

    Reply
  15. grey_yes

    проверил на варианте (13) — нашло все,

    НО не хватило памяти…

    Reply
  16. NeeDiGeo

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

    Reply
  17. Paha_kh

    рульная штукенция море рутины отпало

    Reply
  18. Лёвыч

    Почему-то изменение настроек компоновки не влияет на вывод отчета, это невероятно печально…

    Reply
  19. ZLENKO

    Отчет хороший но работает крайне медленно — у меня за период месяц минут 5 строился 🙁 Пришлось писать самому — допишу выложу свой вариант.

    Reply
  20. ZLENKO

    Написал свой вариант отчета на базе построителя (платформа отчет «Универсальный») — скоро, наверное, выложу (а может и нет — еще не решил).

    Провел замеры времени на рабочей базе за период = 1 месяц:

    отчет NeeDiGeo — 8 минут

    мой отчет — 15 секунд (как получилось сразу — оптимизацией скорости не занимался).

    Написал не чтобы попонтоваться «вот какой я крутой», а с целью показать что в отчете автора есть архитектурный просчет — сначала все «запихать» в огромную таблицу значений, а потом ее обработать компоновкой. Зачем ? В то время когда есть пакетные запросы и всю подготовку данных можно сделать на стороне сервера БД, а потом просто вывести готовый результат.

    Reply
  21. artbear

    (20) Выкладывай.

    Только в СКД все равно результаты удобнее изучать.

    Я про Построитель почти забыл в 8.1 🙂

    Да, автору не мешает поработать над запросом, очень уж медленно 🙁

    Reply
  22. ZLENKO

    (21) Ну просто в СКД есть то чего сильно не хватало в построителе — нумерация строк, расчет доли от общего итога. А в целом мне платформа отчета «Универсальный» нравится больше.

    Reply
  23. NeeDiGeo

    спасибо коллеги за комментарии. до конца месяца возможно возьмусь оптимизировать, а возможно и переписать ). правда от СКД уходить не хочу, это факт.

    Reply
  24. NeeDiGeo

    (20) Пожалуйста приведите объемы базы — количество документов. Чтобы мне проводить тестирование на своих базах.

    Reply
  25. ZLENKO

    (24) УТ за месяц:

    Документов всего: 50 000

    Строк в документах всего: 500 000

    Reply
  26. KukA.5

    Хорошая работа, Дмитрий. Спасибо, я плюсанул.

    Reply
  27. NeeDiGeo

    На здоровье! Но если честно руки не доходят переписать этот отчет через пакетный запрос. Может на след. неделе возьмусь )

    Reply
  28. galagala

    А для 7.7 нет такой обработки?

    Reply
  29. MaxS

    А с какой целью модуль запаролен? ❓

    Думал доработать, как минимум вывести настройки, отбор, выбор периода…

    И выложил бы сюда.

    Reply
  30. Barracuda64

    Спасибо автору.Отчет очень хороший.Пригодился как нельзя кстати.

    Reply
  31. Зеленоград

    Спасибо за отчёт. Не смог разобраться, что откуда в нём берётся, а хочу получить ещё пару колонок — кроме «Проведённых документов» нужны «Проведённые по БУ» и «Проведённые по НУ».

    Закрытый автором модуль формирует эти поля для СКД или сторонний разработчик может их добавить? Сколько это может стоит во втором случае?

    Автору написал, но пока ответ не получил, поэтому спросил тут.

    Reply
  32. lulyk

    платформа 8.1.5.14, конфига УПП 1.2.34.1

    Модуль открыть не могу

    {ВнешнийОтчет.СтатистикаБазы(218)}: Ошибка при вызове метода контекста (Выполнить): {(17, 4)}: Неоднозначное поле «Документ.Дата»

    <<?>>Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон

    по причине:

    {(17, 4)}: Неоднозначное поле «Документ.Дата»

    <<?>>Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон

    Reply
  33. MTA_N

    Очень помогает в работе ежедневно

    Reply
  34. sergeyshik

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

    Reply
  35. NeeDiGeo

    (34) Я бы это не назвал ошибкой. Это скорее отсутствие возможности ибо дата изменения документа есть не во всех конфигурациях. Отчет затачивался под типовую!

    Reply
  36. Софтэксперт

    Пригодилось для анализ использования видов документов в 1С.

    Reply
  37. NeeDiGeo

    (36) Софтэксперт,

    Если пригодилась плюсуйте. Не жадничайте!

    Reply
  38. husky

    как добавить группировку по месяцам в отчет?

    Reply
  39. husky

    Плохо что отчет нельзя настроить, беспонтовый отчет.

    Reply
  40. NeeDiGeo

    (39) Отчет можно настроить (я имею ввиду схему комопновки данных) правда в конфигураторе.

    Reply
  41. Kometa

    Спасибо за отчет. Тоже хочу отметить запароленность модуля/

    Используется ли журнал регистрации?

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

    Reply
  42. Софтэксперт

    Пригодился, единственное недостаточно гибкие настройки

    Reply
  43. protlt

    Хорошая обработка. Нам очень пригодилась в работе. Пробовали ее на версии 8.1.Спасибо автору.

    Reply
  44. protlt

    Да, забыла добавить, что в обработке для нас было важно именно замерить объем работы пользователей с документами. У нас у одного сотрудника зар.плата зависит от объема введенных в базы документов, поэтому давно искали такую.

    Reply
  45. zayden

    Жалко что отчет только для 8.2 а для 8.1 нету

    Reply
  46. ilya005

    Плюс — отличная обработка

    Минус — пароль..

    итого 0 😉

    Reply
  47. protlt

    Поработали мы с этой обработкой и обнаружили одну проблемку. Отчет не отражает реальной работы пользователей.

    Reply
  48. protlt

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

    Reply
  49. protlt

    Может можно отчет на основе журнала регистрации сделать?

    Reply
  50. AAA2011

    судя по выжимке из обсуждения — тут нужен комплексный подход с введением регистра сведений, фиксацией событий и отчетом по нему

    тогда будет смысл и толк

    Reply
  51. quebracho

    Спасибо большое, очень помог отчет, ибо понадобилась такая информация очень срочно.

    Reply
  52. udaffkaa

    В конфигурации «Документооборот» 8 Корп в режиме неуправляемое приложение формирует пустой отчёт. Кто знает в чём может быть причина?

    Reply
  53. megaster

    Спасибо за отчет!

    Уточнение может надо было запросы не в цикле делать по каждому виду документов?

    Не пробовали один запрос сделать? Интересно время формирования изменится?

    Reply
  54. lion11

    Спасибо, полезный отчет.

    Пожелание: добавить в запросы слово РАЗРЕШЕННЫЕ, чтоб можно было формировать под ограниченными правами.

    Reply
  55. sashanox

    Товарищ, что это «Не найден внешний набор данный «СтатистикаБазы»!? Отчет не работает!

    Reply
  56. NeeDiGeo

    (56) sashanox, Конфа, версия платформы я ж не телепат, товарищ …

    Reply
  57. sashanox

    Извиняюсь: 1С:Предприятие 8.2 (8.2.17.143), Управление производственным предприятием, редакция 1.3 БИТ.ФИНАНС 3.0

    Reply
  58. alexx2510

    (1) зачем пароль на модуле?

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

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

    Reply
  59. Ustasu1

    (1) (59) alexx2510, как дети с этими паролями, чесслово

    ИМХО, неприлично ставить пароль на платную обработку

    при этом все знают, что пароль снимается в 5 сек

    И да, на изменение настроек отчет никак не реагирует, все равно выводит данные, как задано по умолчанию

    Reply
  60. NazarovV

    Это не отчет — а один большой косяк..

    Отборы не работают, код закрыт… Настройки никак не влияют на вывод..

    минус.

    Reply
  61. 20tanush

    код закрыт — что за фигня. Минус

    Reply
  62. Urets

    Вместо трех соединений проще указать такой запрос:

    |ВЫБРАТЬ
    | НачислениеЗарплатыРаботникамОрганизаций.Организация,
    | НачислениеЗарплатыРаботникамОрганизаций.Ответственный,
    | Сумма(Выбор Когда НачислениеЗарплатыРаботникамОрганизаций.ПометкаУдаления Тогда 1 Иначе 0 Конец) Как КоличествоПомеченныхНаУдаление,
    | Сумма(Выбор Когда НачислениеЗарплатыРаботникамОрганизаций.Проведен Тогда 1 Иначе 0 Конец) Как КоличествоПроведенных,
    | Сумма(Выбор Когда (Не НачислениеЗарплатыРаботникамОрганизаций.Проведен) И (Не НачислениеЗарплатыРаботникамОрганизаций.ПометкаУдаления) Тогда 1 Иначе 0 Конец) Как КоличествоНепроведенных
    |ИЗ
    | Документ.» + Строка.Значение.Имя + » КАК НачислениеЗарплатыРаботникамОрганизаций
    |ГДЕ
    | НачислениеЗарплатыРаботникамОрганизаций.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |Сгруппировать По
    | НачислениеЗарплатыРаботникамОрганизаций.Организация,
    | НачислениеЗарплатыРаботникамОрганизаций.Ответственный
    |»;
    

    Показать

    Reply
  63. Bac3

    (32) lulyk,

    Необходимо исправить модуль обработки:

    В запросе использовался псевдоним документа КАК Документ. А так нельзя!

    Необходимо выбрать другой псевдоним например Документ1

    Reply
  64. Гость

    Что то не пойму как считается среднее количество строк ? общее количество строк / количество документов ? — где то сходится где то нет …. Заранее спасибо!

    Reply
  65. deutsch2008

    Не работает Ваша программа! )))

    {ВнешнийОтчет.СтатистикаБазы.МодульОбъекта(218)}: Ошибка при вызове метода контекста (Выполнить)

    по причине:

    {(17, 4)}: Неоднозначное поле «Документ.Дата»

    <<?>>Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон

    «Управление производственным предприятием для Украины», редакция 1.3 (1.3.53.1)

    Reply
  66. deutsch2008

    и + к этому исправить еще нельзя!

    См. вложение…

    Reply
  67. 1c_nik923

    Отчёт довольно старый, но если скажите пароль на модуль буду благодарен) Под 8.3 хочу доделать для себя.

    Reply
  68. Kostt

    Димон пора переписать на 8.3 или это кто-то сделает за тебя)

    Reply

Leave a Comment

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