<?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='\
😀 люблю powershell …http://gallery.technet.microsoft.com/ScriptCenter/
ver. 1.2
~~~~~~~~
Добавлено:
— Мягкое завершение процессов. CloseMainWindow и Close вместо Kill.
— Задержка до принудительного закрытия процесса (<sec>).
— Автоматическое обновление скрипта с ftp сервера (<upd>).
— Лог работы ncftpput и ncftpget (<ftp_log>).
ver. 1.1
~~~~~~~~
Исправлено:
— Ошибка при передаче на ftp.
Добавлено:
— Появился файл History.txt. 🙂
— Для каждой базы можно задать свой каталог архивов <store>.
ver. 1.0
~~~~~~~~
Реализована базовая функциональность:
— Копирование 1Cv8.1CD во временный каталог и упаковка с помошью 7-zip.
— Завершение процессов 1С и выгрузка средствами конфигуратора.
— Архивация произвольного набора файлов с помощью 7-zip.
— Копирование архивов на ftp сервер посредством ncftpput.exe.
— Удаление устаревших архивов.
— Хранение настроек в xml формате.
Добавил тестирование и исправление ИБ
ver. 1.5
~~~~~~~~
Добавлено:
— Уточнено описание параметров скрипта Readme.txt
— Оптимизирован код скрипта.
— Можно указать <exe> общий или для каждой базы свою версию.
— Определение свободного места на диске для архива.
А это надо изобретать? Можно просто ВНИМАТЕЛЬНО изучить возможности архиватора WinRAR. Этот таварищ может всё и больше. Надо уметь им пользоваться. Это я к тому, не надо изобретать велосипед, он есть. Надо учить на нём кататься.
P.S.: Я сталкивался с ситуацией, когда БД «рухнула», и был подобный (твоему) архив. Его «выдернуть» не удалось, а вот мой, RAR-ский, прекрасно открылся. Что на это скажете?
(5) позвольте просто полюбопытствовать? именно у вас — рар — лицензионный?
(6) А у тебя нет? Отвечаю: у меня WinRAR нормальный. Напоминаю: WinRAR условно-бесплатная прога. Есть желание — купите. Но, просто советую посмотреть: ВСЕ ваши вопросы там давно решены. На уровне АВТОМАТА.
Напомню далее: там легко настраивается ДИНАМИЧЕСКАЯ архивация, с любыми параметрами. Посмотрите.
(7) довожу до вашего сведения, что программист должен уметь не только кодить/писать, но и читать. Видимол вы невнимательно читали EULA а винрару, позволю себе процитировать:
WinRAR EULA (End User License Agreement) for use and distribution
———————————————————————————
The RAR (and its Windows version — WinRAR) archiver are shareware. This means:
The author and holder of the copyright of RAR and WinRAR is Alexander L. Roshal. The licensor of the following license and bearer of the worldwide exclusive usage rights to reproduce and distribute RAR and WinRAR is win.rar GmbH, Schumannstr. 17, 10117 Berlin, Germany.
Anyone may use this software during a test period of 40 days. Following this test period of 40 days or less, if you wish to continue to use WinRAR, you must purchase a license.
.
так что если у вас нет желания купить — будьте добры после 40 дневного срока — отказаться от легального пробного использования программы.
.
PS: я не спрашивал — нормальный или ненормальный, спросил просто «именно у вас рар лицензионный?» — ответа так и не получил.
(8) А зачем это? Я пишу, что можно сделать, используя это. Всё!!! А уж регламент — пусть каждый для себя решит сам.
ОТвет: ЛИЦЕНЗИОННЫЙ!!!
Когда в ответ на прямой вопрос дают непонятные ответы, а в конце оказывается «лицензионный» — я сразу начинаю сомневаться в моем отношении к миру и людям… 😉
(10) Мы, вроде, не архиваторы обсуждаем, а как архивировать… А какой архиватор использовать — личное дело каждого. Я просто выразил своё мнение: не надо изобретать велосипед, да ещё с квадратными колёсами, есть готовое решение, более того, решение таково, что его (в случае аварии) можно запустить с любого стороннего компа. А вопрос лицензионности — на совести пользователя.
(11) какое нафиг решение с квадратными колесами? хорош понтоватся, человек сделал бэкап на повершелле, чего еще?
(11) предлагать платное решение (винрар), вместо уже имеющегося бесплатного/оплаченного (винды с повершеллом) — всегда считается дурным тоном, особенно е сли навязывается силой, что ты и пытаешься делать, упирая на велоспед с квадратными колесами.
Добавлю от себя, что powershell очень кстати — микрософт намерен им заменить скриптинг, использующийся до этого. А насчет архиватора, все тру айтишники используют 7zip — примеры, есть программист, прикручивал алгоритм 7zip к c# год, сейчас его библиотечку скачивают со всего мира…ещеhttp://habrahabr.ru/blogs/sysadm/81657/
…Я сталкивался с ситуацией, когда БД «рухнула», и был подобный (твоему) архив. Его «выдернуть» не удалось, а вот мой, RAR-ский, прекрасно открылся. Что на это скажете?
Чем, позвольте поинтересоваться, Ваш Rar-ский архив отличатся от 7-zip с точки зрения 1С? Мне думается — это просто архив, а содержание и там, и там будет одно и тоже. Это раз.
Во-вторых, я надеюсь Вы внимательно изучили предлагаемое решение и прочитали Readme.txt перед тем как критиковать? Так вот там Lucida Console по белому (чаще всего) написано «…В некоторых случаях возможны ошибки в архивной копии из-за незавершенных транзакций в базе…». А это значит, лучше использовать метод № 2, когда завершаются пользовательские процессы и создается нормальный файл выгрузки *.dt. Да, решение писалось для случая, когда все пользователи работают в терминале на одном сервере, и на удаленных машинах сеансы не завершаются (задачи такой не стояло).
И третье. Кроме создания архивов, скрипт позволяет удалять устаревшие и отправлять созданные на ftp. При чем тут WinRAR?
И четвертое. Настройки скрипта удобно вынесены в отдельный xml. Мне так захотелось.
Вам нравится WinRAR? Прикрутите его к скрипту и пользуйтесь — разработка бесплатная, код открыт.
С наилучшими пожеланиями.
А если в логе пишется «Недостаточно свободного места на диске!» (хотя на самом деле свободно около 500ГБ) как решить эту проблему?
Странно, но размер самого большого файла в базе данных — 165МБ. Размер всех dbf-файлов — 800МБ.
Свободно же на диске — 465ГБ.
Может что-то с какими-то правами?
Записано вот так (без пробелов):
< store > D:BackUp < / store >
Сколько «весит» самый большой файл у Вас в каталоге D:BackUp ?
Локальный диск D полностью чист (ну не считая системных папок: System Volume Information, $RECYCLE.BIN). На нем только папка в корне диска BackUp. В этой папке нет вообще никаких файлов.
Скорее всего скрипт не может корректно определить свободное место на диске (по логике PowerSell [0 > null], поэтому и ошибка). Возможно это связано с правами на весь диск, как Вы и предположили.
….
так что если у вас нет желания купить — будьте добры после 40 дневного срока — отказаться от легального пробного использования программы.
PS: я не спрашивал — нормальный или ненормальный, спросил просто «именно у вас рар лицензионный?» — ответа так и не получил.
у рара вроде утилиты RAR.exe и UnRAR.exe не ограничены тральным сроком, хотя выбор в сторону 7zip поддерживаю.
(8) Опять от темы отвлекаемся. Мы же вроде обсуждаем, как, что и чем архивировать. Законность преобретения — это для каждого пользователя его проблема. О WinRAR: знаю, что он бесплатно работает 40 дней. После этого оп продолжает работать, только некоторые функции не поддерживаются. Но!!! разработчик его не блокирует, в надежде на то, что клиент «одумается». У меня стоит какая-то «подарочная» или что-то в этом роде, про 40 дней не намекает… Поддерживает не все функции, но для этого хватает.
Кстати, а Ваша Technology — абсолютно бесплатна? Вообще работоспособна? А то была ситуация, когда меня вызывали «выдернуть» данные из аналогичного архива… НОЛЬ!!! Только пустые каталоги и ссылки на адреса файлов, где они должны быть… Отсюда и скорость работы.
Если кого-то заинтересует способ с использованием WinRAR — напишу подробнее. Хотя, как я понимаю, на этом форуме дураков нет. Проще — читайте справку WinRAR, раздел «Режим Командной Строки», совмещется с назначенными заданиями из Форточек, лучше с использованием «Спящего» режима.
А если в логе пишется «Недостаточно свободного места на диске!» (хотя на самом деле свободно около 500ГБ) как решить эту проблему?
по коду скрипта они ищет размер самого большого файла DT(+префикс+дата), возможно там косяк какой то..лучше закоментироват что выше писали
ver. 1.6
~~~~~~~~
Добавлено:
— Параметр <holyday>. Архивы созданные в этот день месяца не удаляются.
Используется для сохранения ежемесячных копий без их автоматического
удаления.
— Отображение в логе ошибки определения свободного места на диске.
— Скорректирована процедура закрытия процессов 1С. Теперь работает немного
быстрее.
Исправлено:
— Процедура запуска дочерних процессов для некоторых версий ОС.
в ХР работало,а че то в 7ке перестало…может че не так сделал…
вроде неплохая вещь!
8 баз прописал, всё прекрасно архивируется
Спасибо
попробуем
Скрипт для архивации файловых баз и произвольных файлов. Возможности:
— Завершение процессов и выгрузка средствами платформы в *.dt;
— Копирование файлов во временный каталог и упаковка в zip архивы;
— Пересылка созданных архивов на ftp сервер;
— Удаление устаревших архивов.
— Настройки скрипта хранятся в xml формате.
— Поддерживается произвольное количество баз. — Замечательная штука, но настройки в xml?! Может я консерватор но и csv хватило бы
Скорее всего скрипт не может корректно определить свободное место на диске (по логике PowerSell [0 > null], поэтому и ошибка). Возможно это связано с правами на весь диск, как Вы и предположили. Как же этот вопрос решается?! Зачем права скрипту на весь диск?
Замечательная штука!!!
Добавлено:
— Параметр <holyday>. Архивы созданные в этот день месяца не удаляются.
Используется для сохранения ежемесячных копий без их автоматического
удаления.
— Отображение в логе ошибки определения свободного места на диске.
— Скорректирована процедура закрытия процессов 1С. Теперь работает немного
быстрее.
Исправлено:
— Процедура запуска дочерних процессов для некоторых версий ОС.
ver. 1.7
~~~~~~~~
Добавлено:
— Параметры <server>, <base>, <connector> для подключения к базам,
расположенным на серверах 1С:Предприятие.
— Параметры <cuser>, <cpass> для подключения к кластеру серверов 1С.
— Метод архивации для серверных баз. Для использования нужно указать
<method>4</method> в файле настроек.
1. По серверной версии не устанавливается блокировка доступа на время резервного копирования в результате имеем «Ошибка исключительной блокировки информационной базы.» и неделю без архивов (УТ 11.1).
2. Удаление архивов идет без проверки успешности выполнения резервного копирования, результат новых архивов нет и старые все потерты.
3. Прикрутить параметр /Out тоже будет полезно, для разбора полетов.
(5) vladimir_makar(5) vladimir_makarov,
Скажу что ты просто дурак. Причем тут WinRAR, какая то твоя «рухнувшая» база а также что и откуда ты потом «выдернул»?
Тут скрипт для шедулера.
(10)Умник