Архивация баз 1С:Предприятие и файлов скриптом PowerShell (ver. 1.7)




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

40 Comments

  1. cool.vlad4

    😀 люблю powershell …http://gallery.technet.microsoft.com/ScriptCenter/

    Reply
  2. Kuzja_R

    ver. 1.2

    ~~~~~~~~

    Добавлено:

    — Мягкое завершение процессов. CloseMainWindow и Close вместо Kill.

    — Задержка до принудительного закрытия процесса (<sec>).

    — Автоматическое обновление скрипта с ftp сервера (<upd>).

    — Лог работы ncftpput и ncftpget (<ftp_log>).

    ver. 1.1

    ~~~~~~~~

    Исправлено:

    — Ошибка при передаче на ftp.

    Добавлено:

    — Появился файл History.txt. 🙂

    — Для каждой базы можно задать свой каталог архивов <store>.

    ver. 1.0

    ~~~~~~~~

    Реализована базовая функциональность:

    — Копирование 1Cv8.1CD во временный каталог и упаковка с помошью 7-zip.

    — Завершение процессов 1С и выгрузка средствами конфигуратора.

    — Архивация произвольного набора файлов с помощью 7-zip.

    — Копирование архивов на ftp сервер посредством ncftpput.exe.

    — Удаление устаревших архивов.

    — Хранение настроек в xml формате.

    Reply
  3. Kuzja_R

    Добавил тестирование и исправление ИБ

    Reply
  4. Kuzja_R

    ver. 1.5

    ~~~~~~~~

    Добавлено:

    — Уточнено описание параметров скрипта Readme.txt

    — Оптимизирован код скрипта.

    — Можно указать <exe> общий или для каждой базы свою версию.

    — Определение свободного места на диске для архива.

    Reply
  5. vladimir_makarov

    А это надо изобретать? Можно просто ВНИМАТЕЛЬНО изучить возможности архиватора WinRAR. Этот таварищ может всё и больше. Надо уметь им пользоваться. Это я к тому, не надо изобретать велосипед, он есть. Надо учить на нём кататься.

    P.S.: Я сталкивался с ситуацией, когда БД «рухнула», и был подобный (твоему) архив. Его «выдернуть» не удалось, а вот мой, RAR-ский, прекрасно открылся. Что на это скажете?

    Reply
  6. CheBurator

    (5) позвольте просто полюбопытствовать? именно у вас — рар — лицензионный?

    Reply
  7. vladimir_makarov

    (6) А у тебя нет? Отвечаю: у меня WinRAR нормальный. Напоминаю: WinRAR условно-бесплатная прога. Есть желание — купите. Но, просто советую посмотреть: ВСЕ ваши вопросы там давно решены. На уровне АВТОМАТА.

    Напомню далее: там легко настраивается ДИНАМИЧЕСКАЯ архивация, с любыми параметрами. Посмотрите.

    Reply
  8. CheBurator

    (7) довожу до вашего сведения, что программист должен уметь не только кодить/писать, но и читать. Видимол вы невнимательно читали EULA а винрару, позволю себе процитировать:

    WinRAR EULA (End User License Agreement) for use and distribution

    ———————————————————————————

    The RAR (and its Windows version — WinRAR) archiver are shareware. This means:

    The author and holder of the copyright of RAR and WinRAR is Alexander L. Roshal. The licensor of the following license and bearer of the worldwide exclusive usage rights to reproduce and distribute RAR and WinRAR is win.rar GmbH, Schumannstr. 17, 10117 Berlin, Germany.

    Anyone may use this software during a test period of 40 days. Following this test period of 40 days or less, if you wish to continue to use WinRAR, you must purchase a license.

    .

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

    .

    PS: я не спрашивал — нормальный или ненормальный, спросил просто «именно у вас рар лицензионный?» — ответа так и не получил.

    Reply
  9. vladimir_makarov

    (8) А зачем это? Я пишу, что можно сделать, используя это. Всё!!! А уж регламент — пусть каждый для себя решит сам.

    ОТвет: ЛИЦЕНЗИОННЫЙ!!!

    Reply
  10. CheBurator

    Когда в ответ на прямой вопрос дают непонятные ответы, а в конце оказывается «лицензионный» — я сразу начинаю сомневаться в моем отношении к миру и людям… 😉

    Reply
  11. vladimir_makarov

    (10) Мы, вроде, не архиваторы обсуждаем, а как архивировать… А какой архиватор использовать — личное дело каждого. Я просто выразил своё мнение: не надо изобретать велосипед, да ещё с квадратными колёсами, есть готовое решение, более того, решение таково, что его (в случае аварии) можно запустить с любого стороннего компа. А вопрос лицензионности — на совести пользователя.

    Reply
  12. cool.vlad4

    (11) какое нафиг решение с квадратными колесами? хорош понтоватся, человек сделал бэкап на повершелле, чего еще?

    Reply
  13. CheBurator

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

    Reply
  14. cool.vlad4

    Добавлю от себя, что powershell очень кстати — микрософт намерен им заменить скриптинг, использующийся до этого. А насчет архиватора, все тру айтишники используют 7zip — примеры, есть программист, прикручивал алгоритм 7zip к c# год, сейчас его библиотечку скачивают со всего мира…еще http://habrahabr.ru/blogs/sysadm/81657/

    Reply
  15. Kuzja_R
    vladimir_makarov пишет:

    …Я сталкивался с ситуацией, когда БД «рухнула», и был подобный (твоему) архив. Его «выдернуть» не удалось, а вот мой, RAR-ский, прекрасно открылся. Что на это скажете?

    Чем, позвольте поинтересоваться, Ваш Rar-ский архив отличатся от 7-zip с точки зрения 1С? Мне думается — это просто архив, а содержание и там, и там будет одно и тоже. Это раз.

    Во-вторых, я надеюсь Вы внимательно изучили предлагаемое решение и прочитали Readme.txt перед тем как критиковать? Так вот там Lucida Console по белому (чаще всего) написано «…В некоторых случаях возможны ошибки в архивной копии из-за незавершенных транзакций в базе…». А это значит, лучше использовать метод № 2, когда завершаются пользовательские процессы и создается нормальный файл выгрузки *.dt. Да, решение писалось для случая, когда все пользователи работают в терминале на одном сервере, и на удаленных машинах сеансы не завершаются (задачи такой не стояло).

    И третье. Кроме создания архивов, скрипт позволяет удалять устаревшие и отправлять созданные на ftp. При чем тут WinRAR?

    И четвертое. Настройки скрипта удобно вынесены в отдельный xml. Мне так захотелось.

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

    С наилучшими пожеланиями.

    Reply
  16. Harry_udm

    А если в логе пишется «Недостаточно свободного места на диске!» (хотя на самом деле свободно около 500ГБ) как решить эту проблему?

    Reply
  17. Kuzja_R

    (16) Такое сообщение выводится в случае, когда свободное место на диске меньше, чем удвоенный размер самого большого файла в каталоге архивов (логично предположить, что новый архив будет не меньше уже существующих?). Если нужно отключить сообщение, тогда закомментируйте строку 135 в скрипте, а в строку 136 измените на $GoodStore = $true.

    Reply
  18. Harry_udm

    Странно, но размер самого большого файла в базе данных — 165МБ. Размер всех dbf-файлов — 800МБ.

    Свободно же на диске — 465ГБ.

    Может что-то с какими-то правами?

    Reply
  19. Kuzja_R

    (18) Дело не в базе данных, а том каталоге, куда должен быть записан архив (тот каталог, который указан в <store>).

    Reply
  20. Harry_udm

    Записано вот так (без пробелов):

    < store > D:BackUp < / store >

    Reply
  21. Kuzja_R

    Сколько «весит» самый большой файл у Вас в каталоге D:BackUp ?

    Reply
  22. Harry_udm

    Локальный диск D полностью чист (ну не считая системных папок: System Volume Information, $RECYCLE.BIN). На нем только папка в корне диска BackUp. В этой папке нет вообще никаких файлов.

    Reply
  23. Kuzja_R

    Скорее всего скрипт не может корректно определить свободное место на диске (по логике PowerSell [0 > null], поэтому и ошибка). Возможно это связано с правами на весь диск, как Вы и предположили.

    Reply
  24. drdroid5
    CheBurator пишет:

    (7) довожу до вашего сведения, что программист должен уметь не только кодить/писать, но и читать. Видимол вы невнимательно читали EULA а винрару, позволю себе процитировать:

    ….

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

    PS: я не спрашивал — нормальный или ненормальный, спросил просто «именно у вас рар лицензионный?» — ответа так и не получил.

    у рара вроде утилиты RAR.exe и UnRAR.exe не ограничены тральным сроком, хотя выбор в сторону 7zip поддерживаю.

    Reply
  25. vladimir_makarov

    (8) Опять от темы отвлекаемся. Мы же вроде обсуждаем, как, что и чем архивировать. Законность преобретения — это для каждого пользователя его проблема. О WinRAR: знаю, что он бесплатно работает 40 дней. После этого оп продолжает работать, только некоторые функции не поддерживаются. Но!!! разработчик его не блокирует, в надежде на то, что клиент «одумается». У меня стоит какая-то «подарочная» или что-то в этом роде, про 40 дней не намекает… Поддерживает не все функции, но для этого хватает.

    Кстати, а Ваша Technology — абсолютно бесплатна? Вообще работоспособна? А то была ситуация, когда меня вызывали «выдернуть» данные из аналогичного архива… НОЛЬ!!! Только пустые каталоги и ссылки на адреса файлов, где они должны быть… Отсюда и скорость работы.

    Если кого-то заинтересует способ с использованием WinRAR — напишу подробнее. Хотя, как я понимаю, на этом форуме дураков нет. Проще — читайте справку WinRAR, раздел «Режим Командной Строки», совмещется с назначенными заданиями из Форточек, лучше с использованием «Спящего» режима.

    Reply
  26. shmvit
    Harry_udm пишет:

    А если в логе пишется «Недостаточно свободного места на диске!» (хотя на самом деле свободно около 500ГБ) как решить эту проблему?

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

    Reply
  27. Kuzja_R

    ver. 1.6

    ~~~~~~~~

    Добавлено:

    — Параметр <holyday>. Архивы созданные в этот день месяца не удаляются.

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

    удаления.

    — Отображение в логе ошибки определения свободного места на диске.

    — Скорректирована процедура закрытия процессов 1С. Теперь работает немного

    быстрее.

    Исправлено:

    — Процедура запуска дочерних процессов для некоторых версий ОС.

    Reply
  28. accnt

    в ХР работало,а че то в 7ке перестало…может че не так сделал…

    Reply
  29. udji

    вроде неплохая вещь!

    Reply
  30. norbec

    8 баз прописал, всё прекрасно архивируется

    Спасибо

    Reply
  31. petrovaUL

    попробуем

    Reply
  32. chizh.84

    Скрипт для архивации файловых баз и произвольных файлов. Возможности:

    — Завершение процессов и выгрузка средствами платформы в *.dt;

    — Копирование файлов во временный каталог и упаковка в zip архивы;

    — Пересылка созданных архивов на ftp сервер;

    — Удаление устаревших архивов.

    — Настройки скрипта хранятся в xml формате.

    — Поддерживается произвольное количество баз. — Замечательная штука, но настройки в xml?! Может я консерватор но и csv хватило бы

    Reply
  33. chizh.84

    Скорее всего скрипт не может корректно определить свободное место на диске (по логике PowerSell [0 > null], поэтому и ошибка). Возможно это связано с правами на весь диск, как Вы и предположили. Как же этот вопрос решается?! Зачем права скрипту на весь диск?

    Reply
  34. chizh.84
    попробуем
    Reply
  35. chizh.84

    Замечательная штука!!!

    Reply
  36. chizh.84

    Добавлено:

    — Параметр <holyday>. Архивы созданные в этот день месяца не удаляются.

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

    удаления.

    — Отображение в логе ошибки определения свободного места на диске.

    — Скорректирована процедура закрытия процессов 1С. Теперь работает немного

    быстрее.

    Исправлено:

    — Процедура запуска дочерних процессов для некоторых версий ОС.

    Reply
  37. Kuzja_R

    ver. 1.7

    ~~~~~~~~

    Добавлено:

    — Параметры <server>, <base>, <connector> для подключения к базам,

    расположенным на серверах 1С:Предприятие.

    — Параметры <cuser>, <cpass> для подключения к кластеру серверов 1С.

    — Метод архивации для серверных баз. Для использования нужно указать

    <method>4</method> в файле настроек.

    Reply
  38. malikov_pro

    1. По серверной версии не устанавливается блокировка доступа на время резервного копирования в результате имеем «Ошибка исключительной блокировки информационной базы.» и неделю без архивов (УТ 11.1).

    2. Удаление архивов идет без проверки успешности выполнения резервного копирования, результат новых архивов нет и старые все потерты.

    3. Прикрутить параметр /Out тоже будет полезно, для разбора полетов.

    Reply
  39. nickperel

    (5) vladimir_makar(5) vladimir_makarov,

    Скажу что ты просто дурак. Причем тут WinRAR, какая то твоя «рухнувшая» база а также что и откуда ты потом «выдернул»?

    Тут скрипт для шедулера.

    Reply
  40. kotlovD

    (10)Умник

    Reply

Leave a Comment

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