Структура таблиц SQL доработанная




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

27 Comments

  1. YAN

    Хорошая обработка, позволит быстро написать обмен данными в MSSQL!

    Reply
  2. Nel

    Нужная обработка!

    Reply
  3. gusinea

    просто спас

    Reply
  4. gusinea

    +100

    Reply
  5. DimaP

    Полезная штука!

    Reply
  6. oKuzh

    Совершенно замечательно! Я конвертировала Вашу обработку в 8.2

    Reply
  7. anna_irk

    полезная вещь

    Reply
  8. hse.John

    Спасибо!

    Reply
  9. courageous

    Спасибо. незаменимая вещь при работе с внутренними запросами

    Reply
  10. eli1984

    Очень полезная обработка, спасибо. Пользуюсь не на радуюсь, руки не доходили написать, а тут такая полезняшка.

    Reply
  11. baralgin1003

    я пока ее не скачал,но есть вопросец… структура SQL показывается наверху или внизу*?

    и еще один… внешними запросами можно ли что то записать в базу 1с?

    Reply
  12. novosys

    когда-то могла мне пригодиться очень, но не было её, поэтому разбирался, где что хранится долго для выяснения причин сбоев. +

    Reply
  13. sbr

    Спасибо.

    Вещь помогла реально.

    Скачивал ее давно, чувствовал наверно, что может понадобиться

    Еще раз СПС

    Reply
  14. DERL

    Спасибо! Спасибо! Спасибо!

    Reply
  15. mzelensky

    ! + !

    Reply
  16. Созинов

    Полезная вещь. Обработке +

    Reply
  17. Созинов

    (6) oKuzh,

    Файл ошибочный. Не открывается

    Reply
  18. gortol

    (17) EfiopReal, я же доработал обработку чтобы на управляемых формах 8.2 работала… не подходит?

    Reply
  19. Созинов

    (18)

    Все понял, спасибо, сейчас скачаю проверю. Как раз это и нужно. Просто рейтинга пока не хватает.

    Reply
  20. AlexO

    gortol

    SQL запроса на основании 1С запросов

    Мне вот блок-схема реализации таковой идеи интересна.

    (9) courageous,

    незаменимая вещь при работе с внутренними запросами

    и что вы там во «внутренних» запросах «работаете»?

    (11) baralgin1003,

    внешними запросами можно ли что то записать в базу 1с?

    нет, нельзя. Вернее, писать-то можно, SQL же не блокирует обращения в свою базу, но получите совершенно не то в 1С-базе, что ожидали получить.

    (10) eli1984,

    Пользуюсь не на радуюсь, руки не доходили написать, а тут такая полезняшка.

    До чего руки не доходили — написать запросы?

    Reply
  21. eli1984

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

    Reply
  22. eugen91

    Как раз то что искали!спасибо

    Reply
  23. hanio

    Помогите с такой проблемой: у нас база на SQL 2008R2 УТ 10.3.18.3 до 21.08.13 отлично проходил автоматический обмен с БП 2.0, собственно после этого больше ни разу не сработал вылетал на 10% по ошибке «Ошибка при вызове метода контекста (ЗагрузитьПравилаОбмена): Произошла исключительная ситуация (1C:Enterprise 8.2.16.368): {Обработка.ОбменДаннымиXML.МодульОбъекта(2117)}: Тип не определен (ПеречислениеСсылка.ОтветственныеЛицаОрганизации)». Понятное дело что с перечислением данным мы ничего не делали.

    Попытки сделать выгрузку данных из SQL в SQL в попытке что новая база сама создаст правильную структуру ни к чему не привели, ошибка повторилась. Выгрузка в DT аналогично ни к чему не привела. Попытки сделать ТиИ тоже не помогли.

    Правила обмена брались различные и от старых релизов и типовые и скачивал отсюда, редактировали их в КД убирали записи по данному перечисление, толку никакого все равно одна и та же ошибка, как будто она где-то прописалась. Темпы 1С различным чистилками с инфостарта очищал, серваки перегружал. Перечисление переименовывал, возвращал ну и массу всяких вариантов — все в пустую.

    В SQL пытались полностью убрать таблицу потом заливали ее из рабочей копии, результат неизменный.

    Пришел к выводу что возможно в SQL произошло разрушение какой-то связки между таблицей перечисления и таблицей с указанием типа данных этой таблицы. Это я так предполагаю потому что в SQL не силен.

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

    Reply
  24. hanio

    Кстати я определил что мне надо копать в таблице Params но твой отчет не выдает его в таблице. Почему? А вообще нереально там бинарные данные определить за что отвечает каждое поле и увидеть сразу к каким метаданным имеется соответствие?

    Reply
  25. xzorkiix

    А может кто подсказать, в базе данных кроме, например Reference1291, есть так же таблица Reference1291NG. Что это за *NG? и это повторяется для всех справочников и их табличных частей.

    Reply
  26. ah7777777

    Загрузил — не работает на 1С:Предприятие 8.3 (8.3.9.1818)

    Reply
  27. Salexey

    статистику можно здесь глянуть https://infostart.ru/public/1093355/

    Reply

Leave a Comment

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