Итераторы выборки




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

10 Comments

  1. МихаилМ

    2к — очень маленькая выборка . тк 36мс велика погрешность замера . сделайте 100к из тз в пз.

    также интересна обработка тз по тз в пз + Ваш итератор.

    Reply
  2. HAMMER_59

    Так я и не понял, для чего все эти танцы с бубном.

    Не хватает возможностей объекта запрос — используйте СКД.

    Никаких проблем не составляет таблицу значений передать в СКД.

    Reply
  3. МихаилМ

    «Однако существует способ свести задачу обхода из таблицы значений к обходу элементов выборки из результата запроса, использовав временную таблицу» —

    ерунда . тк построитель запроса (пз) преобразует тз в выборку без временных таблиц. исправьте статью.

    Reply
  4. neikist

    Одна из причин почему не хватает ООП в платформе — невозможность удобно писать подобные вещи не через одно место.

    Reply
  5. МихаилМ

    (2) если из скд получать из , то это медленный способ обрабртки если использовать ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений

    Reply
  6. kalyaka

    (1) не вижу смысла. Алгоритмически зависимость времени линейная. Для уменьшения погрешности я использовал среднее значение по 20 измерениям

    Reply
  7. kalyaka

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

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

    Reply
  8. kalyaka

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

    Reply
  9. HAMMER_59

    (4) ИМХО когда говорят, что в 1С очень не хватает ООП, рассматривают далека не все аспекты, а только некоторые случаи, где ООП пригодилось бы.

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

    Вчера разбирался с задачей: нужно было чтобы при выгрузки бухгалтерских счетов с аналитикой из БП в ЗиК, не помечались на удаления раннее загруженные счета с аналитикой.

    Вроде все понятно — нужно подправить правила. И правило то понятно где лежат.

    Пытаюсь пойти самым простым путем. Добавляю расширение, в расширение добавляю нужный макет. Макет добавился но доступа на редактирование нет.

    Ладно замещаю функцию, которая получаем макет — 1С начинает вылетать с ошибкой.

    Сохраняю обработку как внешнюю. Меняю макет — выгрузка не меняется. Начинаю разбираться — макет получает не из обработки, а напрямую обращением к метаданным. Не проблема — меняю кусок кода. Все равно не получается.

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

    Можно сказать что 1С-ники чуть-чуть применили самый что не на есть настоящий ООП. Лучше стало?

    Для разработчиков, думаю, что да.

    А теперь представим что ООП будет не чуть-чуть, т.е. в типовых конфигурациях будут присутствовать не всем нам знакомые объекты, а просто море новых совершенно незнакомых нам объектов.

    Reply
  10. neikist

    (10) Ну так зато можно будет применять кучу удобных вещей, управлять зависимостями компонентов. Интерфейсов из ООП не хватает, инкапсуляции небольших структур с буквально парой методов… В общем хочется, очень хочется.

    Reply

Leave a Comment

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