Поиск и пометка на удаление контрагентов без документов




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

17 Comments

  1. MSK_Step

    НайтиСсылки — не?

    Reply
  2. qux

    (1)

    НайтиСсылки это для 7-рки.

    Для 8.х НайтиПоСсылкам (FindDataByRef)

    Синтаксис:

    НайтиПоСсылкам (< Список ссылок> )

    Параметры:

    <Список ссылок> Обязательный

    Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.

    Возвращаемое значение:

    Тип: ТаблицаЗначений. Таблица значений, состоящая из ко­лонок с индексами: 0 — Искомая ссылка; 1 — Ссылка на объект, который содержит искомую ссылку.

    Описание:

    Осуществляет поиск ссылок на объекты.

    Но метод естественно проще )))) Видимо в запаре был, не в себе )))) Перепишу под эту функцию…

    Stepan 21231312, спасибо за совет.

    Reply
  3. kofr1c

    Не хочу обидеть автора, но такого рода «обработки» пора уже прикрывать!

    Это уже становится похоже на хабр и темы по линукс.

    Reply
  4. qux

    (3)

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

    Reply
  5. kofr1c

    (4) Такого, что фактически дублирует (а исходя из «Перепишу под эту функцию…»,то вовсе копирует) стандартные возможности платформы…Смысловой нагрузки 0, информативности 0, полезности 0.

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

    Reply
  6. qux

    (5) Дмитрий, спасибо за полезный комментарий. Доработаю обработку с учетом ваших замечаний. Примеры того, что вы описали на Инфостарте встречаются. Например: http://infostart.ru/public/267734/. Я ими сам пользуюсь с благодарностью в сердце к авторам. Мне же нужна была обработка не отягощенная настройками, работу с которой можно было доступно объяснить тётушке на другом конце телефонного провода.

    Reply
  7. MSK_Step

    (3)чем же хабр и линукс не угодил

    Reply
  8. kofr1c

    (6) «Мне же нужна была обработка не отягощенная настройками…» — в моем примере и не надо ничего настраивать юзеру 🙂

    «Примеры того, что вы описали на Инфостарте встречаются» — к этому я и клоню.

    Есть база бухгалтерии, в которой было помечено на удаление порядка 1 000 000 объектов. Стандартная обработка при анализе этих объектов (объекты разношерстные) через 4 часа просто вешалась с ошибкой. Я написал обработку, в которой достаточно было просто нажать одну кнопку (хоть и добавил возможность выбора объектов метаданных) и просто ждать. Через 2,5 часа обработка удалила порядка 600 000 объектов.

    Хоть написанная мной обработка и решила указанную проблему гораздо быстрее, и написана была универсально, но я не увидел в ней чего-то необычного, чтобы сразу выкладывать на инфостарт.

    Reply
  9. kofr1c

    (7) Кто-то открыл для себя линукс и смог его установить на виртуалку — сразу создается пост.

    Reply
  10. qux

    (8) Дмитрий, думаю многие были бы рады воспользоваться вашей обработкой для решения подобных задач. В том числе и я когда у меня возникнет такая потребность. Инфостарт это сообщество где у участников есть огромный выбор решений, а качество таких решений определяется рейтингом. Даже в нашем обсуждении есть определенная польза для участников Инфостарта. 😉

    Reply
  11. MSK_Step

    (9)Не у всех сложности с написанием статей, если следовали бы вашему примеру, то ни одной статьи бы не было.

    Reply
  12. kofr1c

    (11) значит, Вы просто не читаете на хабре комменты и не поняли, к чем у я привел пример с хабром 😉

    Я не против дележки опытом и радостью людей,что у них что-то получилось…Но,как писали в комментах на хабре, скоро ничего серьезного невозможно будет найти среди однотипных статей новичков 🙂

    Ну,да ладно…Свое мнение я высказал и дальше флудить не вижу смысла.

    Reply
  13. МимохожийОднако

    Я для подобных случаев помечаю всех контрагентов и удаляю стандартной обработкой. Потом снимаю пометку удаления с тех, что остались

    Reply
  14. Painted

    (4)

    Обратная связь всегда полезна.

    Здесь полно обработок вида «Удаление неиспользуемых элементов справочников» . Например, http://infostart.ru/public/19064/

    Я так понимаю, что данная обработка из этого же рода.

    Reply
  15. v3rter
    Далее найденные элементы можно пометить на удаление

    А можно добавить опцию «переместить в группу»? Завидую тем, у кого есть «лишние» контрагенты )

    Reply
  16. qux

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

    Reply
  17. Kate_13

    (16)Как получить обновлённую версию? А то скачивается старая.

    Reply

Leave a Comment

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