<?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='\
Очень неплохо!
Было бы еще круто сделать автоматическое подключение к базе и сохранение логов. + сокращение журнала на дату.
Чтобы это запускалось регламентно.
Еще — нет возможности вести в одной базе несколько логов из разных баз! 🙁 а это бывает нужно…
(1) Сокращение журнала сделаем. Автоподключение к базе и сохранеине логов — как бы это вы хотели видеть(я имею ввиду в какие моменты)?
Возможность вести в базе логи нескольких баз изначально была, но от неё я отказался, в пользу получения более быстрых отчетов и более быстрой загрузки данных в БД(изначально журнал за месяц у меня грузился 1 час). Я предполагал хранить базу в файловом варианте — чтобы получить более высокую скорость формирования отчета.
p.s. Народ, если попробовали, укажите пожалуйста, какого размера(средний размер) у вас выгруженный журнал за месяц, и сколько по времени вы грузили этот журнал в БД с приведенной в публикации конфигурации
(2) Автоподключение: Рассмотрим вариант когда несколько баз. Необходимо создать справочник настроек подключения к базе (можно назвать: «Информационные базы») — этот справочник будет делить все данные в регистре и будет являться владельцем остальных справочников с данными.
Нужно сдлеать регламентное задание (настраивать рассписание) — которое бы например раз в день производило подключение к базе и забирало статистику. указывать за какое количество дней сокращать (это все в справочнике настроек).
при создании настройки ИБ и включении галочки «автообмен» — должно создаваться регламентное задание (посмотри как сделано в стандартном обмене в УТ, БП, ЗУП, УПП). Так же можно было бы запускать обмен вручную.
Несколько баз: думаю если ввести индексы то для больших объемов данных будет довольно быстро работать.
(3) При текущей организации регистра процесс удаления записей из него за период будет достаточно долгим
(5) а зачем удалять данные? например если требуется хранить журнал регистрации…
но если установить отборы, удаление должно быть очень быстрым…
Что тогда подразумевается под этим? :
(3) Немного приблизил ваше желание к жизни 😀
(7) я имел ввиду сокращение журнала регистрации в реальной базе — т.к. он растет и логи растут и это может занимать много гигабайт!
т.е. такая база нужна для того чтобы слить в нее журнал регистрации, а в реальной базе удалять журнал.
— было бы все неплохо хранить даные из разных баз (спр.ИнформационныеБазы — в нем хранить все настройки для подключения и этим справочником делить все данные в регистре (и сделать владельцем справочников). ввести индексацию данных в регистре и все должно быстро летать!)))
(8) спасибо! погляжу!…
В журнале не отображаются изменения в константах. Это так задумано?
(10) В журнал не грузятся данные об изменениях в регистрах — так задумано, возможно это не корректно.
Константы теперь грузятся 🙂
Добавил справку в отчет(5 примеров).
А не подскажите где взять КонсольЗаданий 🙁
(12) на диске ИТС
по-моему было бы еще неплохо следить за изменениями в регистрах сведений
(14) Изначально информация об изменении в регистрах(Сведений, Накопления) загружалась в базу и была возможность отследить, что кто-то что-то менял в регистрах.
Но по скольку, в журнал регистрации попадают очень не детальные данные об изменени записи регистра — я решил отказаться от загрузки в базу этой информации
Здорово работает. А вот когда загружаешь данные из 8.2, то уже сконвертированная конфигурация на 8.2 обработкой ЗагрузитьДанныеXML выдает ошибку:
{Обработка.ЗагрузитьДанныеXML}: Ошибка чтения журанала регистрации: C:Documents and SettingsАдминистраторМои документыФайл.xml
{Обработка.ЗагрузитьДанныеXML}: Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XML
ВызватьИсключение Ошибка;
🙂
Вот!
Хотелось бы вот что еще уточнить: через консоль заданий ставлю в определенное время догружать журнал, ничего не грузит, может что то не так делаю, подскажите плиз. Огромное спасибо.
(17) а напрямую грузит?
Ошибка происходит для следующих данных:
<v8e:Event>
<v8e:Level>Information</v8e:Level>
<v8e:Date>2010-08-18T18:10:31</v8e:Date>
<v8e:ApplicationName>1CV8</v8e:ApplicationName>
<v8e:ApplicationPresentation>1С:Предприятие</v8e:ApplicationPresentation>
<v8e:EventName>_$Access$_.AccessDenied</v8e:EventName>
<v8e:EventPresentation>Доступ. Отказ в доступе</v8e:EventPresentation>
<v8e:UserID>0cb84f4c-4b34-45bc-9134-2ff3a0a46d82</v8e:UserID>
<v8e:UserName>Белоусова Елена</v8e:UserName>
<v8e:Computer>ZEUS</v8e:Computer>
<v8e:MetadataName>
<v8e:Item>Catalog.НастройкиВыполненияОбмена</v8e:Item>
</v8e:MetadataName>
<v8e:MetadataPresentation>
<v8e:Item>Справочник. Настройки выполнения обмена</v8e:Item>
</v8e:MetadataPresentation>
<v8e:Comment/>
<v8e:Data xsi:nil=»true»/>
<v8e:DataPresentation/>
<v8e:TransactionStatus>NotApplicable</v8e:TransactionStatus>
<v8e:TransactionID/>
<v8e:Connection>2520</v8e:Connection>
<v8e:Session>4992</v8e:Session>
<v8e:ServerName>SUPERX</v8e:ServerName>
<v8e:Port>1662</v8e:Port>
<v8e:SyncPort>1664</v8e:SyncPort>
</v8e:Event>
Как раз на <v8e:MetadataName> — чтение заканчивается, т.к. <v8e:Item> — следующий уровень структуры, а глубина чтения до этого уровня структуры не предусматривалась?
напрямую грузит все нормально
(19)
Видимо, в обработке «Анализ журнала регистрации» для 8.1 с диска ИТС это не предусматривала. Я именно эту обработку брал за основу чтобы реализовать загрузку журнала из .xml
(17) База данных «Журнал регистрации» работает в клиент-серверном варианте? Может быть вы не включили задание, может быть что-то не так настроили в расписании задания
Привет, попробовал конфигруцию, вылетает по ошибке :
«{Обработка.ЗагрузитьДанныеXML ( 1128 )}: Ошибка чтения журанала регистрации: E:jurnalЖурнал регистрации1.xml
{Обработка.ЗагрузитьДанныеXML ( 1237 )}: Ошибка при вызове метода контекста (Записать): Код не уникален!
»
Пробовал и из XML и напрямую из базы.
(22) У вас в базе что-то с событиями. Откройте справочник «События» и посмотрите что там с кодами. Можете попробовать в конфигураторе для того же справочника увеличить длину кода. Видимо, у вас в базе полно разнообразных видов событий.
Все получилось, спасибо.
(24). В личку можете скинуть таблицу того что у вас хранится в справочнике «События».
Если вам понравилась конфигурация — можете плюсануть
p.s. Есть ли нужда в видео-уроках о том как работать с конфигурацией? Как посмотреть отчет по тем или иным данным.
Здравствуйте)
Конвертировал в 8.2, при старте загрузки напрямцю
{Обработка.ЗагрузитьДанныеXML.МодульОбъекта(81)}: Ошибка открытия журанала регистрации: C:<путь>v8_31C8_e.xml
{Обработка.ЗагрузитьДанныеXML.МодульОбъекта(531)}: Неверный формат выгрузки журнала регистрации
ВызватьИсключение Ошибка;
вводная:
выгружаем/режем журнал раз в сутки.
размер lgp-файлов от 100Мб до 2Гб.
регистируем всё подряд.
проблема:
чтение этих файлов.
1) открытие страницы журнала больше 500Мб занимает от получаса до бесконечности.
2) отборы, переход на другую запись также занимает уйму времени, а порой и вовсе не возможно.
3) Пробовал Вашу обработку для этих целей — то же самое, к сожалению.
Очень кстати понадобилась. Выгружаем за день и после загружаем olap где пользователи сами могут оперативно смотреть изменения. СПасибо
(28) «и после загружаем olap» — можно чуток по-подробней?
(27) Отбор хорошо работает по реквизиту «данные». Попробуйте в конфигурации Журнал регистрации включить индексирование для интересующих вас измерений/ресурсов регистра сведений
При попытке загрузки журнала из 8.2
{Обработка.ЗагрузитьДанныеXML(1128)}: Ошибка чтения журанала регистрации: Журнал регистрации.xml
{Обработка.ЗагрузитьДанныеXML(1057)}: Неверный формат
(31) Обратите внимание — конфигурация для работы с конфигурациями на платформе 8.1
Для 8.2 есть честно скопированная и подправленная конфигурация в соседней теме
Отчет по журналу регистрации:
1. открываем,
2. нажимаем сформировать
3.все работает.
1. Заходим в конструктор,
2. убираем все поля,
3. добавляем все поля,
4. ОК,
5. Сформировать — Ошибка.
1. Заходим в настройки отчета
2. Загрузить стандартные настройки
3. ОК
4. Сформировать
5. Отчет пустой
Хотя ошибки и не критичные
а как то поподробнее можно про строку соединения у меня 8.2 и она вываливается если я пишу соедиение что-то типа этого — Srvr=»atlantis»;Ref=»smit_torg»;Usr=»Юзер»;Pwd=»пасс»; Что тут не так???
(34) Конфигурация не предназначена для работы с базами на платформе 1С 8.2
Зачёт!
Автору — спасибо.
Файл выгрузки — 2 гига загрузился за 1:11:46