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='\

13 Comments

  1. O-Planet

    исключительный…

    Reply
  2. Lapitskiy

    Реклама по PR-правилам. Неважно, хорошо или плохо говорят, главное, чтобы говорили.

    Reply
  3. gubsky

    а у меня складывается впечатление, что УПП никто нормально внедрить не может…

    имхо

    Reply
  4. merenkoff

    Мы у себя внедряем УПП. Просто главное почти не менять код в главном функционале!»!!!!!

    И подстраивать пользователей к программе!

    Reply
  5. azernot

    Ещё на этапе выбора системы в зародыше подавил все заявления типа «нам бы УПП…».

    Сейчас юзаем БП на которую навернул бюджетирование (так как это нужно НАМ), сдалал модуль управленческого учёта (так как это нужно НАМ), сделал систему отчётности перед головной орагнизацией для консолидации (так как это нужно ИМ).

    В итоге переписанная БП, которую поддерживаю в актуальном состоянии (сейчас на 1.6) + ряд механизмов внутреннего учёта и бюджетирования. В УПП не специалист, но из того что я видел, могу сделать вывод, что один человек, за такие сроки и в таких объёмах не внедрил бы даже того, что у меня есть сейчас.

    Вывод: предварительная оценка должна осуществляться не по рекламным буклетам. 7 раз отмерь, один раз отрежь.

    Reply
  6. zarius

    Согласен на 100% Причины кроются как в отсутствии опытных кадров, так и в недопонимании между заказчиком и исполнителем

    Reply
  7. ex3mall

    Да короче…

    Внедрение без проблем не бывает — это аксиома.

    Человеческий фактор всегда сыграет свою роль.

    И не стоит утверждать, что у Вас на предприятии все просто замечательно, и такого никогда не случится…

    А случай — действительно показательный…

    Нехорошие ВДГБ ужасно подошли к проекту и провалили его… НО!!!

    Пришли хорошие господа-аудиторы и все наладили!!!

    Обращайтесь!!!

    И смех и грех…

    Reply
  8. ex3mall

    Все зло кроется не в недопонимании или отсутствии кадров, а в плохой постановке жестких рамок ведения проекта как для Заказчика, так и для Исполнителя…

    100% уверен, что условия и задания по ходу работы менялись 10000 раз, и Заказчик до сих пор не в состоянии точно ответить на вопрос — а что же он хочет в итоге…

    Reply
  9. poppy

    Имхо вполне предсказуемое развитие событий для ВДГБ. И дело здесь не в сложности УПП и не в отсутствии кадров, скорее в способе ведения дел.

    Они легко могут себе позволить «кинуть» своего партнера. О клиенте и говорить нечего.

    Reply
  10. Abadonna

    (8) Что хочет заказчик я давно по своему опыту понял.

    Звучит примерно так:

    «Я не знаю, что мне надо, но чтобы все работало! Желательно само по себе» 😉

    Reply
  11. vasilykushnir

    (10) И нефиг мучить заказчика разными расспросами….

    Reply
  12. gavril

    (4) Не у всех получается «прогнуть» все БП под УПП. Тогда приходится менять код. Но вместо УПП я бы рекомендовал ИТРП 🙂 Понятней и для внедренца и для пользователя.

    (8) Скорее всего план проекта был, потому как оцененые работы (менее 15%) от чего то таки плясали 🙂 В том что этот план был размыт и не формализирован, возможно факт, но тогда как чел. получивший сертифика «Руководитель проекта» (обязателен для ЦКП) смог допустить такое.

    В общем говорится о том что поднятая 1С планка для франчей в виде ЦКП себя не оправдала. Ведь внедряется УПП фрилансерами и будет внедрятся. Просто ЦКП в 3 раза дороже 🙂 и с авансом в 100%.

    Reply
  13. oninfostart

    кнопка «Пыщ!»-программист, даешь понятный интерфейс)))

    Reply

Leave a Comment

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