<?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://www.infostart.ru/projects/3650/
Потому что ночью когда нет никого и пользователи забыли выключить сеанс то просить становиться некого, а архив то надо сделать, вот жёстко и выгоняет. У меня все знают что во столько то будет отключение от программы и все привыкли. Да и днём нет времени просить бухов пока они выйдут,
во первых — редко кто на просьбы откликается
а во вторых — особенно кода по часу проводят чаепития не обращая внимания на мольбы выскакивающие на мониторе.
Безопасность прежде всего! А архив это исключительная безопасность любого IT специалиста!!! ИМХО!
Единственный замеченый минус это если ваша конфа имеет УРБД и обмены проходят в фоне, то ингода (за год было 2 раза) фоновое задание висит в памяти не отключаясь, и скрипт видит его как не отключёного пользователя и не может его отключить, но этого пользователя ни где не видно. Лечиться перезагрузкой сервера.
(3) Но ведь можно же установить флаг блокировки запуска фоновых заданий? Тогда новые запускаться не будут.
(4) Можно и флаг поставить, если обмены не нужны.
У меня в фоне перед архивацией и после неё проходят обмены.
Чисто рейтинга не хватает поставить минус.
На MS-SQL сервере работает такой инструмент SQL Server agent, в котором работает управление заданиями (JOBS)
Этот инструмент мне бэкапит все sql-ные базы еженочно, и присылает письмо на почту с результатами этого процесса, и никого никуда не выгоняет
вот скрипт:
declare @path varchar(350)
set @path = ‘\{Сервер-Куда}{Фолдер-куда}\’ + ‘{название базы}’ + ‘-‘ +
cast (day(getdate()) as varchar(5)) + ‘-‘ + cast(month(getdate()) as varchar(5)) + ‘-‘ + cast(year(getdate()) as varchar(5))+’.bak’
BACKUP DATABASE [{название базы}] TO DISK = @path WITH NOFORMAT, NOINIT, NAME = N'{Название скрипта}’, SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
зачем плодить лишние сущности?
чтобы не читать документацию?
PS Самые пытливые поняли, что большую часть переменной пути занимает формирование даты бэкапа
(6) Этот инструмент и у меня бэкапит базы не относящиеся к 1С. Но меня больше интересуют не базы в SQL, как сама структура 1С. У 1С бывают глюки с порчей структуры, и как же быть то если последней изменёной конфигурации нет, а базы сохранённые скулем есть??? Может я что то не до понимаю?
«PS Самые пытливые поняли, что большую часть переменной пути занимает формирование даты бэкапа» — в вашей власти сделать его меньше.
(7) Да, для 77 это было еще актуально, где метаданные хранились отдельно, а вот для 8 в скуле все необходимое есть в полном бэкапе, да и бэкапит скуль быстрее.
Лично у меня база 20Г быкапится 10 мин. и 15 мин пакуется в 400М.
Хотя для некоторых случаев ваш скрипт может быть полезен. Все-таки плюс
однозначно +
особенно актуально если этот скрипт запускается автоматом на конторах, где нет своего админа — юзеры сами могут восстановить данные, не через скуль…
Ди и ещё, хотелось бы повести такой опрос о процентном соотношении —
1. «Соотношение сиадминов владеющих SQL и не владеющих им, если владеющих то в какой степени?»
2. «Соотношение програмеров 1С владеющих SQL и не владеющих им, если владеющих то в какой степени?»
Думаю опрос — лишний
набираю народ на работу — один из вопросов, ну наверное процентов 15 могут восстановить базу в sql или представляют как это делать, остальные — 0(!)
Полагаю, что нужно умножать профессиональные навыки, а не плодить «умные скрипты»
Впрочем — вам виднее…
(11) Это только для удобства пользования обчного сисадмина!
категорически не согласен с самим понятием «обычный сисадмин»
либо это сисадмин, и ему «умные скрипты» не нужны (сам напишет при желании) — либо чайник, тогда ему никакие скрипты не помогут. Я бы уволил.
Вот тока что мысль пришла — сам пример реализации может навести кого-нибудь на полезную мысль, и в этом польза темы неоспорима, но рассматривать представленный скрипт как профессиональный инструмент — увольте.
«минус».
Еще раз повторю, каждый выбирает по себе, потратить день на изучение этой возможности в SQL, или дальше ждать, когда кто-то не в меру добрый еще один полезный скриптик на другой «всякий случай» напишет и выложит.
(а заодно и проблему с УРБД решит)
Че-то не понял… Чтобы сделать бэкап самих скульных таблиц — зачем кого-то выгонять?
(14) Абсолютно правильный ответ в (6).
> зачем плодить лишние сущности?
чтобы не читать документацию?
(15)Ну почему же абсолютно?
У меня чуть не так: планировщик стартует батник, потом *.bak и попутно всякая дбф-ная хрень пакуются раром в файлы вида ГГГГММДДТакаяТоХрень.rar
+(16) Это на одном серваке. А на другом — по пункту 6 как раз :)))
(16) Ну и у меня не так. :))
Попутно снимаются еще бэкапы Oracl’a, запускаются всякие регламентные дела и еще куча всего.
И все это при помощи SQL Server agent.
Очень удобно.
На первом сервере ужо было, а я водила с большим стажем и хорошо усвоил: работает — не трожь! 😉
(13) М -да уж!!!
Вам с вашей колокольни наверное виднее кого увольнять, а кого нет!
Если поувольниять всех сисадминов не владеющих SQL на вашем уровне, наверное для Вас откроется огромное поле возможностей.
Вот только на каком уровне вы владеете сисадминскими возможностями???
И нужен ли сисадмину SQL или же им должен владеть программист который разрабатывает программу использующую SQL или или администратор баз данных.
А насколько вы, как программист, поступите правильно предоставив доступ сисадмину к базам SQL. Я например на такой риск не иду. А вот научить сисадмина пользоваться скриптом для меня намного проще, чем пригласить его порулить моими базами.
Выбор за Вами!
Ну, а если кто то одновременно выполняет работу техника, сисадмина и программера — раньше, не знаю как сейчас, была такая профессия СЛЕСАРЬ ШИРОКОГО ПРОФИЛЯ, и ни там и не сям, а за то как звучит.
По вашему Шумахер должен не только отлично водить болид, но и уметь закрытыми глазами собирать и разбирать его, при этом чётко представляя из каких элементов состоит сплав металла и пластика???
Ещё раз повторю скрипт только для удобства пользования сисадминов.
А универсальные техсиспрограммеры для себя сами поднимут локалку, настроят серваки, напишут программу, пропылесосят писюки, забекапят это всё где нибудь и на чём нибудь.
И пусть вам на всё это всегда хватает времени.
ну пусть им хватает времени рыскать по форумам и ждать, когда добрый дядя выложит наиполезнейший скрипт, который за них будет выключать компьютер или рассылать сообщения net send’ом
Мой сисадмин владеет не SQL на моем уровне, а русским языком (и немного читает по английски), а самое главное — умеет пользоваться мозгом, и это превращает его в «специалиста».
Впрочем, видимо мы по разному понимаем слово «Сисадмин». Если для кого-то это «мальчик с пилисосом» — я сожалею, для меня, это человек, претендующий на MCSE как минимум.
Все, прошу у всех прощения за офтоп, все это уже не по теме
(21) Техник, сисадмин, администратор баз данных, программист — в моём понимании это одна область специфики, но совершенно разные виды дейтельности.
Что же у вас за сисадмин который не владеет скулем так как вы, немного знает английский, и говорит по русски (панацея). гнать его надо. читаете (13).
У нас сисадмин работает на весь холдинг (8 структур), говорит, пишет и читает на английском и тоже говорит по русски, прекрасно владеет всеми сетевыми технологиями и оборудованием (12 серверов, 5 удалённых точек (8 серверов), прекрасно владеет спутниковыми технологиями, имеет сертификат майкрософта (Microsoft Certified Systems Engineer) — но не знает он скуля и не нужен он ему в его работе. С этим скриптом возятся наши техники на удалёнках. А если нет связи, то скрипт и русский язык по телефону спасают.
Да и как то за всё время мы не испытывали необходимости на удалённых точках (тюмень, омск, сургут, ташкент) высокоплачиваемых сисадминов с навыками программиста.
А что, SQL агент может делать файлы dt ? 🙂
Мне нужен именно такой файл, а не sql-backup
Так что разработка полезна, однозначно.
(25) Поддерживаю. sql-backup полезен только при наличии самого скуля. А dt-файл можно загрузить даже в файловый вариант 1С. Кроме того, dt-файл, созданный без ошибок (которые пишутся в лог), ГАРАНТИРОВАННО нормально распаковывается, чего нельзя сказать о sql-backup.
Народ а нельзя етот скрипт переделать на несколько рабочих процессов? Ибо у меня не один.
Поддерживаю GnomDallas
(27) как насчет нескольких процессов?
Пришлось переделать этот скрипт для нескольких процессов.
скрипта
Вот мой вариант