Свертка дублирующихся справочников (управляемые формы)




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

22 Comments

  1. корум

    (0) есть отличия от тысяч клонов?

    Сам писал или переделка чего-то найденного?

    Reply
  2. strange2007

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

    Так-же определение правильного элемента можно вертеть-крутить как угодно, в т.ч. и по кол-ву ссылок на тот или иной элемент.

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

    И да, сам писал. Совсем сам.

    Reply
  3. корум

    Отлично 🙂

    Reply
  4. Agema

    Пока почитаю отзывы. Пригодится

    Reply
  5. strange2007

    Нашёл! Инструмент создавался примерно месяц. Из них 12 дней активной работы и 7 дней доработок по чуть-чуть

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

    (0) В БП3.0 есть встроенная обработка ПоискИУдалениеДублей. Она сильно отличается функциональностью от данной обработки?

    Reply
  7. корум

    (6) по описанию, отличается сильно. при определении верного истинного элемента можно опираться на свой код, на «правильного» владельца, на нужный префикс и т.д.

    Держу на заметке, но пока необходимости нет — не качаю.

    Reply
  8. strange2007

    (6) Скорее всего отличия есть. Может плохо смотрел, но там не нашёл как свернуть дубль, например:

    1. «Козлов Иван »

    2. «Иван Козлов…»

    Reply
  9. strange2007

    (7) Так и я её первую версию (под ТК) делал от необходимости, а не от пальцегнутости)))))

    По правде там ещё небольшая вкусность в полной автоматизации и в работе с нагрузкой на компы. Но это можно оценить в критических ситуациях

    Reply
  10. Zhilyakovdr

    Не изобретайте велосипеды

    http://infostart.ru/public/124277/

    Открывать в режиме обычного приложения

    Reply
  11. strange2007

    (10) Это очень хорошая разработка, но она не перекрывает весь спектр задач, которые преследовал я. А именно там не нашёл информации по распределению нагрузки. Т.е. запусти я подобный инструмент на любом предприятии, где имеется приличная нагрузка на сервера и заказчик меня бы порвал))))))))

    Так же там не нашёл каким образом сравнить, например, номенклатуру у которых:

    1. Могут совпадать артикулы.

    2. Если п.1 не выполняется, то сравнивать по набору свойств.

    3. Если п.2 не выполняется, тогда сравнить по наличию остатков в базе.

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

    Хотя конечно же, может я там много галочек и кнопочек не нашёл. Не спорю.

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

    Reply
  12. Zhilyakovdr

    (11)

    1) Любые технические работы выполняются когда сервер меньше всего нагружен, чаще всего ночью;

    2) По поводу 3х пунктов, просто напросто создается три настройки;

    3) Гнать с***ым веником тех людей которые так зас**ли базу;

    «В общем каждый сам для себя выбирает, что и как использовать» — полностью согласен)))

    А лучше всего, когда такие инструменты использовать не надо)))

    Reply
  13. Дмитрий74Чел

    (10) Ха-ха. А если сервер 1С в другоми домене и вообще в N км от разработчика? Например на Канарских островах? Для «обычного приложения» нужен толстый клиент — а он на узком канале просто не взлетит.

    Плавали, знаем. Просто поместили базу в ЦОД крупного провайдера, но канал оказался не очень — только в тонком клиенте все работает.

    P.s. Конфигураторы разрабов — в другом серваке. А на боевом — только главный страшный прог.

    Reply
  14. strange2007

    (13) Немного не понял что этим хотели сказать или в чём была ирония. Инструмент, предложенный в этой ветке использует средства 1С для передачи информации между сервером и клиентом, поэтому если всё остальное работает, то и инструмент должен справиться со своей задачей.

    Или смысл в (13) был про другое? Уточните.

    Reply
  15. Zhilyakovdr

    (13) Про RDP и другие удаленки не слыхали…. У нас в организации около 30 своих точек и еще сеть франчази, все на нашей поддержке, разбросаны по всей стране. У большинства интернет через свистки и файловые БД и все работает нормально, а вы тут на ЦОДы жалуетесь….

    Reply
  16. dddxddd

    Пытаюсь свернуть дубли номенклатуры в БП 3.

    На закладке «для запроса» при выборе «наименование» для метаданных «номенклатура» странный вариант отбора «<» «>» и т.д. интересно, это что имеется ввиду?

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

    Reply
  17. strange2007

    (16) На закладке «для запроса» задаются условия для запроса. Запросом выбирается начальный список который потом анализируется на элемент наличия дублей. Т.е. в этой закладке, например, можно выбрать только элементы без групп (ЭтоГруппа = Ложь ). Больше или меньше, это тоже условия для запроса. Например, если надо исходный список построить по условию «выбрать всех контрагентов у которых минимальное кол-во дней долга 10», тогда условие на этой закладке надо сделать «ДнейДолга > 9».

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

    На первой закладке запрос обрезал по группам, т.е.

    ЭтоГруппа = Ложь

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

    На второй закладке «Поиск дублей» добавить тоже только одну строку

    ЕдиницаИзмерения Равенство

    Т.о. сравниваться номенклатуры будут только по реквизиту ЕдиницаИзмерения.

    На третей закладке «Определение правильного» рекомендуется только установить флаг «Поиск ссылок перед отображением дублей».

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

    И всё. Если больше условий нет, тогда можно запускать выполнение

    Reply
  18. strange2007

    (16) Если база очень большая и там много кто работает, то надо «играться» с механизмом нагрузок. Тут чуть позапутаней, но оно того стоит.

    Ах да, чтобы скорость не была слишком долгой, то не заставляйте механизм «нырять» сильно часто на клиента, но и слишком редко тоже плохо, т.к. не видно где он там копошится и сколько времени осталось.

    Reply
  19. borman

    информер показывает нечто странное

    Reply
  20. strange2007

    (19) Добрый день. Немного странно. Подскажите на какой операции это случилось?

    Reply
  21. borman

    Ну собственно на операции свертки дублей номенклатуры. Был установлен фильтр по ВидуНоменклатуры и 2 параметра сравнения: по Артикулу и Наименованию. Собственно, все. Никаких хитрых настроек не делалось. Конфигурация там допиленная УТ11.3.

    Номенклатуры в базе много и дублей тоже. Информер дошел до «из них обработано» 20000 — и я прервал обработку.

    Забавно еще то, что после этого мне никак не удается запустить в вашей обработке процесс поиска дублей — результат всегда пустой, хотя типовая обработка видит дубли по таким же параметрам.

    Reply
  22. pvb2003

    2 файла — какой качать ? Хоть версию поставьте , что бы было видно какой последний …

    Reply

Leave a Comment

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