Динамические массивы в семерке.




Принцип обмена данными из 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. Шёпот теней

    все люди делятся на две категории:

    1. ищут способ

    2. ищут причину

    … хороший программист всегда ВЫШЕ любой платформы … вот …

    Reply
  2. mszsuz

    И такая обработка массива работает быстрее, чем ТЗ?

    Reply
  3. Ёпрст

    Посмотрел бы лучше класс Вектор и АссоциативныйВектор 1с++

    всё быстрее.

    Reply
  4. Ish_2

    Арчибальд, любой вопрос можно решить так , а можно и эдак.

    Что толку , что ты показал, что Formex можно использовать ? И что с того ?

    Где сравнительный анализ ?

    Без него читателю ничего не остается, как почесать в затылке : «Арчибальд — это голова…».

    Reply
  5. Арчибальд

    (3) Слишком много сразу…

    (4) Ну и не не клади палец в рот…

    Reply
  6. artbear

    (5) Ага, лучше бы сразу показал на Векторе или Ассоциативном векторе из 1С++

    Можешь проверить скорости — 1С++ сильно выигрывает, да и сервисных возможностей побольше — тех же быстрых выгрузок/загрузок из штатных объектов типа ТЗ, СЗ, документов и прочая.

    Reply
  7. Ish_2

    (5) И правда , попробуй (6) в своей обработке графа.

    Прогноз : не спасет .

    Но выигрыш в 1.5 — 2 раза , думаю , вполне реален.

    Reply
  8. Арчибальд

    (6)(7) Что-то я попробовал 1С++ поставить — глюки пошли. Держу пока в заначке, разбираться руки не доходят.

    Reply
  9. vip

    (8) А какие именно глюки пошли?

    И какой релиз 1С++ у тебя?

    Не держи в заначке. Я вообще давно уже не представляю работу без 1С++.

    Reply
  10. artbear

    (8) Да, версию 1С++ покажи. Лучше юзать последнюю из версии 3.Х.Х

    и порядок загрузки всех ВК.

    1С++ должна грузиться самой первой из ВК — правило верно почти в 99% случаях.

    Reply
  11. Арчибальд

    (9) Да я понимаю, что надо разобраться и начать применять. Текучка заедает.

    Reply
  12. vip

    (11) Разбирайся.

    И сразу текучки меньше станет 🙂

    Reply
  13. Арчибальд

    (12) Не, на текучку это не повлияет. Разве что к какому новому проекту… которого не предвидится.

    Но разбираться буду.

    Reply
  14. Арчибальд

    (10) Где бы ее еще взять…

    Reply
  15. artbear

    (14) Последние релизы 1С++ можно взять на странице

    http://www.1cpp.ru/index.php/File:Icpp-latest.rar

    Внимание — это не архив, а именно страница 🙂

    и там можно скачать любой релиз 1С++ З.Х.Х, и уточнить историю изменений.

    Reply
  16. Ish_2

    (14) Давай , Арчибальд, буду ждать.

    Чем черт не шутит ?

    А вдруг твою обработку графа и вравду спасет 1с++ ?

    Reply
  17. Арчибальд

    (15) Спасибо. А что, FormEx перестал быть встроенным?

    Reply
  18. Арчибальд

    (16) Не дерзи 😀 . Вспомни, что на стотысячном дереве без повторений моя обработка твоей не уступает даже без всяких серверов, на миллионнике с повторениями работает на порядок быстрее, чем у тебя, а на миллиарднике — похоже, на три порядка. Чью обработку тут спасать-то?

    Reply
  19. Ish_2

    (18)Уважаю дерзких . Но твоя дерзость не знает границ .

    Я тебе талдычу одно и тоже : всё дело в постановке задачи.

    1.Если ты предлагаешь «пулялку» по тестам , где столько нереальных повторений узлов ,

    сколько НИКОГДА не встретится в реальных задачах — то твой алгоритм оч.оч. хорош. Признаю.

    2. Если ты предлагаешь технологичное решение для пользователя , то

    — обработка НЕ ДОЛЖНА зависеть от повторений узлов и быть в среднем оптимальной .

    Что толку что твоя обработка показала на выдуманном тесте 0 сек ? — Если в реальном нагрузочном тесте она «рухнула»- 10 мин (!!). Какой в ней прок пользователю ?

    — обработка в случае зацикливания графа должна ЯСНО, ПОНЯТНО, ОДНОЗНАЧНО для пользователя отобразить это зацикливание для последующего исправления. Если этого нет , то для практического использования обработка непригодна. Ты , что ? Пользователю который будет тыкаться -искать ошибку после твоих сообщений «..ПОЗ00001», скажешь :

    «Зато моя обработка «пуляет» по тесту №1 за 0 сек !»

    Reply
  20. Арчибальд

    (19)

    всё дело в постановке задачи

    Была поставлена задача разузлования. Эту задачу я и решил. На РЕАЛЬНЫХ комплектациях (а спецификаций с миллионом различных позиций не бывает, это за гранью реальности) она решается на порядок быстрее, чем у тебя.

    обработка НЕ ДОЛЖНА зависеть от повторений узлов и быть в среднем оптимальной

    Перефразируем для понятности. На твой взгляд, во-первых, обработка должна игнорировать РЕАЛЬНУЮ ситуацию повторения узлов, а во-вторых, среднеоптимальным является прямой перебор дуг. И то и другое — ни в какие ворота…

    обработка в случае зацикливания графа должна ЯСНО, ПОНЯТНО, ОДНОЗНАЧНО для пользователя отобразить это зацикливание для последующего исправления.

    Ну, давай глянем. В графе с одной ошибочной дугой ты находишь 10 000 ошибочных веток, сообщаешь пользователю о 100 из них — и что? Это ясное, понятное и наглядное представление?

    Ты решил не ту задачу. Твоя обработка рисует дерево. И все. А вот с разузлованием — тухляк…

    Reply
  21. Ish_2

    (20) Представь своё технологичное решение .

    Надеюсь , ты понимаешь , что предыдущее твоё решение «Граф(ин)..» на технологичность совсем не тянет.

    На 77, на 8, на 1с++. Да хоть на чём !!!

    Тогда поговорим.

    Сейчас всё впустую.

    Reply
  22. Арчибальд

    (3)(6) Ассоциативный вектор пока не нашел. На Векторе: запись вдвое быстрее, чем в СписокЗначений, чтение примерно одинаковое. Но съедает больше памяти.

    Мои массивы раза в четыре-шесть медленнее работают. Но памяти вдвое меньше съедают.

    Reply
  23. artbear

    (22) А чего его искать? онлайн-дока http://www.1cpp.ru/docum/icpp/html/

    например, в данном случае смотри файл extobjs.html

    Прямая ссылка

    http://www.1cpp.ru/docum/icpp/html/extobjs.html#id119

    Reply
  24. freespy

    бл9, вы бы лучше обсудили, что в теме нет описания, как определить количество элементов в массиве!

    Reply
  25. Арчибальд

    (24) В теме еще не описано, как определить тип переменной. И много чего другого не описано, к теме не относящегося.

    Reply
  26. fishca

    (22)

    Мои массивы раза в четыре-шесть медленнее работают. Но памяти вдвое меньше съедают.

    И чем ты гордишься 😉 ?

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

    Reply
  27. Арчибальд

    (26) Гордость тут ни при чем, это просто замечание по эксперименту. Тема появилась в связи с дискуссией «Как не попасть на миллион», и там дело упиралось в объем выделяемой задаче памяти — не физической, а системной. Суммарное время работы (обработка+ожидание памяти) сильно зависит от того, что еще крутится на копмпе.

    А вообще-то публикация больше показательная, чем практическая.

    Reply

Leave a Comment

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