Консоль отчетов для управляемого приложения




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

34 Comments

  1. Evg-Lylyk

    Хорошо сделано спасибо

    Только интерфейс мне показался неудобным много расписывать неохота:

    Кнопка «Выполнить» справа непривычно

    Результат на отдельной вкладке

    Запросы, Компоновка все в разных таблицах непонятно

    ————-

    в стандартных консолях на 8.1 еще была дерево запросов с иерархией и сохранение в файл

    еще жаль что ничего принципиально нового 🙁

    Reply
  2. HellBit

    Евгений, спасибо за отзыв. По поводу интерфейса — учту на будущее, но скорректирую: список запросов/компоновок хранится как раз в виде дерева, только представление реализовано в виде иерархического списка. Сохранения в файл пока нет — только сохранение значений между сеансами пользователя.

    Reply
  3. KukA.5

    Огромное спасибо!

    Reply
  4. logarifm

    уу.. класс. спасибо даже на тонком клиенте 8)

    Reply
  5. logarifm

    Конечно оно не будет как 8.1 так как архитектура 8.2 другая… Просто впадло постояно бегать из конфигуратора в систему и смотреть результат запроса, вот это плюс. А так собственно ниче особено. но автору плюс поставил так как время потратил свое!

    Reply
  6. Wolfis

    {Форма.Форма.Форма(963,36)}: Тип не определен (СхемаКомпоновкиДанных)

    СхемаКомпоновкиДанныхЛок = Новый <<?>>СхемаКомпоновкиДанных;

    вот такая ошибка….

    Доступность:

    Сервер, толстый клиент, внешнее соединение.

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

    Reply
  7. HellBit

    upd v0.2: возможность настройки результата запросов и компоновок, возможность (авто-)сохранения / восстановления настроек консоли в файл(-ы), обновлен интерфейс.

    (6) на тонком клиенте не взлетит.

    Reply
  8. PRoman

    отлично!!!

    ток на платформе 8,2,10,77 не видна страница «результат запроса», версия консоли 0,2

    Reply
  9. HellBit

    (8) перед выполнением запроса, в консоли нужно определить настройки вывода результата на одноименной закладке.

    Reply
  10. PRoman

    Чет у меня не получилось. 😥

    С Настройками компоновки все нормально, но с запросами никак нет там закладки «Настройки вывода»

    Reply
  11. HellBit

    (10) Я говорил про эти настройки:

    Reply
  12. PRoman

    Чет не пойму, создал с помощью «конструктора компоновки» отчет, настроил вывод, нажал «ок» и всеравно нужно заново настраивать внешний вид. Ну это ладно.

    Закончил, нажал сохранить настройки и все пропало 🙁 Потом нажал восстановить и 1с вылетела по неизвестной ошибке.

    Выложи пожалуйста файлик с примером отчета на СКД и обычного запрса

    Reply
  13. HellBit

    (12) Держи — RConsoleAllList.xml, здесь настройки одного запроса и одной компоновки, загрузишь их с помощью Файл-Загрузить-Загрузить значения всех списков. Насчет того, что <… создал с помощью «конструктора компоновки» …> — читай п.2.5 описания 😉

    Reply
  14. PRoman

    Спасибо….

    Описание я не читал 😳

    Reply
  15. Константин С.

    Что-то проблема с выводом Параметров, подставляются пустые значения и без определения типа.

    Reply
  16. Поручик

    Достаточно удобная штука. Сегодня попользовался на работе, завтра продолжу.

    Reply
  17. ture

    {Форма.Форма.Форма(963,36)}: Тип не определен (СхемаКомпоновкиДанных)

    СхемаКомпоновкиДанныхЛок = Новый <<?>>СхемаКомпоновкиДанных;

    {Форма.Форма.Форма(967,37)}: Тип не определен (СхемаКомпоновкиДанных)

    СхемаКомпоновкиДанныхЛок = Новый <<?>>СхемаКомпоновкиДанных;

    {Форма.Форма.Форма(1021,17)}: Тип не определен (СхемаКомпоновкиДанных)

    Схема = Новый <<?>>СхемаКомпоновкиДанных;

    {Форма.Форма.Форма(1045,36)}: Тип не определен (СхемаКомпоновкиДанных)

    СхемаКомпоновкиДанныхЛок = Новый <<?>>СхемаКомпоновкиДанных;

    {Форма.Форма.Форма(1056,139)}: Тип не определен (СхемаКомпоновкиДанных)

    СКДКомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(?(СхемаКомпоновкиДанныхЛок = Неопределено, Новый <<?>>СхемаКомпоновкиДанных, СхемаКомпоновкиДанныхЛок)));

    Reply
  18. Sofokl

    Огромное спасибо! инструмент отличный, использую почти ежедневно. Очень удобно. плюсую однозначно

    Reply
  19. nartem85

    Спасибо!

    Reply
  20. 1C_tradeomsk

    Очень простой запрос.

    ——————————————————————

    ВЫБРАТЬ

    ДополнительныеНачисления.НомерСтроки

    ,ДополнительныеНачисления.План

    ,ДополнительныеНачисления.ВидРасчета.Расчет_Способ Расчет_Способ

    ,ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.ЗначениеБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.ЗначениеБаза, 0) КАК База

    ИЗ

    РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(

    &Измерения,

    &Измерения,

    ,

    Регистратор = &Ссылка

    И ВидРасчета.Расчет_Категория = &Категория И Подразделение = &Подразделение) КАК ДополнительныеНачисленияБазаОсновныеНачисления

    ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки И ДополнительныеНачисления.Сотрудник <> ДополнительныеНачисленияБазаОсновныеНачисления.Сотрудник

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(

    &Измерения,

    &Измерения,

    ,

    Регистратор = &Ссылка

    И ВидРасчета.Расчет_Категория = &Категория И Подразделение = &Подразделение) КАК ДополнительныеНачисленияБазаДополнительныеНачисления

    ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки И ДополнительныеНачисления.Сотрудник <> ДополнительныеНачисленияБазаДополнительныеНачисления.Сотрудник

    ГДЕ

    ДополнительныеНачисления.Регистратор = &Ссылка

    И ДополнительныеНачисления.ВидРасчета.Расчет_Категория = &Категория

    ——————————————————————

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

    Количество верное, но даже их названия «не цепляет».

    Прикол в том что и отредактировать не даёт — ни название ни значение ни тип.

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

    скачать следующее решение.

    Изучи и используй

    Инструмент

    Reply
  21. JohnyDeath

    У меня как у (15) и (21) не определяются имя параметра и его тип в таблице параметров. В отладке вроде бы все нормально.

    Редактировать поля также не дает.

    Reply
  22. Evg-Lylyk

    (22) Подробнее… тип поля, запрос.

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

    Reply
  23. JohnyDeath

    На любом запросе имею картину как у (21). Т.е. Кол-во строк = кол-ву параметров, но имена и значения не заполнены. По Даблклик или по «изменить» ничего не происходит

    Пример запроса:

    ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.Представление
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.Ссылка = &Ссылка
    Reply
  24. Evg-Lylyk

    (24) Извините я чуток ошибся это не моя обработка (я просто подписан на эту тему), увидел почте уведомление и думал что по моей консоли вопрос. Так что ждем автора или можете попробовать что то подобное [8.2] Управляемая консоль отчетов (только управляемые формы)

    Reply
  25. JohnyDeath

    (25) Да, я видел вашу консоль — хорошая. Но хотелось бы, чтоб и СКД была в том же пакетике, что и запросы.

    Ждем автора.

    Reply
  26. stas1kbob

    При создании конструктором настроек очета и последующей загрузке, вылетает программа с ошибками XDTO. Это я не так делаю или ошибка в обработке? Зачем есть конструктор, если не загружать или как загрузить по другому? п.с. версия платформы 18.102

    Reply
  27. sbv2005

    На 1С:Предприятие 8.2 (8.2.18.96) при попытке открыть xml ошибка:

    {Форма.Форма.Форма(718)}: Метод объекта не обнаружен (Получить)

    сохраненноеЗначение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML).Получить();

    Reply
  28. sbv2005

    (28) Вопрос снят. Я не то делал

    Reply
  29. kit

    При открытии в БП 3.0 (платформа 8.3.4.365) выдает ошибку:

    Reply
  30. xoxmaister

    жаль что параметры не заполняет

    Reply
  31. Bajo

    обработка сырая

    Reply
  32. Serg_KSV

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

    Reply
  33. Serg_KSV

    Сделал параметры, но СКД нормально не работает. Все настолько не очевидно Очень жаль, идея хорошая. Со времен БП 2.0 нет ни одной нормально работающей консоли отчетов. Прикрепил обработку с исправленными параметрами. Надеюсь автор не будет против. Кстати нормально работает консоль с ИТС: КонсольСистемыКомпоновкиДанных.erf (тоже прикрепил)

    Reply
  34. boln

    (34)

    Сделал параметры, но СКД нормально не работает. Все настолько не очевидно Очень жаль, идея хорошая. Со времен БП 2.0 нет ни одной нормально работающей консоли отчетов.

    Как вариант, можно это попробовать:

    http://infostart.ru/public/179939/

    Reply

Leave a Comment

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