К вопросу об архивации баз 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='\

13 Comments

  1. alexk-is

    Здесь есть список ссылок на публикации аналогичной направленности

    http://infostart.ru/public/19363/

    Reply
  2. strange2007

    Всегда использую только CMD+архиватор

    Народ изобретает супер-пупер-мупер обработки потому что не читали хелп от cmd

    Reply
  3. noknown

    У меня уже много лет работает связка CMD+rar для 7.7

    Не вижу причин городить обработки и вообще усложнять.

    Reply
  4. grum01

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

    Reply
  5. Rabajaba

    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 файлЛога.

    Reply
  6. roskmv

    По мне так лучше средствами самой 1С.

    Вот здесь ссылка на скриптик применимо к 1С 7.7, 8.1 и 8.2

    http://infostart.ru/public/72057/

    Работает на ура + дополнительные функции !

    Reply
  7. grum01

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

    Reply
  8. Anna_A

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

    Вопрос первый: остановит ли команда ЗавершитьРаботуПользователей фоновые задания.

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

    А вот команда РазрешитьРаботуПользователей выполняется нормально.

    Публикация на эту тему была давно, но может кто-то откликнется?

    Reply
  9. grum01

    «Сеанс администратора, тоже не закрывался (хотя, вроде бы должен?).»

    Сеанс администратора в данном случае закроется только когда выгонятся все пользователи.

    Reply
  10. Anna_A

    Возможно, я что-то делаю некорректно:

    — на своем компьютере открыла сеанс произвольного пользователя.

    — запустила команду под администратором для завершения работы пользователей (в данном случае одного)

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

    Во всей этой ситуации меня смущает сеанс администратора.

    Reply
  11. Mx00

    Выскажусь ещё раз

    главное в архивировании не создание архива, а уверенность, что у вас ЕСТЬ архивные копии

    все мнения о том, что «достаточно использовать стандартные средства windows» или простенький bat-файл отпадают по одной причине — вы не знаете создался у вас архив или нет, а проверять даже раз в неделю быстро надоедает и что там с архивированием ни кто не в курсе (и не надо думать, что вы не такой 🙂 )

    поэтому система архивирования должна сообщать ответственному о том что произошел сбой при архивации.

    после такой постановки здачи думаем и выбираем (или создаем) нормальную систему архивирования

    Удачи всем.

    Reply
  12. Properman

    Изобретать колёса нет смысла! В наше время нужны такие средства, которые бы не упирались в длину пути к файлу и невозможность создания большего количества архивов, хотя бы на всякий случай! Ниже приведу ссылку на программу автоматической архивации неограниченного количества баз и символов в пути к файлу, оцените сами что лучше приятный интерфейс или строчки скриптов, где любая ошибка и уже не работает! 🙂 , вот ссылка: http://infostart.ru/public/157922/

    Reply
  13. tormozit

    2iS Интеграция http://infostart.ru/public/145983/ может автоматизировать регулярную выгрузку для всех ваших баз 1с за несколько кликов. Базы поддерживаются любые, файловые и серверные, обычные и управляемые, 8.1, 8.2, 8.3.

    Reply

Leave a Comment

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