<?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='\
Молодец. Сам хотел довно такую нарисовать да все руки не доходили 🙂
Вот это зачет. Молодец все супер сам точняк делать хотел и уже методы подыскал, а вот руки ну никак не доходили. Получай заработанную плюсяру 🙂
спасибо ) есть предложение:
добавь в обработку возможность сохранения любых счетчиков (например, строк ТЧ для реализации или количество строк регистра или все сразу) в файл… экселевский например, со своей структурой, в разрезе дат… и возможность построения графика по данным этого файла. в результате появится возможность анализировать тенденцию роста базы и увидеть места оптимизации (что в первую очередь оптимизировать, что во вторую)… получится очень полезный инструмент !!
и еще, это уже на будущее — возможность расчета общих для базы показателей, например, ежемесячный рост таких-то данных составляет такой-то %. это позволит прогнозировать довольно точно какой будет база через год, два и стоит ли уже сейчас переходить к оптимизации… вообще поможет ответить на многие вопросы (по оборудованию, по программным решениям и т.д.) )
удачи !
у меня почему-то выдает ошибку:
{ВнешнийОтчет.АнализРазмеровТаблицМетаданныхРазличнаяСтатистикаОБазе.МодульОбъекта(930,20)}: Конструктор не найден
Действие = Новый <<?>>Действие(«ДействияПанелиИзменениеЗначенияДинамическогоОтбора»);
{ВнешнийОтчет.АнализРазмеровТаблицМетаданныхРазличнаяСтатистикаОБазе.МодульОбъекта(3387,29)}: Тип не определен (НастройкаПериода)
НастройкаПериода = Новый <<?>>НастройкаПериода;
База: некая самописка
Режим: толстый клиент, управляемые формы, клиент-сервер
все методы модуля поставил в операторные скобки #Если Клиент Тогда…. #КонецЕсли
Теперь запускается, но при попытке сформировать отчет, долго думает, а потом выдает ошибку:
Не найден внешний набор данных «ТаблицаДанных».
подробно:
Ошибка выполнения отчета
по причине:
Ошибка исполнения отчета
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных «ТаблицаДанных»
по причине:
Не найден внешний набор данных «ТаблицаДанных»
И отображаемая форма совсем не похожа на ту, что изображена на скриншотах и ту, которую вижу в конфигураторе.
Следует ли понимать так, что в режиме управляемых форм обработка не работает?
(4) (5) (6) Для управляемого приложения форма не создавалась, а поэтому и форма видится другая, как видно генерируется автоматически. поэтому и не работает. Когда буду реализовывать (3), тогда и сделаю работоспособной для управляемого приложения.
С PgSQL не работает 👿
(8) Это да, Postgre у меня нет, так что и сделать под него не могу.
Неплохо,но…
1.Закладки и стрелки вперед-назад — лишнее- гл.метаданные
2.Кн.сформировать на гл. ком.панель- а то не видно что формировать
3.Кн.настройка лучше чем в 1с не придумать( в середке фу)
4. Рашифровка объекта по клику в полученной таблице это +++
5.Доступ к др.базе- достаточно пути- остальное она запросит сама
(10) 1)Сражение классических веб-форм с аккордеонными . Ничего лишним не является. Интерфейс, где находится всё на одной форме, является по моему мнению самым неправильным.
2) Кнопка на 3 странице находится не просто так, код бы сначала посмотрели.
3-4) — Перфразируйте и уточните. непонятно.
5) Оказывается по пути к базе можно получить логин и пароль 1с, логин и пароль администратора SQL. Вау.
Общее пожелание — формулируйте свои мысли пожалуйста литературными предложениями.
ПРедлагаю добавить группировку по периодам (году) для регистров. Тогда будет возможность наглядно оценивать результат свертки любых баз. И оперативно закрывать регистры перед сверткой, чтобы ликвидировать старые хвосты.
Еще бы неплохо иметь размер объектов в КБ для файлового варианта.
а как посмотреть размер на файловой базе?
жаль, что обработка на 1с82.
на 1с81 не запускается, понятное дело.
за (15) — потому что без уф надо выкладывать как для 81
(16) делалось это для толстого клиента без управляемых форм 8.2. Конвертация в 8.1 невозможна с 8.2. А управляемые формы делать отдельно — ну тут извините. Мне за это никто не платит. Если будет время то сделаю. но только если будет время.
«НеиспользованНо». Лишняя буква.
Вкладку «Описание» можно в справку засунуть. ИМХО, слишком дохрена параметров отчета(я имею ввиду объект) 🙂
Хорошая штука но не могу проверить на 8.1
(18) Где я допустил данную оплошность? Исправлю.
(19) Описание — сделал так специально, чтобы читали. В справку никто никогда не лазит, а здесь же может быть кто-нибудь и посмотрит. Много параметров — обработка универсальная же, поэтому у всех свои запросы, и лучше больше, чем меньше. 8.1 — ну так я ее делал на 8.2, а конвертация на 8.1 невозможна. Да и странно, что Вы 5 сентября 2011 года все еще сидите на 8.1, переводите на толстый клиент)
Спасибо, работает, помогло отладить базу. Но ошибка на период вылезает.
спасибо, мне помогло
Очень полезная обработка!
Скажите, а существует ли обработка по поиску и удалению лишней информации в базе?
А то есть база с размером около 5 ГБ
Ума не приложу чем можно так забить за несколько недель!
Говорят, что УПП так много и должно весить!
Но я чето сомневаюсь!
А если они годик там поработают?
Че прийдется 1ТБ винт под базу брать?
Если и ево хватит! 🙂
(27) VitaliyPovod, у меня полуторагодовалая база УПП+автотранспорт весит около 13 ГБ. Из них, как замеченно, 3 ГБ это Хранилище дополнительной информации (в основном сканы).
Нашел косячок’с! 🙂
Для документов показатель «Строк в табличной части на 1 элемент» всегда выводится в единицах, даже если в параметрах отчета указано «Выводить количество в тысячах/миллионах». Я даже сначала удивился, как много миллионов строк у нас в документах 😀
2 в 1? Для файлового варианта подойдет любая другая обработка по статистике объектов БД, коих на данном сайте -вагон и маленькая тележка! А вот SQL вариант стоит использовать!
Обработка — как раз то что нужно!!!
Только если кластер работает не на стандартном порту 1541 — тогда не подключается к базе или совсем вылетает при попытке подключения.
Очень хорошая обработка, просто супер! Спасибо!
жалко что на PSQL не работает
Из всех что видел — это больше всего пришелся по душе.
Спасибо за полезную штуку!
Отличная вещь, спасибо большое!
Спасибо за прекрасную работу!! Очень полезная весчь)
Очень хорошая обработка, просто супер! Спасиб
было бы неплохо добавить возможность подключаться к серверу SQL использую Windows аутентификацию, т.е. без необходимости указывать администратора и пароль администратора
только запустил, как вылетела следующая ошибка:
«Ошибка исполнения отчета
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных «ТаблицаДанных»
по причине:
Не найден внешний набор данных «ТаблицаДанных»
дальше смотреть не стал
Огромное спасибо автору!
Отличная обработка, жутко помогла при настройке SQL базы.
Делал партиционное разбитие и нужно было добавить индекс по своей схеме секций и функции секционирования для таблиц с количеством записей больше 250 000. Удобно и быстро нашел все нужное благодаря этой разработке!
зачет
Спасибо! А для 7.7 есть подобное?
А я косяк нашел 😛
Есть справочник с табличной частью. Отчет показывает по этому справочнику такие данные:
Искаженную информацию по этому справочнику — к размеру основной таблицы (2 516 432 КБ) добавляется размер табличной части (189 060 768 КБ). Поэтому несмотря на то, что размер справочника составляет всего 191 577 200 КБ (2 516 432 КБ + 189 060 768 КБ), в отчете отображается совершенно безумная цифра — 380 637 968 КБ.
Ошибку, кстати, заметил случайно — сформировал отчет в базе, которая весит всего 200 Гб, и увидел, что в этой базе одна таблица весит больше, чем вся база )))
(0) Нашел причину такой ошибки, описанной в (45):
размер таблицы вы достаете с помощью функции РазмерТаблицыSQL(ИмяТаблицы)
А в этой функции используется следующий запрос:
И все дело в условии «LIKE …». Таблицы справочников и документов в SQL выглядят как, например, _Reference2 и _Document74 соответственно. А таблицы, в которых хранятся табличные части этих объектов, имеют имена вида _Reference2_VT18 и _Document74_VT1038. Поэтому в вашем запросе размер табличной части объекта достается дважды: 1-й раз при получении размера таблицы объекта (из-за условия LIKE в результат попадет 2 строки — размер основной таблицы и размер таблицы ТЧ) и 2-й раз при получении размера самой таблицы ТЧ.
То есть, если условие LIKE убрать, для справочников и документов все будет отображаться правильно. Но, насколько я понимаю, данная конструкция используется для получения размеров таблиц регистров (у каждого регистра есть основная таблица и, например, таблица остатков или оборотов). Может быть, еще в каких-то случаях это необходимо. В общем, было классно, если бы этот баг пофиксили 🙂
Супер вещь! Все руки не доходили подобное написать!
Для анализа данных — очень удобно и быстро, чтобы принимать соответствующие решения по изменению структуры хранения данных на серваке.
Хорошая штука, помогла разобраться с увеличением базы
Требует пароль на SQL даже если он не установлен
спасибо автору!
Отличная обработка, при настройке SQL базы — то самое.
Спасибо автору!!! Лучшее что я видел для обследования БД
Автору Спасибо!!! Взял на вооружение.
Вопрос. Можно ли добавить в запрос поле отбора по номеру для документов или по коду для справочника?
Префикс базы.
Что хочу увидеть: Сколько объектов создано в этой базе, а сколько пришло при обмене?
Есть другие варианты это увидеть?
СООБЩЕНИЕ при заполнении 1 страницы — не могу определить сеовер
Не знаю пародя SQL бЕЗ ЭТОГО никака???
спасибо, не хватает тэга разрешенных
Большое спасибо за работу, очень нужный инструмент. Не удалось, правда, заставить заполнять параметры из кластера серверов, выдало следующее:
{Форма.Форма.Форма(919)}: Ошибка при вызове метода контекста (ConnectAgent): Произошла исключительная ситуация (V82.COMConnector.1): server_addr=tcp://127.0.0.0:1540 descr=Ошибка сетевого доступа к серверу
(Windows Sockets — 10049(0x00002741). The requested address is not valid in its context. ) line=590 file=SrcDataExchangeTcpClientImpl.cpp
Проблема, судя по всему, в том, что у меня кластер на другом порту (который я честно прописал в форме)
Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанного поставщика. Вероятно, он установлен неправильно.
непонятка — как это можно подпилить ?
Спасибо, очень полезная обработка. Давно хотел такую написать, да как и у всех руки не доходили. 🙂
Спасибо, то что надо. Раньше только средствами SQL сервера проводил анализ, а теперь и со стороны 1С можно проанализировать.
(59) Sanek_159,
А скажите, какая разницы в этих двух анализах — с учетом того, что оба делаются идентичными средствами (и с идентичным результатом) самого SQL?
(60) AlexO, В этой обработке для меня более наглядно видно какая таблица (справочник, документ и т.д.) какого размера и т.д.. В SQL таблицы хранятся в виде, например: dbo._AccumRg19779 — это регистр накопления «Затраты на выпуск продукции НУ», приходится открывать другие обработки, чтобы понять, что это за таблица. А тут сразу видно и можно оперативно оценить масштабы бедствия, если они есть.
Когда выбрал вариант отчет «Наибольшие таблицы SQL» сформировал, а потом просто попытался поменять сортировку — отчет никак не отреагировал, он продолжал считывать параметры заданные по-умолчанию. Может правильно все таки чтобы отчет отзывался на редактирование параметров? Показатели отрабатывают хорошо, но почему нет данные по зарезервированному месту и число записей? (я выбирал параметр чего считать)
Если SQL исключительно в режиме Shared Memory — то данная обработка не работает.
у меня вот так в Shared Memory заработало:
«Driver={SQL Server Native Client 10.0};Server=» + SQLСервер + «;……
и c пользователем «sa»
А во сколько раз может увеличиться производительность, если перевести базу в режим Shared Memory?
У меня база сейчас работает на платформе 8.1 Я правильно понимаю, что для этого нужно перейти на 8.2?
В файловом режиме размер таблицы не посмотреть ?
Все хорошо только надо в отчете показывать имя таблицы sql
(66) pose, тоже интересут файловый режим. Можно посмотреть сколько какая таблица занимает дискового пространства. Столкнулся с ошибкой «превышен максимально допустимый размер внутреннего файла». Надо разобраться…
Если у вас кластер 1с серверов, то обработка подключаться не будет. Пришлось код переписывать ((
Автор вообще забил на разработку???
надо заценить
(57) antosha,
http://www.microsoft.com/download/en/details.aspx?id=23734
Попробуй поставить вот этот драйвер ->
Мне помогло
То, что надо, сенк.
Изящнее размеры потрохов базёнки вытянуть запросом T-SQL
(74) zzz_natali, о, еще один гуру-члевовещатель, с почти нулевым рейтингом, малой склонностью к прочтению описания и анализу, но большой склонностью к необоснованному высокопарному поучению. В обработке данные и получаются запросом в sql, но тут возможны всяческие отборы, сортировки и много других полезных и приятных фишек. В общем включайте мозг для обдумывания почему что и как, это полезно.
(69) romankoav, почему не будет? должно все хорошо подключаться. хотя увидел в (56) подробный комментарий, посмотрю код.
(70) да. я делаю какой-то инструмент и выкладываю, деньги я получаю на основном месте работы и никакой поддержкой не занимаюсь, какой смысл. вменяемый программист при желании сам все сможет исправить под себя, вот Вы же смогли это сделать.
(62) опишите подробнее.
(60) AlexO, все верно. данные тащатся запросом SQL. Но здесь возможно отборы, сортировки.. Ну и банальный пример, мой пример в то время — доступа к sql-серверу нет, я был просто программист в крупной компании. Зато есть возможность попросить подойти начальника IT-отдела и ввести пароль к sql в обработке.
(54) chmv, конечно нет. данные тащатся из sql и если у вас нет доступа к базе — то ничего получить не получится. увы.
(67) Kabz, что значит «надо»? я не ваш подчиненный, а вы не мой работодатель. Вам надо — код открыт — сделайте как лично вам надо.
(75) Вы — не джентльмен. Так с женщинами не общаются(даже, если у них не светлый цвет волос).
А кто будет адаптировать под 8.3?
Спасибо! Как раз то, что нужно! 🙂
Автор обрати внимание на:
Сортировка в настройке «Наибольшие таблицы SQL» не работает.
Отсутствует возможность настраивать СКД в режиме предприятия.
Нет имён таблиц SQL.
Не все типы метаданных.
гуд
не могу подключиться . пишет «Ошибка при подключении к SQL». Скуль 2008 r2. подключаюсь с локальной машины
Что-то не понятно с размером. У меня общий размер базы 82Гб. При этом размер только документов больше 97Гб
Спасибо, очень помогла обработка, применял для базы БП 3.0 в которой Регистр сведений ВерсииОбъектов занимал 97 % размера базы (63 Гб),
правда пришлось регистр резать через TRUNCATE TABLE name
И еще, как ни странно, версинифицирование было включено, видимо наследие перехода с БП 2.0.
Станислав, здравствуйте!
Большое спасибо вам за такую качественную программную разработку!
Подскажите пожалуйста, «Размер: 192709.63 MB, Неиспользованно: 39868.26 MB»
Что имеется ввиду под формулировкой «Неиспользованно»?
Добрый день. При открытии возникает ошибка.
База ERP 2.2. В файловом режиме работает?
в режиме УФ вообще должно работать?
выводит в 1С:Комплексная автоматизация 2 (2.2.3.226)
Ошибка инициализации модуля: ВнешнийОтчет.АнализРазмеровТаблицМетаданныхРазличнаяСтатистикаОБазе.МодульОбъекта
по причине:
{ВнешнийОтчет.АнализРазмеровТаблицМетаданныхРазличнаяСтатистикаОБазе.МодульОбъекта(930,20)}: Конструктор не найден
Действие = Новый <<?>>Действие(«ДействияПанелиИзменениеЗначенияДинамическогоОтбора»);
{ВнешнийОтчет.АнализРазмеровТаблицМетаданныхРазличнаяСтатистикаОБазе.МодульОбъекта(3387,29)}: Тип не определен (НастройкаПериода)
НастройкаПериода = Новый <<?>>НастройкаПериода;
Не работает в файловом режиме.
Ошибка исполнения отчета
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных «ТаблицаДанных»
по причине:
Не найден внешний набор данных «ТаблицаДанных»
(81) Да, за эти 7 лет обработка стала нерабочей для текущей платформы. В ближайшее время адаптирую.
(88) Я уже не помню( Посмотрю по коду как буду переводить на 8.3
(85) Что-то не так вводите.
(86) Значит размер базы не 82 гига)
(87) Спасибо)
(89) Это из-за того, что обработка делалась под 8.2, а сейчас 8.3 и там убрали НастройкаПериода. Скоро поправлю.
(90) Это из-за того, что обработка делалась под 8.2, а сейчас 8.3 и там убрали НастройкаПериода. Скоро поправлю.
(91) Напишите версию платформы, название и версию конфигурации, обычный режим или управляемый.