<?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='\
Здесь есть список ссылок на публикации аналогичной направленности
http://infostart.ru/public/19363/
Всегда использую только CMD+архиватор
Народ изобретает супер-пупер-мупер обработки потому что не читали хелп от cmd
У меня уже много лет работает связка CMD+rar для 7.7
Не вижу причин городить обработки и вообще усложнять.
Так я по этому поводу и говорю. Простота — залог отсутствия головных болей и успешной работы.
2 файла излишне на мой взгляд. У меня в один ещё и с шифрованием работает.
Есть ключ /w для команды «Start» и есть «&» для одновременного запуска команд. Пример:
net stop «1C:Enterprise 8.1 Server Agent» & net start «1C:Enterprise 8.1 Server Agent» & «start /W путьОдноЭс CONFIG СтрокаПодключения /N юзверь /P пароль /DumpIB файлАрхива /Out файлЛога.
По мне так лучше средствами самой 1С.
http://infostart.ru/public/72057/
Вот здесь ссылка на скриптик применимо к 1С 7.7, 8.1 и 8.2
Работает на ура + дополнительные функции !
(6) Ну тут трудно сказать. Все зависит от предпочтений. Кроме того, большие базы быстрее обрабатываются архиватором, чем самой 1С (так, по крайней мере, у меня).
Пользователей ночью, конечно, нет, а вот фоновых заданий все больше или они теперь работают дольше (нашим базам всего полтора года).
Вопрос первый: остановит ли команда ЗавершитьРаботуПользователей фоновые задания.
Вопрос второй: я уже воспользовалась Вашим советом и попробовала эту команду, но пользователь, завершив свою работу пытается войти снова (такое окошко с секундомером), но база уже заблокирована и эта история продолжается пока ее не остановишь личным вмешательством. А после этого не закрывается пользователь-администратор, от имени которого блокируется база.
А вот команда РазрешитьРаботуПользователей выполняется нормально.
Публикация на эту тему была давно, но может кто-то откликнется?
«Сеанс администратора, тоже не закрывался (хотя, вроде бы должен?).»
Сеанс администратора в данном случае закроется только когда выгонятся все пользователи.
Возможно, я что-то делаю некорректно:
— на своем компьютере открыла сеанс произвольного пользователя.
— запустила команду под администратором для завершения работы пользователей (в данном случае одного)
На экране у меня — сеанс администратора и завершенный сеанс пользователя, который ежеминутно пытается войти в систему и команда, которая не заканчивается (три окна). Все это висит до тех пор, пока я не закрываю принудительно оба сеанса (только после этого команда из командного файла считается завершенной), тогда управление передается следующей команде, т.е. копированию. Следовательно, из двух выходов, предложенных Вами, подойдет, пожалуй, только первый.
Во всей этой ситуации меня смущает сеанс администратора.
Выскажусь ещё раз
главное в архивировании не создание архива, а уверенность, что у вас ЕСТЬ архивные копии
все мнения о том, что «достаточно использовать стандартные средства windows» или простенький bat-файл отпадают по одной причине — вы не знаете создался у вас архив или нет, а проверять даже раз в неделю быстро надоедает и что там с архивированием ни кто не в курсе (и не надо думать, что вы не такой 🙂 )
поэтому система архивирования должна сообщать ответственному о том что произошел сбой при архивации.
после такой постановки здачи думаем и выбираем (или создаем) нормальную систему архивирования
Удачи всем.
Изобретать колёса нет смысла! В наше время нужны такие средства, которые бы не упирались в длину пути к файлу и невозможность создания большего количества архивов, хотя бы на всякий случай! Ниже приведу ссылку на программу автоматической архивации неограниченного количества баз и символов в пути к файлу, оцените сами что лучше приятный интерфейс или строчки скриптов, где любая ошибка и уже не работает! 🙂 , вот ссылка:http://infostart.ru/public/157922/
2iS Интеграцияhttp://infostart.ru/public/145983/ может автоматизировать регулярную выгрузку для всех ваших баз 1с за несколько кликов. Базы поддерживаются любые, файловые и серверные, обычные и управляемые, 8.1, 8.2, 8.3.