Статистика базы 8.1




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

35 Comments

  1. PowerBoy

    1. Строка подключения сервера SQL всего 10 знаков, не лезет имя.

    2. У меня нет базы upp2008.

    🙁

    Reply
  2. chea06

    (1) извиняюсь, исправил

    Reply
  3. lrs

    Журнал изменений 🙂 А я то думаю почему у меня база пухнет…

    Подождем что там с версионированием в упп 1.2.22 придумали 1С-ники.

    Reply
  4. Anything

    (0) Полезная обработка. Давно пользуюсь.

    Reply
  5. PowerBoy

    А почему она размеры регистров не выводит?

    Reply
  6. chea06

    обновил немножко

    Reply
  7. z-alexey

    на одномер Сервере установлен Сервер-1С, на нем прописаны две базы

    SQL стоят на двух других серверах. В поле server sql ввожу имя сервера 1С, то вылетает с ошибкой доступа к SQl.

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

    Reply
  8. chea06

    (7) в поле «Сервер SQL» необходимо указать сервер, на котором физически лежит база, а не на котором установлен сервер 1С (ну если только это не один и тот же сервер). В поле «Администратор сервера SQL» — имя администратора SQL сервера, а в поле «Пароль администратора» — его пароль.

    По поводу «Если ввести имя сервера SQL, то показывает только размер базы, а докуметы нули», не совсем понятно… То есть в настройках указано, что надо выводить информацию по документам, отчет формируется, в списке документов выводятся все документы, а в колонках размеров — нули? Нули выводятся во всех колонках или в колонках с размерами?

    Reply
  9. z-alexey

    (8) аааа, ой я глупый юзер. Кнопку настройка не нажимал и документы не выбирал. Все работает. Спасибо. Плюсик 🙂

    Reply
  10. DmitrO-75

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

    — плохо что она не универсальная, т.е. выводит статистику именно по текущей базе а не по любой, т.е. в базу надо обязательно заходить;

    — плохо что не сохраняются параметры подключения к базе и их надо каждый раз прописывать, я понимаю что пароли администратора сохранять нехорошо, но это и не надо делать, для прямого соединения с mssql надо использовать Windows-авторизацию (Microsoft ваще не рекомендует использовать родную авторизацию с mssql без SSL т.к. пароль передается в открытом виде, тем более для административных действий, и это пароль администратора);

    — и вообще имхо надо сделать чтобы вводился только именно центральный сервер кластера и ИБ на нем, остальное подтягивать через административное соединение с кластером, в отчете обязательно отразить имя сервера mssql;

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

    — макс доков в день и среднее доков в день в итоговой строке по всей таблице посчитать всеже стоит.

    А так вообще, будем юзать 🙂

    Reply
  11. Wolfich

    Классная вещь — нашел мусора на 2,7 гб… кеша старого! большое спасибо!

    Reply
  12. DmitrO-75

    (10)+ если возникнут какие-либо трудности в реализации моих пожеланий, пиши по аське, помогу

    Reply
  13. PVG_73

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

    Reply
  14. e.kogan

    Login failed, хотя набираем точно администратора сервера. MS SQL, аутентификация виндовая вроде.

    Reply
  15. inse0f

    {Форма.Форма(846)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Не удается открыть базу данных «Dragons», запрашиваемую именем входа. Не удалось выполнить вход.

    Connection.Open(стрПодключения);

    эмм

    поглагаю не видит ole драйвер? mssql 2005 lite

    Reply
  16. jk3

    +1 за идею

    -1 за реализацию

    Не работает когда имя БД в кластере серверов отличается от имени БД на SQL-сервере

    У меня вообще никакую статистику, кроме размера базы не показывает, только пустые таблицы

    Reply
  17. Now

    Не работает: база под управлением PostgreSQL 🙁

    «Ошибка при вызове метода контекста (Open): …»

    Пытается использовать Driver={SQL Server}

    Reply
  18. Атеист33

    хорошая обработка . идея хороша

    Reply
  19. mialord

    Полезно. Спасибо

    Reply
  20. _Xelon_

    Имя базы данных на сервере SQL нужно сделать так, чтобы вводилась руками. У меня имя базы на SQL сервере всегда отличается от имени базы на сервере 1С по соображениям безопасности. Соответственно обработка не работает.

    Reply
  21. falcon10

    Привет. По отчету «Универсальный отчет». Если база файловая, то показываются данные справочников и документов. Если же отметить регистры, то возникает ошибка. Еще не вижу в отчете — на что влияет диапазон дат «Документов в день»

    Reply
  22. falcon10

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

    Reply
  23. chea06

    В заголовке же написано, что обработка предназначена для клиент-серверного варианта, так как данные по объему занимаемого места берутся с SQL-сервера

    Reply
  24. Istur

    (0) Спасибо, отличная и качественная обработка))

    Reply
  25. logarifm

    Что-то не правильно отчет показывает, вот суммарное представление отчета анализа моей базы:

    «Размер

    таблицы KB»

    5 360

    115 392

    319 024

    205 568

    13 696

    «Размер

    индекса KB»

    10 424

    30 224

    40 416

    222 800

    12 072

    Сумма: 974 976КВ

    Размер: 7936.31 MB, Неиспользованно: 3966.87 MB

    По таблице я вижу меньше 1Гб, а где же еще ???

    Reply
  26. pzu

    с Postgre не работает. Можете подправить чтобы работало?

    Reply
  27. echo77

    Я подправил, внес возможность указывать имя БД на SQL-сервере.

    Куда выложить то что получилось?

    Reply
  28. echo77

    (0)Загрузил в справочник ОКОФ, после этого сунулся посмотреть сколько МБ он занял в базе, но обработка почему-то показывает 0. Интересно, в чем причина?

    Reply
  29. tarroman

    Полезная обработина, та, что была нужна для количественного анализа базы заказчика. Правда приходилось иногда ее «передергивать», чтобы заполняла данные (я про версию, которую качал в декабре 2010 г.). Автору благодарности в любом случае 😀

    Reply
  30. rasswet

    {Форма.Форма.Форма(59)}: Ошибка при вызове метода контекста (Сортировать)

    ТЗ.Сортировать(Сортировать);

    по причине:

    Неверное имя колонки

    Reply
  31. MapTboy

    {Обработка.ОтладкаЗапроса.Форма.Запрос(16)}: Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса «Ошибка при выполнении операции над данными:

    Microsoft OLE DB Provider for SQL Server: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.

    HRESULT=80040E57, SQLSrvr: Error state=8, Severity=10, native=8115, line=1

    необходимо в запросах где:

    «ВЫБРАТЬ

    ВЫРАЗИТЬ(СРЕДНЕЕ(Количество) КАК Число(5, 0)) КАК Среднее,

    ….

    »

    поправить на

    КАК Число(15, 0)

    Reply
  32. xalker

    Благодарю за полезный инструмент 🙂 Самое то для анализа баз, дабы не считать «вручную» 🙂

    Reply
  33. maksar

    Спасибо , как раз то что искал.

    Reply
  34. wowkai

    спасибо, давно искал что-то подобное!

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

    На 8.2 работает?

    Reply

Leave a Comment

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