Архивирование файловой базы 1С 8 каждый день, не выгоняя пользователей из базы, и не нужно знать пароль администратора




Принцип обмена данными из 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='\

28 Comments

  1. WiseSnake

    Гениально! А целостность базы уже никому не нужна по ходу? Уж лучше я всех пользователей выгоню из базы, быстрее выйдет…

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

    P.S. Тише едешь, дальше будешь (с) Народ

    Reply
  2. WiseSnake

    +(1) А использовать это в качестве архивирования базы вообще противопоказано иначе можно косяки и в рабочую базу внести при восстановлении!!! И узнаешь это когда голову начнут откручивать, за то, что что-то там полетело….

    Reply
  3. maxx

    (1) Так никто не мешает выгоняйте и делайте копии. Только часто пользователи бросают свои компьютеры на закрывая 1С , никто естественно не работает, а копии к утру или во время обеда так и не сделалось

    Reply
  4. deduchka

    Где то здесь была обработка которая генерит скрипт для планировщика и скрипты блокируют базу и архивируют у меня уже несколько месяцев работают прекрасно

    Reply
  5. WiseSnake

    (3) А для этого есть много приблуд (и на этом сайте тоже) с помощью которых пользователи легко выгоняются… ну хотя бы http://infostart.ru/projects/2514/ (то что на ум пришла)

    Я естественно буду так делать… Просто хочу отметить (или предупредить других), что делать так как вы опасно… Проверено на личном опыте…

    Reply
  6. Serj1C

    Риск есть, но в большинстве случаев база рабочая. Иногда лучше хоть такой архив, чем вообще никакого. Не всегда есть возможность выгнать пользователей. (не физическая возможность, а другая)

    Reply
  7. maxx

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

    Reply
  8. kompas-dm

    (0) Не в качестве рекламы !!!!!!!!

    Общий архив > 4 Gb

    Пользую второй год

    http://effector.com.ua/index.php?option=com_docman&Itemid=23

    Reply
  9. coder1cv8

    (7) Что значит «безусловно обрубать»? Любой из вариантов «обрубания», как Вы изволили выразиться, будь-то через сервер 1С или ОбработкаОжидания в файловом режиме, КОРРЕКТНО завершает сеанс пользователя. Поэтому никакой анализ тут смысла не имеет, число ошибок в первом случае — 0.

    Reply
  10. gutentag

    (1) > А целостность базы уже никому не нужна по ходу? Уж лучше я всех пользователей выгоню из базы, быстрее выйдет…

    …просветите простого бухгалтера: Гедальф, когда архивирует базы(не выгоняя никого), там как с «целостностью базы» в 7.7 и 8.1 ???

    Reply
  11. maxx

    (7) Согласен, что если выгнать стандартными средствами будет правильнее, однако для этого конфигурация должна иметь этот механизм выкидывания по крайней мере в файловом варианте, а в сервере 1С чтобы выкинуть нужно знать пароль админа базы (кстати говоря, если на сервере 1С просто обрубить соединение, то всё нормально будет?), короче всё сделать можно, но если на предприятие нет постоянного админа это всё усложняет и вот тут бы хотелось иметь хоть какую-нибудь копию на всякий случай.

    Reply
  12. coder1cv8

    (11)

    1. Ну приведенный здесь мой вариант никакой модификации для файлового варианта не требует 🙂

    2. Если даже на сервере рубить соединение, то да, всё будет нормально.

    3. Уважаемый WiseSnake здесь уже озвучил чем плох Ваш вариант. От себя добавлю: лучше никакого бэкапа, чем такой.

    Reply
  13. maxx

    (12) Поделитесь пожалуйста как в файловой базе любой конфигурации (в том числе и самописных) выгнать пользователей не создавая специального механизма в конфигурации(т.е. не написан для этого ни одной строчки кода) ?

    Reply
  14. gutentag

    (13) Объявить, что сейчас всем будет бесплатная выпивка у входа в офис 😉

    Reply
  15. WiseSnake

    (6)> Риск есть, но в большинстве случаев база рабочая

    По моей практике как раз наоборот, если пользователи РАБОТАЮТ, то в большинстве случаем база испорчена.

    >> просветите простого бухгалтера: Гедальф, когда архивирует базы(не выгоняя никого), там как с «целостностью базы» в 7.7 и 8.1 ???

    Абсолютно не в курсе, я им никогда не пользовался…

    (13) А вы смотрели ту разработку, что я привел?

    Лично я за встроенный механизм. В 8ке это решается изменением 1 строчки кода в конфигурации и обеспечивает максимально «мягкий» выход из базы. В 7ке это пару кусков кода

    Reply
  16. maxx

    >>Лично я за встроенный механизм. В 8ке это решается изменением 1 строчки >>кода в конфигурации и обеспечивает максимально «мягкий» выход из базы.

    Никогда не буду снимать конфигурации с поддержки ради 1 строчки кода, к тому же в базовых версиях изменения вносить не преполагается вообще, а них достаточно народу работает.

    Резюме: если подходить грамотно к резервированию, то этим просто нужно заниматься, если на предприятии заниматься этим некому то иметь хоть что-то под рукой из копий лучше, чем ничего.

    В ИТОГЕ дописываю рекомендации к этой обработки: перед началом архирование желательно обепечить чтобы никого в базе не было.

    Reply
  17. coder1cv8

    (13) Ну здесь же в комментах есть ссылка на мою поделку! 🙂 Не требует никакой модификации конфигурации (никакой дописки), работает с абсолютно любыми конфигурациями (самописными, типовыми), плюс к этому, ОДНОВРЕМЕННО с разными базами! 🙂

    Reply
  18. maxx

    (17) Спасибо за ссылку, изучу ваш вариант

    Reply
  19. Mitay

    Автору:

    зачем нужна обработка, если тоже того же можно добиться bat-ником из двух строк? Что-то типа:

    xcopy d:database*.* \xTemp /d /s /q /h /y /c

    .. .7z.exe a \xBakUpDataBase \xTemp*.*

    Reply
  20. maxx

    (19) Глупый вопрос. Ведь очевидно обработка нужна для того, чтобы всё, что вы написали, не писать. А открыли обработку в базе и нажали одну кнопку и ВСЁ. Вы думаете все умеют бат-ники писать? я встречаю иногда таких админов, которым очень трудно объяснить что такое кодировка текста, не говоря уже о клиентах, у которых админов вообще нет, а только девушки с длинными ногтями!!!!

    Reply
  21. Mitay

    так и батник одним нажатием запускается «enter».

    да и к чему так много букв… я просто предложил альтернативный вариант….

    Reply
  22. SlavaLogos

    (20) Не глупый вопрос. А как раз вариант Mitay даже очень хороший. На практике его используем уже года 2. У меня лежат 2 шаблона таких батников (серверный и файловый), только они в имя копии дату добавляют и хранят последние 10 файлов. А в самом начале файла переменные, путь к архиву, к базе, имя пользователя и т.д. Вообще для таких целей в базе добавляем пользователя и снимаем галочку — показывать в списке

    Админ вообще не пойму зачем, ярлык на батник положите на рабочий стол и пользователь разберется как его запустить. Или вообще в назначенные задания, что бы при включении компьютера запускался. Мне б Ваши проблемы

    Reply
  23. SlavaLogos

    Своим постом я хотел сказать, не то что Вам не нужно было выкладывать результат своего труда, а то что Вы напрасно так отреагировали на комментарий Mitay

    Reply
  24. larisab

    > у которых админов вообще нет, а только девушки с длинными ногтями!!!!

    И приходящий 1С ник, который «стесняется» попросить всех выйти из базы, чтобы сделать полноценный архив 🙂

    Довод, приведенный выше насмешил. Вызвали спеца, оплачивают его время и не желают подчиняться его требованиям, приходится ему, бедному, делать обходные манёвры. Странно…

    Кривые ручки 1Сника против длинных ногтей бухш. Все тАк гармонично 😉

    Reply
  25. petrovaUL

    +(1) А использовать это в качестве архивирования базы вообще противопоказано иначе можно косяки и в рабочую базу внести при восстановлении!!!

    Reply
  26. o956op

    В 8.2 не запускается.

    Reply
  27. benoev

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

    Reply
  28. sumixam

    скачал обработочку, проверил в обычном и управляемом приложении всё работает!!!

    Reply

Leave a Comment

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