1с77 + УРБД + DropBox




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

7 Comments

  1. script

    URBDMaster + Сеть через VPN + Обмен каждые 5 мин.

    Все летает несколько лет — 6 переф. баз.

    Конечно с УРБД есть заморочки но они есть всегда при любых вариантах

    Да кстати. Для кассовіх документов, что бы соблюсти сквозную нумерацию

    На отдельном веб ресурсе лежит база на MySQL. При записи нового документа начер специальную ВК 1С обращается к этой базе и считывает из таблиц последний номер — прибавляет 1 получает новый номер документа и тут же его записывает обратно в эту же таблицу. И так далее… каждая переф. база перед выпиской кассовых доументов обращается на Веб ресурс в инете за номерами. Если инета нет тогда из переф баз звонят в центральную идалее выдача номеров по журналу.

    Но все это уже позапрошлый век…..

    Reply
  2. anton.fly7

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

    Главное удобство, с моей точки зрения, в том что обмен происходит независимо от наличия интернета в данный момент времени — DropBox прокачает файл когда будет on-line

    Reply
  3. anton.fly7

    Заранее всем спасибо за использование реферала )))

    Reply
  4. harutyunb

    очень интересная разработка, жаль сейчас не могу тестировать, у меня баз 9

    Reply
  5. padlik07

    как жаль что раньше на статью не наткнулся =( пользуюсь дропбоксом уже давно но для решения данных целей и в голову не приходилось. обычно создавал виртуальную локальную сеть с помощью himachi и создавал общую папку. минус состоял в том что модемы использовались 3g и соединение было не стабильным, а после обновления смертельно долго было ждать пока все данные выгрузятся в обмен. осуществлял я это к тому же не на 7.7, а на 8.2 и фаил для обновления переферийного узла весил порядка 200 мб.

    Reply
  6. fieryfist

    Недавно стал использовать dropbox в обменах, столкнулся со следующей проблемой — если файл обмена очень большой (у меня был 400мб), то на компе где ХР вылетает 1С и дропбокс с ошибкой, когда 1с читает файл обмена, сервер 2008 просто виснет. Сначала не знал, по какой причине виснет, теперь уверен на 100% из-за дропбокса. Думаю может причина в том, что и дропбокс читает файл (синхронизирует) и 1С одновременно, но тогда почему виснет сервер… непонятно, файл обмена 1с не читает. специально закрывал все процессы

    Reply
  7. nextkmv

    Встречал такие ошибки при обмене, лечил переводом обмена на FTP, благо сайт с FTP сейчас практически у каждой конторы. ИМХО FTP пока надежнее DropBox будет.

    Reply

Leave a Comment

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