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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *