<?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='\
Гениально! А целостность базы уже никому не нужна по ходу? Уж лучше я всех пользователей выгоню из базы, быстрее выйдет…
А то как то я тоже так экспериментировал, а потом пол дня втыкал почему у меня документ работает не так как надо, оказалось что всего лишь база испорчена, вот только это определить не всегда удается.
P.S. Тише едешь, дальше будешь (с) Народ
+(1) А использовать это в качестве архивирования базы вообще противопоказано иначе можно косяки и в рабочую базу внести при восстановлении!!! И узнаешь это когда голову начнут откручивать, за то, что что-то там полетело….
(1) Так никто не мешает выгоняйте и делайте копии. Только часто пользователи бросают свои компьютеры на закрывая 1С , никто естественно не работает, а копии к утру или во время обеда так и не сделалось
Где то здесь была обработка которая генерит скрипт для планировщика и скрипты блокируют базу и архивируют у меня уже несколько месяцев работают прекрасно
(3) А для этого есть много приблуд (и на этом сайте тоже) с помощью которых пользователи легко выгоняются… ну хотя быhttp://infostart.ru/projects/2514/ (то что на ум пришла)
Я естественно буду так делать… Просто хочу отметить (или предупредить других), что делать так как вы опасно… Проверено на личном опыте…
Риск есть, но в большинстве случаев база рабочая. Иногда лучше хоть такой архив, чем вообще никакого. Не всегда есть возможность выгнать пользователей. (не физическая возможность, а другая)
(5) В случае когда пользователя за машиной нет, вы все равно будете безусловно обрубать пользователя. Вы случайно не проводили анализ, какой вариант приводит к большему числу ошибок в базах: безусловно всех выкинуть и сделать копию или просто скопировать базу в которой работаю пользователи?
(0) Не в качестве рекламы !!!!!!!!
http://effector.com.ua/index.php?option=com_docman&Itemid=23
Общий архив > 4 Gb
Пользую второй год
(7) Что значит «безусловно обрубать»? Любой из вариантов «обрубания», как Вы изволили выразиться, будь-то через сервер 1С или ОбработкаОжидания в файловом режиме, КОРРЕКТНО завершает сеанс пользователя. Поэтому никакой анализ тут смысла не имеет, число ошибок в первом случае — 0.
(1) > А целостность базы уже никому не нужна по ходу? Уж лучше я всех пользователей выгоню из базы, быстрее выйдет…
…просветите простого бухгалтера: Гедальф, когда архивирует базы(не выгоняя никого), там как с «целостностью базы» в 7.7 и 8.1 ???
(7) Согласен, что если выгнать стандартными средствами будет правильнее, однако для этого конфигурация должна иметь этот механизм выкидывания по крайней мере в файловом варианте, а в сервере 1С чтобы выкинуть нужно знать пароль админа базы (кстати говоря, если на сервере 1С просто обрубить соединение, то всё нормально будет?), короче всё сделать можно, но если на предприятие нет постоянного админа это всё усложняет и вот тут бы хотелось иметь хоть какую-нибудь копию на всякий случай.
(11)
1. Ну приведенный здесь мой вариант никакой модификации для файлового варианта не требует 🙂
2. Если даже на сервере рубить соединение, то да, всё будет нормально.
3. Уважаемый WiseSnake здесь уже озвучил чем плох Ваш вариант. От себя добавлю: лучше никакого бэкапа, чем такой.
(12) Поделитесь пожалуйста как в файловой базе любой конфигурации (в том числе и самописных) выгнать пользователей не создавая специального механизма в конфигурации(т.е. не написан для этого ни одной строчки кода) ?
(13) Объявить, что сейчас всем будет бесплатная выпивка у входа в офис 😉
(6)> Риск есть, но в большинстве случаев база рабочая
По моей практике как раз наоборот, если пользователи РАБОТАЮТ, то в большинстве случаем база испорчена.
>> просветите простого бухгалтера: Гедальф, когда архивирует базы(не выгоняя никого), там как с «целостностью базы» в 7.7 и 8.1 ???
Абсолютно не в курсе, я им никогда не пользовался…
(13) А вы смотрели ту разработку, что я привел?
Лично я за встроенный механизм. В 8ке это решается изменением 1 строчки кода в конфигурации и обеспечивает максимально «мягкий» выход из базы. В 7ке это пару кусков кода
>>Лично я за встроенный механизм. В 8ке это решается изменением 1 строчки >>кода в конфигурации и обеспечивает максимально «мягкий» выход из базы.
Никогда не буду снимать конфигурации с поддержки ради 1 строчки кода, к тому же в базовых версиях изменения вносить не преполагается вообще, а них достаточно народу работает.
Резюме: если подходить грамотно к резервированию, то этим просто нужно заниматься, если на предприятии заниматься этим некому то иметь хоть что-то под рукой из копий лучше, чем ничего.
В ИТОГЕ дописываю рекомендации к этой обработки: перед началом архирование желательно обепечить чтобы никого в базе не было.
(13) Ну здесь же в комментах есть ссылка на мою поделку! 🙂 Не требует никакой модификации конфигурации (никакой дописки), работает с абсолютно любыми конфигурациями (самописными, типовыми), плюс к этому, ОДНОВРЕМЕННО с разными базами! 🙂
(17) Спасибо за ссылку, изучу ваш вариант
Автору:
зачем нужна обработка, если тоже того же можно добиться bat-ником из двух строк? Что-то типа:
xcopy d:database*.* \xTemp /d /s /q /h /y /c
.. .7z.exe a \xBakUpDataBase \xTemp*.*
(19) Глупый вопрос. Ведь очевидно обработка нужна для того, чтобы всё, что вы написали, не писать. А открыли обработку в базе и нажали одну кнопку и ВСЁ. Вы думаете все умеют бат-ники писать? я встречаю иногда таких админов, которым очень трудно объяснить что такое кодировка текста, не говоря уже о клиентах, у которых админов вообще нет, а только девушки с длинными ногтями!!!!
так и батник одним нажатием запускается «enter».
да и к чему так много букв… я просто предложил альтернативный вариант….
(20) Не глупый вопрос. А как раз вариант Mitay даже очень хороший. На практике его используем уже года 2. У меня лежат 2 шаблона таких батников (серверный и файловый), только они в имя копии дату добавляют и хранят последние 10 файлов. А в самом начале файла переменные, путь к архиву, к базе, имя пользователя и т.д. Вообще для таких целей в базе добавляем пользователя и снимаем галочку — показывать в списке
Админ вообще не пойму зачем, ярлык на батник положите на рабочий стол и пользователь разберется как его запустить. Или вообще в назначенные задания, что бы при включении компьютера запускался. Мне б Ваши проблемы
Своим постом я хотел сказать, не то что Вам не нужно было выкладывать результат своего труда, а то что Вы напрасно так отреагировали на комментарий Mitay
> у которых админов вообще нет, а только девушки с длинными ногтями!!!!
И приходящий 1С ник, который «стесняется» попросить всех выйти из базы, чтобы сделать полноценный архив 🙂
Довод, приведенный выше насмешил. Вызвали спеца, оплачивают его время и не желают подчиняться его требованиям, приходится ему, бедному, делать обходные манёвры. Странно…
Кривые ручки 1Сника против длинных ногтей бухш. Все тАк гармонично 😉
+(1) А использовать это в качестве архивирования базы вообще противопоказано иначе можно косяки и в рабочую базу внести при восстановлении!!!
В 8.2 не запускается.
скачал вашу обработку, указал необходимые параметры, поставил расписание, но в указанное время архив не скидывается? что я делаю не так?
скачал обработочку, проверил в обычном и управляемом приложении всё работает!!!