<?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='\
последняя фраза на мой взгляд все убивает. Ибо простым нажатием кнопки мы легко можем похезить целостность базы
На самом деле ничего страшного нет. Так как обработка сама вычищает все основные ссылки из таблиц: регистров, изменений, журналов. Если что-то и останеться запускаешь ТИИ, так как база стала намного меньше оно пройдет быстро и дочистит оставшиеся ссылки.
Так если удалять документ, то и движения все удаляются (лениво код смотреть)
(3) Конечно!
У меня сразу ошибку показала!!!
(5) Какая ошибка? Текст пожалуста и версии платформы, конфигурации и SQL servera.
Ошибка в закладке обработка в таб. части. Имя документа + ошибка. УПП 1.2.17.3, Microsoft SQL Server Management Studio 9.00.1399.00.
(7) Можно дословный текст ошибки в кавычках?
В копии вроде работает, в рабочей проверять уже не буду!
Отличная обработка, но пришлось подправить из-за 2 возникающих ошибок:
1) Некорректный перевод даты (если её выбирать в условии). SQL воспринимает: гггг.мм.дд, а переводилось в дд/мм/гггг.
2) В обработке в таблице _SequenceChangeRec выбиралось поле _Recorder_RRRef, а надо было _RecorderRRef.
Чистил базу, перед обновлением конфигурации, и вводом начальных остатков, даже часть документов оставлял в базе, на удивление даже не пришлось перебрасывать в идентичную конфигурацию. Заработала на живую. Пробовал на торговле (2 часа на все) и Бухгалтерии (12 часов)
(11) У меня бухгалтерию в 10 Гб вычищает за чуть больше часа.
у Вас 12 часов — это какой размер базы? или сервер слабый?
Бухгалтерия 4 года, сеть магазинов розница, количество маленькое, но строк много.
У меня перепроведение докуметов за ночь (с 18 по 09) успевает только один месяц. Прирост в год больше 10 Гб. Потому и открывал заново, что база уже не ворочается. Выгрузка DT занимала полтора часа.
За обработку спасибо. В процессе использования сделал два уточнения:
1. Учёл смещение дат в sql-базе для пересчета значения даты в параметре.
2. При удалении последовательностей изменил запрос для указания ссылки на реквизит регистратора в трёх вариантах сразу (действует всегда только один):
_Recorder_RRef
или
_RecorderRRef
или
_Recorder_RRRef
Не работает, не может получить кол-во документов, все время 0, что делать?
(15) Какая платформа, какой скуль?
(16) (8.2.13.218), sql 2005
(17) Подключаться нажимали? Окошко с параметрами выскакивала? Параметры правильно указываете, т.е. тест соединения проходи?
(18)Да все подключается, без ошибок
Получилось выполнить удаление только на платформе 8.1, на 8.2 не находила документы, возможно причина была в том что 8.2 работает не по стандартному порту 1541 а по 2041. При удалении на 8.1 дико рос лог и обработка падала с ошибкой, указал ограничение логу в 20 Гигов, хватило и все прошло успешно.
просто удаляет? или позволяет перецепить данные документы
(21) да
Очень полезно и своевременно.
Только пришлось реализовать ссылочную целостность и добавить возможность удаления документов списком.
Спасибо!
Работает как часы. Меня очень сильно выручила.Базу с 40Gb до 5Gb урезал очень быстро(по сравнение с типовым удалением).
Только была проблема с отбором документов по периоду. Неверный формат преобразования дат в формат sql: у меня почему-то дата вот-так «2011-06-17». Если б еще автоматически определяло формат дат sql сервера. 🙂 Хотя можно и без этого.
Очень полезно и своевременно.
Только пришлось реализовать ссылочную целостность и добавить возможность удаления документов списком.
Спасибо!
Поясните пожалуйста, что конкретно имеется в виду под реализацией ссылочной целостности? Замена во всей конфигурации ссылок на удаляемые документы — пустой ссылкой?
Подключаюсь к базе. Задаю на удаление один вид документов «АвансовыйОтчет», устанавливаю отбор за период выдает пустую ошибку.
Да… База на 8.2 платформе.
У меня вопрос после очистки документов, в центральной базе удаляться ли в периферийной базе после обмена данных?
скачал вашу обработку, но выдает ошибку при проверить соединение… текст ошибки
«Не выполнена проверка соединения из-за ошибки при инициализации поставщика. Неопознанная ошибка», в чем дело?
спс все быстро удаляет, с ошибкой разобрался надо было подключаться через поставщика SQL Native Client и там указать имя сервера и стандартный пользователь sa
теперь проверяю будет ли удаляться в периферийной базе кому будет интересен результат тому отвечу
Спасибо большое автору хорошая обработка тем кому надо обрезать большую базу. Но жаль что не передается через обмен на периферийную базу. (РИБ 1С 8.1.15.14 управл торг для Казахстана 2.2.8.10)
после очистки базы этой обработкой у меня размер SQL базы не уменьшилось, в чем дело?
а на PostgresSQL не работает что — ли?
Идея хороша, но сыро пока — куча не обнаруженных объектов по ссылке вывалилась после выполнения обработки при тестировании и исправлении.
(26) LoboVik, такая же ошибка…
Автор, ты где?
Не работает отбор по дате!!! Выбираю все документы, в отборе указываю период для отбираемых документов — удалено документов 0!!! Из-за этой обработки купил подписку за 800!!! р. На#рена нужен аватар для публикации комментариев???!!!!
(36) SeiOkami, в бегах, видимо )))))
Не знаю как отбор, а вот ошибка, что на скрине в (26) решается коментированием в коде обработки участка удаления последовательности документов (если не путаю, просто давно пару месяцев назад ей пользовался).
ну как решается… по крайней мере так работать будет =)
потом последовательности можно своим кодом очистить
подскажите что нужно подправить в обработке чтоб под 8.2 отбор по периоду работал sql2008r2
На 8.2 один документ удаляла 5 мин, дальше не стал ждать, лажа какая то 🙁 ….
очень полезная штука.. спасибо..
На 8.2 не работает. Что сделать ? И кстати если условий несколько — текст запроса формирует некоректно, пришлось пробел добавить перед «И»
(42) В документе не война и мир были? а то может еще и быстро удалилось…
пробую почистить базу в 140 ГБ БП 2.0 🙂 последняя надежда.
(46) quick, Вышло ?
Есть желание удалить ПРОВОДКИ по определенныйм документам с базе на 700 Гиг.
Обработка ПРОВОДКИ умеет удалять ?
Почему справшиваю — нарисовал запрос в SQL на удаление из основной таблицы — в надежде что из таблицы ЗначенияСубконто данные удалятся сами (триггерами).
Как оказалось 1С об этом не подумала.
Теперь вопрос — пытаться догадаться как именно связаны две таблицы (ключа в таблицах нет) или это может сделать эта обработка ?
Условие ДоговорКонтрагента.Наименование «Содержит» — преобразует в Like…
имя поля через точку — надо бы добавить замену имени параметра через _
но почему то SQL запрос не cработал
Здравствуйте! Кто может описать какие подводные камни есть при удалении напрямую? где то это обсуждалось?
Очевидно что надо удалять корректно — т.е.
1) не удалять документы — т.к. там не только документ + табл части в разных таблицах SQL но и еще есть движения регистров и общие итоги! Вывод лучше не связываться с удалением документов!
2) удаление справочников — тут уже проще — надо лишь убедиться что на удаляемые элементы не осталось ссылок в других объектах базы.
3) удаление данных регистра сведений — совсем просто, но они и штатными средствами неплохо чистятся!
Вопрос:
Что то еще я не учел? Итоги или общие данные базы какие то? Все ли я верно написал в пунктах?
Скачал, попробовал, не учитывает смещение в 2000 лет, но лечится без вмешательства в код, просто добавьте 2000 лет к дате в отборе
Клевая обработка. Хорошо написана — при желании можно легко дописать то, что нужно тебе.
Добрый день! Подходит ли обработка для базы на postgre sql?
(49) суть удаления через скуль скорость!
Но вы должны быть экспертом и все эти пункты просчитать иначе привет базе))
В каком месте может вылезти ссылка на объект? Нужно в каждом случае рассматривать, что вы хотите удалить, а то что вы описали это только часть айсберга может быть.
О чем я говорю? Прогнать все метаданные, не только то что на поверхности, тогда и будет результат на лицо!
Подскажите, какие параметры подключения к базе posgre указывать в обработке
(54) На Postgre не проверял, возможно придется код править.
При установлении отбора выдавало что удалено 0 документов, добавил к дате (к году) 2000 и все получилось.