Автоматическое обновление, архивирование баз 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='\

30 Comments

  1. Жолтокнижниг
    невозможно установить COM соединения с базой 1С из другой 1С, если они на разных версиях платформ (иногда возникает необходимость обновлять базы, которые крутятся под разными версиями платформы, например 8.2 и 8.3)

    С этим проблем не возникает (просто использование разных версий коннектора). А вот проблема когда

    Reply
  2. Жолтокнижниг
    невозможно установить COM соединения с базой 1С из другой 1С, если они на разных версиях платформ (иногда возникает необходимость обновлять базы, которые крутятся под разными версиями платформы, например 8.2 и 8.3)

    С этим проблем не возникает (просто использование разных версий коннектора).

    А вот проблему, когда сервер вертится на одной версии например 8.2.1, а на клиенте зарегана версия 8.2.2, вы решили?

    Reply
  3. kias777

    (2) Жолтокнижниг,

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

    Reply
  4. Xershi

    (2) Жолтокнижниг, скоро будет подсистема по обновлению РИБ в автоматическом режиме для любой конфигурации. Следите за публикациями.

    Reply
  5. teflon

    (0) про организацию собственного сервера управления обновлениями, про централизованный сервер, можете рассказать?

    Reply
  6. kias777

    (5) teflon,

    — Центральный сервер, проверяет обновления, если появились сохраняет в указанный каталог на сервере в определенной структуре, для создания собственной библиотеки;

    — формирует списки обновлений необходимые клиентам для обновления с переданного номера релиза;

    — передает/принимает файлы (в клиентах есть возможность генерировать полные релизы, если стоить соответствующая галочка, это используется чтоб не захламлять собственные сервера типовыми конфигурациями и не нагружать их работой по обновлениям, но в то же время иметь в библиотеке всегда актуальные cf файлы) (в перспективе будет реализовано обновление с полных релизов, тех баз где не разумно обновлять по порядку);

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

    — прочие функции, которые не относятся на прямую к работе с обновлениями;

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

    Reply
  7. lenafV

    Скачали файл, вылетает при попытке обновления базы

    Reply
  8. kias777

    (7) lenafV, Отпишитесь более подробно, что пишет в лог файле на момент вылета?

    Reply
  9. lefthander

    Жаль, но не заработало.

    Reply
  10. kias777

    (9) lefthander,В чем именно была проблема?

    Reply
  11. kias777

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

    Reply
  12. v3rter

    Галка подтверждения лицензионности для версий проф при запуске базы после обновления («проверка конфигурации»?) автоматически или вручную? Галка «Отправлять сведения» не затрагивается или есть возможность снимать/устанавливать автоматически?

    Reply
  13. user652473_Bocheninv

    При запуске задачи «Архивирование» Ошибка: необрабатываемое исключение в приложении….

    Reply
  14. vovafr1

    с sql базами работает?

    Reply
  15. vovafr1

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

    Reply
  16. kias777

    (14)работает

    Reply
  17. kias777

    попробуем добавить,

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

    Reply
  18. vovafr1

    справа два окна логин и пароль в логине пишу пользователя компьютера, ниже пароль, му кнопку установить, выходит первое сообщение об установке службы, во втором — Ошибка при запуске. Служба не установлена. Чего дела не так?

    Reply
  19. kias777

    (18)Во-первых обновите до последнего релиза. Во-вторых если пользователь не доменный, тогда указываете .ИмяПользователя ну и само собой программа должна быть запущена от имени администратора.

    Reply
  20. kias777

    (15)Эта редакция нужна Бухгалтерия сельскохозяйственного предприятия, редакция 3.0?

    Reply
  21. vovafr1

    да 3.0 сельхоз, https://releases.1c.ru/project/BuhSh30

    Reply
  22. kias777

    (21)Данная конфигурация, является партнерской, все конфигурации данного партнера, не поддерживают возможность автоматического обновления в связи с отсутствием распакованных обновлений и наличием СЛК, которую надо ставить в ручную и которая поставляется только в определенных релизах. (Например, данная конфигурация пытается автообновиться на стандартные релизы Бухгалтерии предприятия 3.0)

    В данной ситуации, в связи с отсутствием массовой необходимости добавление этих архивов, руками с нашей стороны не целесообразно.

    Ну и вас должна быть подписка ИТС.Отраслевой. Его проверка не поддержана на текущий момент в данном ПО, что протеворечит лицензионной политике 1С по получению обновлени.

    Reply
  23. kias777

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

    Reply
  24. vovafr1

    Подписка есть, обновления качаются прямо с сайта, слк редко переставляю, процедуру скачивания нельзя включить? поддержка отраслевого не (авторизация не нужна) качает и так , не могу разобраться со службой — не запускается, где посмотреть?

    Reply
  25. vovafr1

    почему может не запускаться?

    Reply
  26. maestro_

    Добрый день.

    Столкнулся со следующей проблемой, с какого-то момента перестала обновлять базы. Подписка — действительна.

    При попытке обновления пишет — Соединение с сервером расположения обновлений провалилось!

    Так же не удается добавить новую базу. При выборе «Программный продукт» — возникает ошибка:

    Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 79.29.41.27:55900

    Reply
  27. kias777

    Обновления находятся у нас на сервере в необходимом упорядоченном виде, т.к. на сервере 1С не все обновления есть. Бывает редко что наш сервер не доступен, но это бывает максимум сутки.

    Reply
  28. maestro_

    Хм….

    вот что пишется в логи

    15.03.2018 16:06:11 ; ОБНОВЛЕНИЕ ; 0 ; 0 — 15.03.2018 16:06:11 — Задача поставлена в очередь на выполнение!;

    15.03.2018 16:06:12 ; ОБНОВЛЕНИЕ ; 0 ; Обновление запущено!;

    15.03.2018 16:06:13 ; Соединение ; 5 ; Код ошибки: 1; Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 78.29.41.27:55900

    15.03.2018 16:06:13 ; Скачивание релизов ; 2 ; Соединение с сервером расположения обновлений провалилось!; Выдано исключение типа «System.Exception».

    такое поведение с середины февраля 2018

    Reply
  29. kias777

    Был в отпуске. Может поздно, но отвечу. В данном случае надо проверить, что у вас есть интернет на ПК где запущен AU и разрешены исходящие соединения по порту 55900.

    Reply
  30. _555

    Добрый день.

    А если обновления уже скачены без подключения к ИТС будет работать?

    Reply

Leave a Comment

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