Программа для резервного копирования данных: каталогов файловой системы и баз данных 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

48 Comments

  1. mmooddaa@yandex.ru

    Респект разработчикам ! Отличная штука.

    Reply
  2. cuba8

    Проверил, работает, плюс. При архиваровании (хорошо бы) моргающую картинку в системном трее. Закладка «Сообщения» (IMHO) перегружен буквами, достаточно Дата, Время, Архив /или/ Ошибка.

    Reply
  3. liouria

    После создания резервной копии не очищается прогресс-бар.

    Так задумано?

    Reply
  4. ACE$

    архивация происходит каким образом? внешний (встроенный) архиватор, или средствами 1с (пакетный режим)? Если пакетный, то возможно ли после архивации запускать еще и переиндексацию, скажем? Я не смог этого в настройках найти

    Reply
  5. acsent

    Как сервис работает?

    Reply
  6. tuzek

    Архивация производиться встроенным архиватором, если информационная база копируется как директория файловой системы. На выходе создается zip-архив.

    Если задание создано как «Резервирование базы 1С», то архивация производиться средствами самой 1С. Удобно для клиент-серверного режима, так как директория базы обычно недоступна.

    Переиндексации базы 1С еще не предусмотрено, эта функция будет реализована в ближайшей версии.

    Программа не регистрируется как служба, а просто запускается в фоновом режиме.

    Reply
  7. Winterrr

    спасибо! очень удобное решение!

    Reply
  8. ACE$

    т.е. ее необходимо запускать из-под пользователя… а если вход в систему не выполнен?

    Reply
  9. YuraRudnitskiy

    Спасибо разработчикам. Для работы неплохо ей пользоваться. Но для таких программ необходим контроль пользователя. У меня такие возникли трудности:

    1. При каком-то глюке не стерся файл в каталоге пользователя винды(Documents and SettingsuserApplication Data и там где-то) и архивы не делались.

    2. Если кто-то не вышел из 1С архивы тоже не делаются.

    Еще раз спасибо разработчикам. Простое и удобное решение. И главное не требует регистрации и т.п..

    Reply
  10. tuzek

    Для того, чтобы сделать резервную копию базы и перед этим отключить всех пользователей, в окне настроек задания необходимо поставить галочку «Отключать пользователей». Если имеются несохраненные данные, то 1С предложит их сохранить и выйти. Программа будет ожидать выхода 1 минуту. Если после этого 1С не будет закрыта, резервная копия не создастся.

    Поставив галочку «Принудительно» по прошествии 1 минуты 1С будет закрыта без предупреждения.

    Для клиент-серверного варианта программа отключает пользователей от сервера без предупреждения. Для этого нужно иметь права администратора.

    Reply
  11. ZERO_

    Хорошая программа, но не работает у меня в К-С варианте. После начала резервирования выдает «Error HRESULT E_FAIL has been returned…» (Галки Отключать и Принудительно стоят). Покапался в нете — есть такая проблема при СОМ’е к восьмерке. Предоставляю ссылку и надеюсь на исправление: Про ошибку Hresult

    Reply
  12. Istur

    (11) Тоже самое((( А програмка — супер)))

    Reply
  13. ZERO_

    (12) Короче, легче самому дописать прогу, чем ждать пока разработчик откликнется.

    Прогу дописал сам — теперь выкидывает юзеров и устанавливает блокировку соединений.

    Авторам спасибо за шаблон! 😉

    Reply
  14. Istur

    (13) А как ты дописывал, это же эксешник?

    Reply
  15. ZERO_

    (14) 🙂

    Это не экзешник!

    А прога, написанная на c# с использованием .net («Для работы программы необходим установенный Microsoft.NET Framework»)! ❗

    А это есть гуд! 🙂

    Если бы просто был написан, например, на «чистом» с++, я бы ничего и не смог бы дописать….. 😉

    Reply
  16. Svetlana_E

    А если «пользователя» нет? Вход в базу без пользователя и пароля?

    Попробовала оставить поля пустыми — вообще ничего не происходит. 🙁

    Reply
  17. Svetlana_E

    (16) Все получилось! ТОлько бухгалтерам не нравится, что программа(1С) просто предлагает «выйти». Спрашивают: нельзя ли сделать, чтобы где-то сообщалось, что это «для создания копии»?

    Reply
  18. ZERO_

    (17) Повезло, однако Вам! У меня в базе кроме юзеров есть еще и куча ком-соединений, которым так просто не предложишь выйти… 😀

    (А какой вариант бд к-с или файл-серверная?)

    Можно! Только надо дописывать прогу! (Или 1с дописывать, например в «При начале работы системы» вставить строчку, чтобы когда определенный юзер заходил…)

    Reply
  19. Svetlana_E

    У меня есть разные базы — просто попробовала на 1) обычная локальная сеть, база на одном компьютере, работают с ней на нем и еще на 2-х, в разных комнатах;

    2) тоже самое, только база на выделенном сервере;

    Проблема в том, что бух теряется, когда вдруг возникает предложение «закрыть программу». Можно ли как-то перед этим выдавать сообщение, что будет выполнено копирование. Либо может подскажите текст файла , который можно подключить в Планировщик и запускать его перед запуском вашей программы? Просто я не знаю, как написать просто выдачу сообщения на экран.. 😳

    Reply
  20. ZERO_

    (19) Версия 1с-ки 8.1?

    Конфа типовая?

    Если типовая, то снята с поддержки?

    текст файла , который можно подключить в Планировщик

    Планировщик Windows?

    Reply
  21. Svetlana_E

    (20) 7.7 Типовая

    Да, просто батник, который я подключу в Планировщик Windows

    Reply
  22. ZERO_

    (21) Да, жалко я не знаю 7.7… 🙁

    А, знаете, что, попробуйте за минуту до того, как 1с-ка предложит выйти нетсендом предупредить.

    Синтаксис:

    net send <имя_компа> <сообщение>

    Вот, только права должны быть на нетсенд. (Ну, это к сисадмину.)

    Reply
  23. tuzek

    Версия программы обновлена до 1.0.30. Теперь программа оповещает пользователя о необходимости закрытия 1С для выполнения резервного копирования. Все произведенные изменения находятся в описании к программе.

    Отдельная просьба к ZERO_: вышлите, пожалуйста, все произведенные вами изменения в программе на почтовый ящик support@egida1c.ru.

    Reply
  24. ZERO_

    (23)


    История версий

    V 1.0.30

    * добавлена возможность автозапуска программы при старте Windows. Эта функция включается из меню, выпадающего при нажатии правой кнопкой мыши на значке программы в трее;

    Так она была и в предыдущей версии! 😉

    Внизу веб странички забыли поменять номер версии! 😉

    Советую добавить возможность блокировки К-С БД на время выполнения архивирования и задания пароля для захода, соответственно! (А то есть шустрые юзеры и швыдкие ком-соединения :))

    Еще бы хорошо было бы поместить поле ввода для задания текста оповещения, также ввода времени в минутах До непосредственного начала принудительного вышвыривания юзеров.

    Вышлю, если пообещаете что она останется бесплатной и без ограничений!

    (Просто ни одна до сего времени мне известная прога не (выкидывает юзеров из к-с 8-ки и делает бэкапы штатными средствами (не зависит от субд) и по расписанию и Бесплатна)…)

    Reply
  25. ZERO_

    (23)

    P.S.

    И вместе с тем, прошу прощения за то, что не вытерпел и полез сам дописывать… Просто позарез нужно было рез. архивирование базы. 😉

    Reply
  26. germ-36

    Классная программа. Спасибо и куча +++… 😀

    Reply
  27. savant

    Автору зачёт и много плюсов! И хотелось бы узнать где и как хранятся пароли?

    Reply
  28. sound

    А у меня на при выкидывании пользователей (или уже архивировании?) понавылазила куча ерроров с руганью на фрамфорк, хотя он стоит и прога выскочила с критической ошибкой :(. Хотя обычные каталоги архивятся на ура

    Reply
  29. ZERO_

    (27) backups.xml В открытом виде.

    (28) Попробуйте удалить, перезагрузить тачку и вновь поставить фреймворк. Попробуйте запустить на другой тачке.

    Reply
  30. Andrey@

    Однозначно плюс++++!!! Спасибо

    Reply
  31. sergiowood

    Красота! Так держать! Благодарю. Искал себе такую программку.

    Reply
  32. Подскажите где ввести параметры аутентификации администратора кластера? При выборе клиент серверного варианта базы выдает ошибку аутентификации администратора кластера, хотя бэкап делается нормально.

    Reply
  33. (32) Также не выкидывает пользователей (клиент-серверный вариант) выдает ошибку что во временной директории нет файла выгрузки …

    Reply
  34. ZERO_

    (32) Нигде. 🙂

    По умолчанию соединяется с параметрами юзер=»», пасс=»».

    Если они другие, тогда

    выдает ошибку

    .

    хотя бэкап делается нормально.

    Да, потому, что чтобы сделать бэкап подключается к базе под админом этой базы -> бэкап делается нормально.

    Также не выкидывает пользователей (клиент-серверный вариант) выдает ошибку что во временной директории нет файла выгрузки …

    Права на запись в директорию есть?

    Reply
  35. ZERO_

    (32)

    Также не выкидывает пользователей (клиент-серверный вариант) выдает ошибку что во временной директории нет файла выгрузки …

    Вопрос: этот «администратор кластера», который у Вас он где находится (если открыть консоль серверов 1с) в центральные серверы……->Кластеры->1541->Администраторы или в центральные серверы-><имя_компа>->Администраторы

    Когда первый раз делал бэкап юзеры в базе были?

    Reply
  36. (35)

    «администратор кластера» есть и там и там

    (34)

    права на запись есть, когда нет пользователенй бэкап делается нормально

    P.S. Наверное набросаю свою прогу, сколько перепробовал все не слава богу….

    Reply
  37. ZERO_

    (36)

    Есть возможность удалить того, который в

    центральные серверы-><имя_компа>->Администраторы ?

    Если есть — удали. проблема должна исчезнуть.

    Reply
  38. (37)

    Спасибо помогло все работает как надо.

    У меня еще вопрос к автору, программа полностью бесплатная, т.е. можно использовать на работе?

    Reply
  39. tuzek
    У меня еще вопрос к автору, программа полностью бесплатная, т.е. можно использовать на работе?

    Программа бесплатная, можете использовать на работе.

    Reply
  40. savant

    А есть ли какой-нибудь HELP по настройке? У меня после обновления перестала запускаться автоматическая архивация. В чем причина понять не могу. В сообщениях пусто. Если запускаю в ручную то всё проходит нормально.

    Reply
  41. tuzek

    Какая версия программы используется?

    Вышлите пожалуйста файл backups.xml, который находиться в каталоге с установленной программой на электронный адрес support@egida1c.ru. Это поможет в выявлении причины ошибки.

    Reply
  42. savant

    Проблема решилась полным удалением и добавлением заданий

    Reply
  43. Istur

    для клиент-серверного варианта если не хочется занулять админа кластера, то можно батником вырубать все компы к примеру в 22, а задание на сохраниние базы поставить на 22.30. батник добавить в «назначенные задания». Тем более это решит и другую проблему — выключение компов на ночь, что увы пользователи иногда забывают сделать.

    Инструкция:

    http://netler.ru/pc/shutdown.htm

    Пример команд:

    shutdown.exe -s -m \tkvv -t 00 -f

    shutdown.exe -s -m \meneger -t 00 -f

    И просьба к авторам дать ссылку на фламеворк в описании, а то зачем народу искать его.

    http://www.microsoft.com/downloads/details.aspx?FamilyID=5b2c0358-915b-4eb5-9b1d-10e506da9d0f&DisplayLang=ru

    Reply
  44. ZERO_

    (43) Да, как выход — этот вариант можно использовать, но… На мой взгляд, кривовато + не на всех предприятиях такой фокус оценят… Может, можно как-то переписать саму прогу…. ув. tuzek.

    Reply
  45. Denvir79

    Спасибо за программку!

    А что будет, если резервирование запланировано на определенную дату и время, а в это время комп. выключен?

    Reply
  46. MikaelW

    Как программа живет на сервере 2003.

    Для запуска в фоновом режиме ей требуется авторизация пользователя или она запускается вместе с виндовс и вседелает!

    Есть ли смсл делать резервное копирование папки, а не выгрузки из базы?

    Reply
  47. Arhh

    Хорошая программа, на простеньком компе под XP работала как надо.

    Но когда поставили на 2003 сервер стали происходить странности, программа пишет что делает архив, сохраняет историю, ведет себя так как будто «все в порядке», а заглянешь в папку с архивами — там файлы по 10kb лежат…

    Reply
  48. Strannik99

    версия 1.3.60 У меня и на ХРSP3 не заработала так как надо.

    При галке выгонять принудительно так и ждёт нажатия ОК.

    На 2003-м , расписание ни в какую не хочет работать, ни по очереди ни без очереди. Да и почему то предыдущий архив пере

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *