<?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='\
Автор подскажите пожалуйста если просто сменю сортировку в табличной части ваша обработка покажет изменения. Предусмотрена ли выгрузка создаваемого регистра в другую базу(с практики размер етого регистра может может составлять 60 и более ГБ). Зарание спасибо за ответ.
нет не покажет т.к. номер строки это поле табличной части.
Насчет 60 ГБ для того чтобы регистр достиг подобных размеров записывать изменения придется очень долго.
В подобной подсистеме реализованной например в УПП каждое изменение документа приводит к выгрузке всего документа в двоичные данные и сохранению этих двоичных данных в регистр сведений, такой подход действительно приводит к быстрому разрастанию регистра.
В данной выложенной подсистеме подход совершенно другой. Здесь при внесение изменений в объект в регистр сведений записывается только информация о том у какого документа, коркой именно реквизит был изменен, ну и естественно автора(виновника) изменения и время когда данной действие было произведено. Создается одна запись в регистре с неопределенными типами измерений, которая хранит в себе ссылки на объекты базы, т.е. 5 текстовых полей не более 50 ти символов. Это занимает очень мало места и легко обрабатывается в дальнейшем.
А можно 8.1 приложить? заранее спасибо
(3) qvvert, Извиняюсь что ввел в заблуждение заголовком статьи(заголовок я исправил). к сожалению подсистемы написанной под 8.1 нет. Но вы можете создать у себя аналогичные подписки на события и скопировать туда тексты модулей Важно!!!(копирование объектов копи псейтом целиком из дерева конфигурации, может привести к повреждению конфигурации, поэтому копируйте только текст модулей).
Также рекомендую вам перейти на 8.2. конвертация данных не займет много времени и в большенстве случаев проходит безболезненно. Кроме того(если ваш случай окажется болезненным), после конвертации можно включить режим совмещенности с кодом работающим только на 8.1, до того как куски будут скорректированы, что позволит не прерывать работу системы. А возможность проводить динамические обновления вас приятно обрадует
Подскажите пожалуйста, чем ваше приложение лучше решения, которое предлагает Бизнес Плюс?
Я сейчас активно стараюсь ставить разработку от Бизнес плюс, которую сам адаптировал для управляемого приложения.
(5)подозреваю что ни чем. к сожалению не могу провести полного анализа так как для этого мне придется купить их решение.
А как насчет очистки истории по периодам?
(8) neon57, Добавил в версию 2.
А чем данная разработку лучше подсистемы версионирования в БСП?
Тем что в моей подсистеме не полная сохраняется верися объета в виде XML файла переведенного в двоичные данные. А сохраняются только значения и только измененных реквизитов. А это в свою очередь облегчает анализ внесенных изменений и не приводит к неоправданному(из за обилия не нужной информации) разрастанию базы.
Сделайте, пожалуйста, чтобы можно было включать только новые, или только удалённые, или только изменённые строки. И краткую форму истории изменений (только кто , когда и % изменений).
Поправьте пожалуйста: вместо hystory_2.cf скачивается hystory_3.cf, а hystory_2.cf не нашел. Нужно было для УТ 10.3
Подскажите, эту подсистему можно интегрировать, с конфигурацией Салон красоты???
Не планируете добавить фиксацию изменений Констант, чтобы т.с. было «все в одном флаконе»?
Спасибо. Использовала вашу конфигурацию на Платформе 8.3.10 для УПП 1.3+СРМ. Заменила некоторые вещи. Код очень понятный и читабельный.
Отказалась от записи новых документов и справочников, а так же запись при каждом проведение тоже переделала (нас интересуют только изменения, которые меняются, те теперь при проведение он смотрит, был ли документ до этого проведен или нет). Пользователям более читабельно и информативно, чем Журнал регистрации и проверка отчетов)))