Как отличить копию базы от рабочей.




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

43 Comments

  1. Andle

    А еще можно штатными средствами установить заголовок программы, где так и написать «К О П И Я».

    Reply
  2. Ёпрст

    «Рабочая скуль, копия файловая»

    Извращенцы.

    Reply
  3. Ёпрст

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

    И копия в скуле.

    Reply
  4. tehas

    (1) AndruX@, это можно, но вот зеленая линия больше заметна.

    (2) Ёпрст, базы не по 100 гигов =)) до 13 гигов максимум, поэтому не паримся, тем более нас 4 человека, каждому бывает нужна своя копия и так удобнее себе развернуть локальную.

    Reply
  5. Азбука Морзе

    Задача:

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

    Ну что же, задача решена.

    Следующая задача:

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

    Reply
  6. PoZiTiFFF

    (5)в конфигураторе задать синоним для конфигурации К О П И Я и после обновления будет отображаться в заголовке конфигурации.

    Reply
  7. Evgen.Ponomarenko

    (6) PoZiTiFFF,

    Ага, а потом забыть, сохранить в cf и НАКАТИТЬ на рабочую )))) ПУУУУЩАЙ поработают!

    Reply
  8. Гость

    (6) PoZiTiFFF,

    в конфигураторе задать синоним для конфигурации К О П И Я и после обновления будет отображаться в заголовке конфигурации.

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

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

    Интересным было бы решение именно через параметр командной строки запуска. Жаль, что разработчики платформу не додумались выводить имя базы первым, а затем уже слово «Конфигуратор». То что это конфигуратор ясно и по иконке.

    Reply
  9. tehas

    (7) Evgen.Ponomarenko, если бы внимательно читали, то стало бы ясно, что обработка хранится как внешняя и запускается через параметры командной строки.

    (6) PoZiTiFFF, это можно и в режиме предприятия, только надпись КОПИЯ не так бросается в глаза как зеленая полоска.

    (5) Азбука Морзе,

    Следующая задача:

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

    вот тут даже пока не знаю что придумать

    Reply
  10. LexaM

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

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

    Reply
  11. Antignys

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

    Reply
  12. kollos1986

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

    Reply
  13. ShantinTD

    За идею — плюс.

    К реализации — замечание/предложение: для внешней обработки форму-то можно и не прописывать. Вместо зеленой полосы есть методы УстановитьЗаголовокКлиентскогоПриложения(<Заголовок>) и УстановитьЗаголовокСистемы(<Заголовок>). А из СтрокаСоединенияИнформационнойБазы() можно выделить название базы.

    Reply
  14. Goruch

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

    Reply
  15. webester

    (14)Ну и нафиг она нужна только на чтение?

    Reply
  16. tehas

    (14) Goruch, просто посмотреть базу можно и рабочую

    Reply
  17. Goruch

    Ну самая частая задача — по просьбе пользователя восстановить «что было».

    Reply
  18. gr0ck

    Оригинально — Да

    Полезно — Нет

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

    Reply
  19. LexaM

    в поиске нужного бэкапа каждый раз в настройки лазить не будешь, а когда найдешь, то и уже не до настроек будет

    Reply
  20. Styvi

    Тема визуального разделения окон с разными базами — реально существует… и я лично её решаю банальным прописыванием названия в меню Сервис-НастройкаПрограммы-ЗаголовокПрограммы…

    Мне кажется, что прописать что-то типа «ТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТТ» в заголовок быстрее, чем строку дополнительных параметров запуска 🙂

    Да и заголовок такой не намного хуже будет в глаза бросаться…

    Хотя, за идею реализации — плюсую, разумеется…

    Reply
  21. tehas

    (20) Styvi, неее, круче прописать параметр запуска 1 раз и все время загружать на этот путь новый архив

    Reply
  22. adhocprog

    (14) чего только в жизни не бывает 🙂

    Reply
  23. warit

    Так была уже такая обработка http://infostart.ru/public/95499

    Reply
  24. ShantinTD

    (17) Goruch, отучать нужно пользователей от таких просьб: не исключать совсем, но свести к минимуму. (20) Styvi, tehas в (21) прав — проще один раз прописать параметр запуска, чем каждый раз вспомнить, что нужно залезть в какие-то-там-настройки и что-то-там поменять.

    У меня подобный костылик стоял еще на 7.7: если в названии базы (или пути к ней — не помню уже за давностью лет) присутствует слово «test» — никакие «регламенты» и автоматы не отрабатывают. То есть живую базу от тестовой отличал даже «автоисполнитель».

    Reply
  25. AuroraNorilsk

    Плюс.

    Правда я поменяла цвет полоски на #DFFFDF (он же 223,255,223) 🙂 глазу приятнее.

    Reply
  26. tehas

    (23) warit, разница в них есть. в той только изменение заголовока

    Reply
  27. tehas

    (25) AuroraNorilsk, коллегам Ваш цвет не понравился, оставлю пока что свой =)

    Reply
  28. elizarovs

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

    Reply
  29. Созинов

    (1) AndruX@,

    Неудобно, у меня копии меняются достаточно часто + куча баз. Надо будет еще для 7.7 такое сделать. Автору +

    Reply
  30. THEBESTolo4b

    Сервис-НастройкаПрограммы-ЗаголовокПрограммы

    или накройняк зайти в конфигуратор и изменить названия базы

    Reply
  31. AuroraNorilsk

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

    Reply
  32. tehas

    (29) EfiopReal, у нас баз более 40 штуки все они подключены через общий список баз, а копии в список добавляем самостоятельно, поэтому нам проще прописать именно для копий, чем для рабочих.

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

    Reply
  33. warit

    (26) тогда было бы правильно указать ссылку http://infostart.ru/public/95499 в раздел «Похожие обработки» и указать, чем именно твоя обработка отличается от указанной в ссылке. Есть люди, которые ставят «+» за идею, но идея не новая.

    Reply
  34. tehas

    (33) warit, не вижу смысла, так как эту статью ранее не видел, её идеей не пользовался, а если учесть что общего использовано это СтрокаСоединенияИнформационнойБазы() , /Execute и УстановитьЗаголовокСистемы(), то по хорошему мне нужно сослаться на половину статей с этого сайта.

    Reply
  35. warit

    (34)tehas, смысл есть, т.к. есть рекомендации по оформлению публикаций http://infostart.ru/public/66592. В пункте №6 сказано, что необходимо указывать ссылки на аналогичные публикации. Ты не считаешь публикацию http://infostart.ru/public/95499 аналогичной?

    <quote>если учесть что общего использовано это СтрокаСоединенияИнформационнойБазы() , /Execute и УстановитьЗаголовокСистемы(), то по хорошему мне нужно сослаться на половину статей с этого сайта </quote>

    Можно сослаться на половину статей если использована часть инструментария, но в данном случае ИСПОЛЬЗОВАН ВЕСЬ ИНСТРУМЕНТАРИЙ ОБРАБОТКИ 2011 года и не важно видели/не видели, использовали/не использовали.

    Reply
  36. tehas

    (35) warit, хорошо, не читал правила оформления, с тем, что аналог согласен. сейчас отредактирую

    Reply
  37. yuraos

    (5) Азбука Морзе,

    я думаю Саша Орефков тебе решит эту задачу…

    … но запускать конфигуратор придется с помощью СНЕГОПАТА.

    Reply
  38. yuraos

    (24) ShantinTD,

    у меня под 7.7 1с-ка именно этим способом «понимала» что база тестовая.

    при этом в окне приложения постоянно висел

    огромный баннер ядовито желтого цвета (который нельзя было закрыть)

    и на нем красным жырным было написано:

    ЭТО ТЕСТОВАЯ БАЗА !!!

    — чтоб ни одна обезьяна не могла не заметить !!!

    Reply
  39. kenza

    (13) ShantinTD, Пользуюсь таким же методом, в заголовке постоянно путь до базы отображается. Один раз в модуле код вставил и теперь не парюсь.

    Reply
  40. ZVN

    (19) LexaM, Путать бекапы — это к организации названий файлов и их хранения.

    Я лично создал отдельные каталоги для хранения БЕКАПОВ рабочих баз и никогда их не спутаю по той причине что наименования их разные!

    Так что все это суета сует. Кому что нравится. И кто как организует свою работу. Я свегда завидовал и завидую тем кто может делать любую работу ПЕДАНТИЧНО придерживаясь строгой последовательности инструкций и рекомендаций.

    Reply
  41. Anchoret

    Отличная обработка, очень помогает

    Reply
  42. Svasily

    Спасибо! Хотелось Именно выделение цветом. Сделал для боевых баз (только для себя), т.к. подумал, что в тестовых (базах для разработки) это будет слишком мозолить глаза. А в боевых — как раз то что нужно.

    Reply
  43. Светлый ум

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

    +1

    Reply

Leave a Comment

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