Универсальный отчет "[П]: Анализ Продаж" [УТ, УПП, КА, Розница]




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

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

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

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

57 Comments

  1. ZLENKO

    Отчет написан на платформе универсального отчета, т.е. используется построитель отчетов (не СКД).

    Отчет уже более года активно используется у нескольких моих клиентов.

    Преимущества: простота настройки, расшифровка любого показателя, производительность.

    Недостатки: не работает в управляемом интерфейсе.

    Reply
  2. zenz

    Чем отличается от подобной http://infostart.ru/public/92812/ , но только бесплатной. Похоже, что кроме разукрашки ни чем.

    Reply
  3. ZLENKO

    (2) Отличается тем, что это в принципе разные отчеты — «Анализ Продаж» и «Валовая Прибыль».

    Они строятся на основании разных данных… по моему разница очевидна 🙂

    Reply
  4. ZLENKO

    Сделал отчет бесплатным! Исходный код открыт! Пользуйтесь и получайте удовольствие 🙂

    Не забываем писать отзывы об этом замечательном отчете ! 🙂

    Reply
  5. ZLENKO

    Скачивания идут… Не забываем «плюсовать» и писать комментарии 🙂

    Reply
  6. Tanenok

    я скачать то скачала но у меня он не работает (( Управление торговлей, редакция 11.1 (11.1.2.15)

    Reply
  7. ZLENKO

    (7) Отчет работает в обычном интерфейсе (не управляемые формы). В УТ 11.1 работать не будет.

    Reply
  8. Tanenok

    Уже поняла…а жалко так хотелось воспользоваться :-))

    Reply
  9. gravira

    Если б еще знать, как установить этот отчет. Тоже б попробовал

    Reply
  10. ZLENKO

    (10) Все очень просто в «1С: Предприятие 8.2» меню «Файл -> Открыть» и выбрать файл отчета 🙂

    Reply
  11. rybusha

    Спасибо,работает в КА

    Reply
  12. sea123

    1. Открывается отчет весьма и весьма долго. Что при этом пытается сделать, для меня осталось загадкой.

    2. Таблица красиво оформлена и все понятно.

    3. Если залезть в настройку и нажать там «отмена», то мы опять чего-то ожидаем. Причем больше пары минут.

    Чего хотелось бы. Хотелось бы, чтобы автор сделал отчет по образу и подобию тех, что называются «сравнительный анализ …», т.е. чтобы можно было бы взять эталонный период и на него наложить некоторые другие периоды со сравнением. Не один, как у автора, а несколько.

    Reply
  13. ZLENKO

    (13) 1) Ожидание действительно присутствует — у меня порядка 5 секунд. Видимо что то связанное с анализом метаданных конфигурации, т.к. сделано на основе универсального отчета. Сейчас нет времени разбираться с этим — думаю 5-10 секунд ожидания не фатально.

    2) Спасибо на добром слове — я старался 🙂

    3) Ну то же что и при открытии — построитель отчета что то там делает на основании текста запроса.

    Несколько периодов делать не буду. Во первых, моим клиентам достаточно сравнивать два периода — эталонный и анализируемый. Во вторых, скорее всего будет совсем медленно работать, т.к. в 1С медленно выполняются запросы с объединением нескольких регистров — думаю из за особенностей индексации регистров накопления по измерениям «Период» и «Регистратор» — была статья на ИС на эту тему. Если делать несколько периодов — надо применять другой подход к архитектуре запроса отчета, но как я уже написал лично мне оно не нужно, а для того чтобы «сделать мир лучше» делать не буду 🙂

    Reply
  14. sea123

    (14)Время ожидания на УПП порядка двух минут. Работа ведется на весьма и весьма мощной железке. Все универсальные отчеты открываются сразу же.

    Reply
  15. ZLENKO

    (15) Медленно работает дополнение текста запроса контактной информацией контрагентов. Это часть подсистемы универсального отчета, но видимо по этой причине нигде в типовых отчетах не используется.

    Попробуйте этот отчет http://infostart.ru/public/21442/ — он тоже будет у Вас медленно открываться.

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

    Reply
  16. Lerusena

    Спасибо. Хороший отчет. После его демонстрации директору, родился на разработку целый список аналогичных отчетов вроде «среднего чека» с анализом по менеджерам, ABC/XYZ и т.п.

    А отчет отработает если сравнивать кварталы и установить группировку колонок по месяцам?

    Reply
  17. ZLENKO

    (17) Lerusena, Спасибо за отзыв 🙂 Можно сравнивать по периодам с группировкой «По годам», «День года», «День месяца», «День недели», «Квартал года», «Месяц года», «Неделя года».

    Reply
  18. ZLENKO

    (17) Lerusena, Тоже дорабатывал этот отчет для ABC анализа.

    Reply
  19. NOVOHUDONOSO

    Хороший отчет, много времени сэкономил, использовал как заготовку для своей специфики

    Reply
  20. ESEA

    12

    Reply
  21. Biochemist

    (6)

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

    Reply
  22. aldo

    (6)

    Отзываюсь. Хороший отчет. 🙂

    Нужно сравнивать продажи за аналогичные периоды прошлых лет, так вот это —

    самое оно.

    Reply
  23. ZLENKO

    (23) aldo, «Нужно сравнивать продажи за аналогичные периоды прошлых лет, так вот это —

    самое оно.»

    Спасибо за отзыв 🙂

    Reply
  24. Операция1Ы

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

    Reply
  25. ZLENKO

    (25) Tpylalist, «Хорошо сделано, автор тебе огромный плюс, за такую работу, есть чему поучиться.»

    Я старался 🙂

    Reply
  26. sportexmsk

    В УП 10.3 вот это выдает

    Reply
  27. ZLENKO

    (27) sportexmsk, «ПродажиИтог» — это временная таблица. У вас какая версия платформы 1С Предприятие ?

    Reply
  28. sportexmsk

    (28)

    1С-8.2.19.102

    УП-10.3.29.1

    Reply
  29. ZLENKO

    (29) sportexmsk, 1С-8.2.19.102

    Должно работать без проблем.

    Reply
  30. vasilekg

    Не работает! Пишет: Не установлена схема компоновки данных.

    Reply
  31. ZLENKO

    (31) vasilekg, «Не работает! Пишет: Не установлена схема компоновки данных.»

    Отчет на построителе отчетов. Работает только в «толстом клиенте».

    Reply
  32. psih12

    А можете доработать отчет, чтобы выводил долю количества и суммы по родительской группировке? Т.е, если, к примеру, выбраны группировки по контрагенту, а затем по номенклатуре.родитель, то сумма долей каждого номенклатуры.родителя внутри каждого контрагента должна равняться 1 ( ну или 100%). Также и сумма долей количества продажи (или суммы) всех контрагентов также должна быть 1.

    Reply
  33. ZLENKO

    (33) psih12, «А можете доработать отчет, чтобы выводил долю количества и суммы по родительской группировке?»

    На СКД такое делается легко, а на построителе сложно и «некрасиво» 🙁 Т.е. мой ответ — «не могу».

    Reply
  34. NOVOPRO

    ZLENKO.PRO отчет действительно отличный делаю примерно тоже самое по периодам по номенклатуре и тд. но в другом разрезе. Хочу дать небольшой совет сделать возможность смотреть продажи по мессе по каждой группе номенклатуры и видам номенклатуры и производителям. Если к примеру делаем отчет по контрагенту за прошлый год и этот в массе. Можно более корректно делать выводы о продажах не взирая на инфляцию. В прошлом году продали 10 кг получили 100р. В этом году продали 9 кг получили 100р.

    Reply
  35. Vinnypooh

    Спасибо. Очень помогло в работе. Удобно и наглядно

    Reply
  36. Artur2316

    Как с вами связаться?

    Reply
  37. ZLENKO

    (37) Artur2316, «Как с вами связаться?»

    email: zlenko@gmail.com

    skype: zlenko.pro

    site: http://zlenko.pro

    ну и google.com тоже может помочь 🙂

    Reply
  38. Светлый ум

    (39) Судя из описания статьи и не должен.

    Reply
  39. ZLENKO

    (39) bnw, «В Розница 1.0 не работает…»

    Должен работать в Розница 1.0. Какую ошибку выдает ?

    Reply
  40. spectre1978

    Можно сделать группировку не по контрагентам, а по грузополучателям (документ продажи.грузополучатель) ?

    Reply
  41. ZLENKO

    (42) spectre1978, «Можно сделать группировку не по контрагентам, а по грузополучателям (документ продажи.грузополучатель)?»

    Не вижу причин почему этого нельзя было бы сделать.

    Reply
  42. pudovaraisa

    Отчет не учитывает корректировку выручки в расчетах у.е в КА, расстроена.

    Reply
  43. ZLENKO

    (44) pudovaraisa, «Отчет не учитывает корректировку выручки в расчетах у.е в КА»

    Это документ такой есть в KA?

    Reply
  44. pudovaraisa

    Документа такого нет, но есть процедура «Восстановление состояния расчетов по реализации и приобретению», которая корректирует движения документа (проводки) — добавляет в документ корректирующую проводку. и вот она уже не попадает ни в один отчет.

    Reply
  45. erofeeva

    Здравствуйте, скачала Ваш универс отчет АНАЛИЗ ПРОДАЖ, ругается «по причине:

    {(33, 20)}: Таблица не найдена «ПродажиИтог»

    ЛЕВОЕ СОЕДИНЕНИЕ <<?>>ПродажиИтог КАК ПродажиИтог» Конфигурация УПП 8.2.19.130, толстый клиент. Временная таблица ПродажиИтог у Вас прописана. В чем дело? Срочно нужен этот отчет!!!!!!!!!!!! Помогите, пож-та

    Reply
  46. config

    (47) erofeeva, какая версия платформы?

    Reply
  47. ZLENKO

    (47) erofeeva, Вы видимо отключили вывод каких то показателей. Построитель отчета оптимизирует запрос и исключает получение данных, которые потом не находит. используйте настройку по умолчанию — тогда не ругается ?

    Reply
  48. erofeeva

    Да, я изменила вывод показателей по умолчанию — ругается, если не менять, то отчет формируется. Прописала в коде вывод нужных показателей, всё теперь ок. Можно ещё вопрос: «задала для сравнения 2 аналогичных квартала разных лет, группировка по месяцам года. Отчет не выводит отклонений помесячно, выдаются только итоговые отклонения. Так работает отчет? или что-то я не так сделала?»

    Reply
  49. erofeeva

    Отчет замечательный. Всё получилось. Спасибо Вам!!!

    Reply
  50. Светлый ум

    Продажи по поставщикам покажет?

    (сколько товара было продано — от конкретного поставщика)

    //в типовом функционале этого нет

    Reply
  51. ZLENKO

    (52) Светлый ум, По поставщикам не покажет, т.к. там надо привязывать партии. Мне в этом отчете такое не нужно было — многим достаточно поля ОсновнойПоставщик из карточки Номенклатуры.

    Reply
  52. ZLENKO

    (50) erofeeva, «Можно ещё вопрос: «задала для сравнения 2 аналогичных квартала разных лет, группировка по месяцам года.»

    Там есть два варианта группировки по месяцам. Для сравнения надо использовать ту что по номеру месяца группирует, а не по дате месяца.

    Reply
  53. NushaN

    Хотелось бы уточнить: как собираются данные, если в базе регистрируются продажи (я так понимаю, данные берутся из р-ра «Продажи») одного товара по нескольким Организациям? Смогу ли я указать нужную Организацию и получить соответствующий результат?

    Reply
  54. vadstp

    У меня Управление производственным предприятием, редакция 1.3.103,1 дает ошибку (в прикреплении). Неужели зря потратит 10sm ?

    Reply
  55. anded

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

    При попытке открыть 1С выдает ошибку: «Ошибка загрузки документа. Внешний отчет не может быть прочитан текущей версией программы». Пытаюсь открыть на 1С 8.2 (8.2.19.130) Комплексная автоматизация, редакция 1.1 (1.1.102.2)

    Reply
  56. anded

    (57) Написал автору. Он порекомендовал открыть в конфигураторе. После этого отчет заработал. Спасибо.

    Reply
  57. 227405

    (56) Удалось решить проблему?

    Reply

Leave a Comment

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