Мастер поиска и удаления




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

20 Comments

  1. rasswet

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

    Reply
  2. gull22

    Беру. Плюс.

    Reply
  3. rasswet

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

    Reply
  4. mbreaker

    (3) rasswet, были, но для подобных случаев есть более подходящие средства. Например более «тяжёлая» разработка http://infostart.ru/public/175028/. Или предварительная обработка иными средствами (их много) перед запуском моей утилиты. Я не зря написал в описании «хотелось чего-то с одной стороны простого в работе, но максимально эффективного». Призвание данной обработки — быстрый и удобный поиск, анализ найденных ссылок и возможность рекурсивной зачистки. Превращение этого средства в «Инструменты разработчика» не предполагалось.

    Reply
  5. DAnry

    Илюстрация класная, и главное «в тему». Практически не было пользователя, на моей памяти, который бы не задал вопроса: «Почему я не могу удалить помеченный на удаление объект?» Многим очень тяжело объяснить эту премудрость. С вашего разрешения буду пользоваться впредь этим доходчивым рисунком.

    Reply
  6. mbreaker

    (5) DAnry, конечно пользуйтесь. Абсолютно не возражаю.

    Reply
  7. softgarant

    Илюстрация — то что надо)

    Reply
  8. YuriNevermind

    Подскажите пожалуйста, как добавить и запустить эту внешнюю обработку? Платформа 8.3.4.389

    Документооборот 1.3.1.5

    Reply
  9. YuriNevermind

    Пытаюсь запустить эту обработку ДрагНДропом и через Файл->Открыть, открывается пустое окошко, работает только вывод справки, что я делаю не так?

    Reply
  10. mbreaker

    (9)Вы пытаетесь открыть обработку из под интерфейса управляемых форм (УФ) без режима совместимости с «обычными» формами. К сожалению чисто технологически это невозможно, т.к. конфигурация 1С:Документооборот одна из первых, которая написана исключительно под УФ. Единственный вариант — это завести пользователя, для которого будет запускаться режим «обычных» форм (см. настройки пользователя БД через Конфигуратор).

    Reply
  11. KreditNIK

    подскажите, что-то не могу начать работать с ней. Она заточена под УТ 11,1???

    Reply
  12. mbreaker

    (11) KreditNIK, обработка сделана в неуправляемых формах, запускать её на УТ 11 нужно под пользователем с режимом запуска = «Обычное приложение».

    Reply
  13. gull22

    Не виден бегунок в Управление производственным предприятием, редакция 1.3 (1.3.52.1)

    Reply
  14. mbreaker

    (13) gull22, обработка совершенно самостоятельная, поэтому от конфигурации или её версии совершенно не зависит видимость элементов. Могу посоветовать сбросить персональные настройки основной формы обработки. Для этого нужно установить фокус на любом элементе формы и нажать Alt+Shift+R или кликнуть правой кнопкой мыши на заголовке формы и выбрать «Восстановить положение окна».

    Reply
  15. check2

    Шикарная обработка! Спасибо. Из пожеланий могу добавить разве что возможность задавать несколько ссылок.

    Reply
  16. pavelyar

    Не нашел ,на УФ работает?

    Reply
  17. mbreaker

    (15) check2, спасибо за признание труда. Всегда приятно услышать приятное, и плевать на тавтологию! ))

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

    Но там включена возможность открыть ссылку из списка в новом окне для параллельной работы.

    Reply
  18. mbreaker

    (16) pavelyar, под УФ адаптировать обработку пока не стал, т.к. УФ накладывает много ограничений на подобные вещи.

    Для УФ могу посоветовать пользоваться ключом стартера /RunModeOrdinaryApplication для запуска приложения в режиме ОФ.

    Reply
  19. abadonna83

    Мне обработка понравилась. Очень помогла при удаление элемента справочниками с большим количеством ссылок.. Однозначно рекомендую.

    Reply
  20. ctt

    Добрый день. В Документообороте версии 2.1.7 не работает — не удаляет, пометки на удаление тоже не ставит — выходит ошибка:

    {ОбщийМодуль.ОбменСМобильнымиСервер.Модуль(27,39)}: Переменная не определена (ОбменСМобильнымиСерверПовтИсп)

    УзелОбменаДляРегистрацииВсехДанных = <<?>>ОбменСМобильнымиСерверПовтИсп.ПолучитьУзелДляРегистрацииДанных();

    {ОбщийМодуль.ОбменСМобильнымиСервер.Модуль(790,15)}: Переменная не определена (ОбменСМобильнымиСерверПовтИсп)

    УзелОбмена = <<?>>ОбменСМобильнымиСерверПовтИсп.ПолучитьУзелДляРегистрацииДанных();

    {ОбщийМодуль.ОбменСМобильнымиСервер.Модуль(188,11)}: Переменная не определена (ОбменСМобильнымиDMXСервер)

    Возврат <<?>>ОбменСМобильнымиDMXСервер.ОбработатьВходящееСообщение(МобильныйКлиент, Сообщение);

    В нижнем окне пишет:

    {ВнешняяОбработка.МастерПоискаУдаления.Форма.Форма.Форма(172)}: Ошибка при вызове метода контекста (Удалить): Ошибка при выполнении обработчика — ‘ПередЗаписью’: {РегистрСведений.ДополнительныеСведения.МодульНабораЗаписей(14)}: Ошибка при вызове метода контекста (ОбщийМодуль): Попытка передачи мутабельного значения результата метода ОбщийМодуль ().

    Объект «00-00000000000000000000000000000000000000000000001» не удален!

    Reply

Leave a Comment

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