Исправление Справочники.Контрагенты, Справочники.Номенклатура (update)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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. MRAK

    Есть и помощнее обработки для контрагентов, например:

    http://infostart.ru/public/20083/

    http://infostart.ru/public/20201/

    Reply
  2. 0vrcr

    (1) Спасибо за ссылки, посмотрю Вашу реализацию алгоритмов. Наверное, подчерпну что-то для себя новое. Про свою же обработку скажу: она сделана для максимально быстрой работы, с максимально понятным интерфейсом и без наворотов. Писалась для себя, а тут выложил, т.к. не видел Ваших обработок, и подумал, что кому-то может пригодиться. В общем-то, как мне кажется, она делает все тоже самое, что предложено в Ваших обработках. Плюс, форма собственности указывается строкой, что позволяет не привязываться к формам собственности только на территории РФ. Да и, практически, дает полную свободу обработки, т.к. может убирать эти сочетания из любой части наименования, а не только из начала строки.

    Reply
  3. MRAK

    (2) на мой взгляд, основной минус, что обрабатываются только 3 значения, а не произвольный список.

    Reply
  4. MRAK

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

    Reply
  5. 0vrcr

    (3) Как мне показалось, 3 значения, этого вполне достаточно. Но как вариант, можно сделать одно текстовое поле, где будет возможность вводить сразу бОльшее количество. Вопрос, нужно ли оно?

    (4) Не обратил внимание на скриншоте.

    Reply
  6. 0vrcr

    Если нужно больше параметров для обрезки номенклатуры, то я могу вынести это добро в таблицу значений. Отпишитесь, если кому-то это требуется

    Reply
  7. 0vrcr

    (3) Скоро будет выбор произвольного количества параметров обрезания.

    Reply
  8. 0vrcr

    (3) спасибо за идею, реализовано 😉

    Reply
  9. 0vrcr

    Прошу прощения, забыл сразу залить новый файл обработки… 😮

    Reply
  10. bearcat

    Данная обработка полезна, если Ваш бухгалтер любит писать ООО/ЗАО/ОАО и прочее в начале краткого наименования контрагента

    Не скажите….

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

    Reply
  11. a-novoselov

    (0) Есть более универсальная обработка, которая уже месяц тут выложена http://infostart.ru/public/63315/ — замена любых символов в любом справочнике в любом реквизите.

    > 🙂 Во всемирной паутине ничего подобного не отрыл.

    Юзай поиск 😉

    Reply
  12. 0vrcr

    (10) Я говорил о частном случае у себя в организации 😀

    (11) В том то и дело, мне не было нужно громоздкое ВСЕ 😀 Да и иногда быстрее написать самому, чем найти что-то полезное в поииске :D. В любом случае, реализацию посмотрю, спасибо.

    Reply
  13. 0vrcr

    (11) Да и, собственно, смысл обработок немного разный, согласитесь.

    Reply

Leave a Comment

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