Как обновить изменённую конфигурацию




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

15 Comments

  1. Bukaska

    Я бы на вашем месте больший инструктаж в картинках нарисовала.

    Конфигурация/Поддержка — это любой начинающий разраб знает.

    Плюс добавлю, если обновление буквально на следующий релиз, то можно обойтись и файлом*cfu, а вот если прыжок через пару релизов — тогда надо для обновления файл*cf.

    И ещё.. Объединение с приоритетом основной конфигурации или загружаемой конфигурации — тут бы тоже написала разницу.

    Ещё бы от себя добавила хоткей клавиш, чтобы прыгать от изменения к изменению, а не выискивать бы вручную глазками все изменения. Я вручную пробовала сама искать — не получилось, получила замечания! Вручную устанешь все искать, проще использовать специальную комбинацию клавиш. зато потом запомнила как прыгать между изменениямии так и роюсь теперь всегда )))

    Reply
  2. iov

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

    смешно…

    и всего то 13 пунктов…

    Reply
  3. Bukaska

    (2) iov, Я бы больше сказала.. не только свой общий модуль, но и подписки на события)))

    Но иногда конечно бывает что все таки приходится пилить конкретно объект.Но это редко)))

    А большинству начинающих — им проще пилить все модули объектов, без подписок, общих модулей,отчетов и обработок.Но когда-нибудь у них мозг заболит и они пересмотрят методику перепиливания )))

    Как-то от другого франя перепала клиенская база, волосы дыбом встали, по ходу там народ про подписки на события и свой общий модуль точно не знал)))

    Reply
  4. AnryMc

    Для такого уровня «пользователей», ужно начинать инструкцию с — КАК УЗНАТЬ НОМЕР ТЕКУЩЕГО РЕЛИЗА КОНФИГУРАЦИИ!!!

    ;-)))))))))))))))))))))))))))))))))

    Reply
  5. anig99

    (4) нннееее.. «Как убедиться, что вы работаете в 1с?»…

    Помню, мне было лет 16 и я быдлокодил на 7ке. Пришел на работу устраиваться один после института. По профильным предметам тройки. Попросил его показать в чем он будет работать с 1с, намекая на конфигуратор — он не знал…

    Reply
  6. Bukaska

    (5) anig99, ппц.. жесть)))))))

    Reply
  7. StudentM

    (6) Bukaska, просьба не выражаться.

    А вообще всем спасибо за комментарии, особенно, за содержательные.

    Reply
  8. dock

    1)

    Все изменения переводим во внешние обработки (заполнения, печатные формы), отчеты, программные поля, свой общий модуль, а также создаём, при необходимости подписки на события, например, «ПриОткрытии».

    Этот пункт нужно ставить нулевым. Ибо когда уже делаешь обновление — поздно всё переводить во внешние. Вторым пунктом — нелогично.

    2) Последний пункт??? ИМХО с этого НАЧИНАЕТСЯ обновление.

    Читаем в информации об обновлении, что изменилось с прошлой версии, чтобы знать новые особенности настроек и работы

    3) нигде не увидел очень важного момента — само обновление делаем НА КОПИИ. Живую базу обновляем загрузкой нового cf-файла. Уже проверенного, отработанного на копии.

    и я бы разбил инструкции на несколько категорий:

    1) подготовка:

    — прочтение информации об изменении

    — развертывание копии базы

    2) само обновление (выполняется на копии)

    — сравнение конфигураций, анализ изменений

    — выполнение объединения

    — внесение «потерянных» изменений

    — проверка на работоспособность

    3) обновление рабочей базы загрузкой обновленного файла конфигурации (.cf)

    — выгрузить cf из копии

    — загрузить cf в рабочую базу

    проверка на работоспособность

    Ну и еще несколько маленьких придирочек:

    6. В окне «Обновление …» по кнопке «Фильтр» в настройке фильтров просмотра ставим флажок «Показывать только дважды изменённые свойства».

    Где скриншот ? Даже два скриншота!!

    Далее смотрим, чем основная конфигурация отличается от старой конфигурации поставщика переключая по кнопке «Фильтр» в настройке фильтров просмотра на «Показывать отличия основной конфигурации от старой конфигурации поставщика». Смотрим отличия. Выводим отчёт по отличиям.

    Где скриншот ? Где ????

    Reply
  9. Zhilyakovdr

    Нулевым пунктом должно быть использование ХРАНИЛИЩА!!!

    К хранилищу подключаются «Боевая» БД и копия(для доработки, отладки и обновлений).

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

    Также если в организации штат сотрудников 1с состоит более чем из одного программиста, хранилище упростит взаимодействие между ними и даст возможность вести реестр изменений основной БД.

    Reply
  10. maxsoft83

    полный бред

    а не последовательность

    Начиная с пункта номер два

    Reply
  11. dock

    (9) Zhilyakovdr, Ну хранилище это уже совсем отдельная тема. ИМХО для одной базы можно обойтись и без хранилища. Хотя… млин, с хранилищем все-равно удобней…

    Тогда уж нулевым пунктом вынести «Выправить руки программисту, который вносил изменения в типовую конфу»

    Желательно, используя дыбу…

    Reply
  12. DAnry

    (2) iov, (10) maxsoft83, поддерживаю — бред однозначно (конечно кроме пункта 1 😉

    Reply
  13. maxsoft83

    (12) DAnry, у это да пункт номер один надо оставить

    Reply
  14. StudentM

    (9) Zhilyakovdr, спасибо за комментарий.

    Reply
  15. sobeyko2008

    Чтобы проверить бред или ни бред предлагаю автору обновить мою 1с. за небольшую плату.

    Reply

Leave a Comment

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