<?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='\
(0) есть отличия от тысяч клонов?
Сам писал или переделка чего-то найденного?
Есть небольшие отличия гибкостью настроек и широтой возможностей. Например, можно сделать так, что дублем будут считаться элементы у которых владелец будет один из нескольких. Алгоритм можно внести любой, в зависимости от ситуации.
Так-же определение правильного элемента можно вертеть-крутить как угодно, в т.ч. и по кол-ву ссылок на тот или иной элемент.
С нагрузкой и информативностью можно много чего понаделать. Например, при поиске ссылок нагрузку на сервер можно увеличить, а при определении правильных сделать больше упор на информативность, чтобы примерно представлять сколько ещё часов всё будет работать.
И да, сам писал. Совсем сам.
Отлично 🙂
Пока почитаю отзывы. Пригодится
Нашёл! Инструмент создавался примерно месяц. Из них 12 дней активной работы и 7 дней доработок по чуть-чуть
(0) В БП3.0 есть встроенная обработка ПоискИУдалениеДублей. Она сильно отличается функциональностью от данной обработки?
(6) по описанию, отличается сильно. при определении
верногоистинного элемента можно опираться на свой код, на «правильного» владельца, на нужный префикс и т.д.Держу на заметке, но пока необходимости нет — не качаю.
(6) Скорее всего отличия есть. Может плохо смотрел, но там не нашёл как свернуть дубль, например:
1. «Козлов Иван »
2. «Иван Козлов…»
(7) Так и я её первую версию (под ТК) делал от необходимости, а не от пальцегнутости)))))
По правде там ещё небольшая вкусность в полной автоматизации и в работе с нагрузкой на компы. Но это можно оценить в критических ситуациях
Не изобретайте велосипеды
http://infostart.ru/public/124277/
Открывать в режиме обычного приложения
(10) Это очень хорошая разработка, но она не перекрывает весь спектр задач, которые преследовал я. А именно там не нашёл информации по распределению нагрузки. Т.е. запусти я подобный инструмент на любом предприятии, где имеется приличная нагрузка на сервера и заказчик меня бы порвал))))))))
Так же там не нашёл каким образом сравнить, например, номенклатуру у которых:
1. Могут совпадать артикулы.
2. Если п.1 не выполняется, то сравнивать по набору свойств.
3. Если п.2 не выполняется, тогда сравнить по наличию остатков в базе.
Ну и я бы не хотел оказаться на месте оператора по свёртыванию с указанным Вами инструментом, когда необходимо проанализировать пару сотен тысяч дублей.
Хотя конечно же, может я там много галочек и кнопочек не нашёл. Не спорю.
В общем каждый сам для себя выбирает, что и как использовать. И да, для обычных форм подобный инструмент я создал в 2010 году)))))
(11)
1) Любые технические работы выполняются когда сервер меньше всего нагружен, чаще всего ночью;
2) По поводу 3х пунктов, просто напросто создается три настройки;
3) Гнать с***ым веником тех людей которые так зас**ли базу;
«В общем каждый сам для себя выбирает, что и как использовать» — полностью согласен)))
А лучше всего, когда такие инструменты использовать не надо)))
(10) Ха-ха. А если сервер 1С в другоми домене и вообще в N км от разработчика? Например на Канарских островах? Для «обычного приложения» нужен толстый клиент — а он на узком канале просто не взлетит.
Плавали, знаем. Просто поместили базу в ЦОД крупного провайдера, но канал оказался не очень — только в тонком клиенте все работает.
P.s. Конфигураторы разрабов — в другом серваке. А на боевом — только главный страшный прог.
(13) Немного не понял что этим хотели сказать или в чём была ирония. Инструмент, предложенный в этой ветке использует средства 1С для передачи информации между сервером и клиентом, поэтому если всё остальное работает, то и инструмент должен справиться со своей задачей.
Или смысл в (13) был про другое? Уточните.
(13) Про RDP и другие удаленки не слыхали…. У нас в организации около 30 своих точек и еще сеть франчази, все на нашей поддержке, разбросаны по всей стране. У большинства интернет через свистки и файловые БД и все работает нормально, а вы тут на ЦОДы жалуетесь….
Пытаюсь свернуть дубли номенклатуры в БП 3.
На закладке «для запроса» при выборе «наименование» для метаданных «номенклатура» странный вариант отбора «<» «>» и т.д. интересно, это что имеется ввиду?
Пытаюсь в этой закладке отобрать для поиска дублей номенклатуру у которой одинаковые единицы измерения, но что-то не получается.
(16) На закладке «для запроса» задаются условия для запроса. Запросом выбирается начальный список который потом анализируется на элемент наличия дублей. Т.е. в этой закладке, например, можно выбрать только элементы без групп (ЭтоГруппа = Ложь ). Больше или меньше, это тоже условия для запроса. Например, если надо исходный список построить по условию «выбрать всех контрагентов у которых минимальное кол-во дней долга 10», тогда условие на этой закладке надо сделать «ДнейДолга > 9».
Описание поиска самих дублей описывается на второй закладке. В Вашем случае я бы сделал так:
На первой закладке запрос обрезал по группам, т.е.
ЭтоГруппа = Ложь
Т.о. будет выбран список состоящий только из элементов и без групп.
На второй закладке «Поиск дублей» добавить тоже только одну строку
ЕдиницаИзмерения Равенство
Т.о. сравниваться номенклатуры будут только по реквизиту ЕдиницаИзмерения.
На третей закладке «Определение правильного» рекомендуется только установить флаг «Поиск ссылок перед отображением дублей».
Т.о. для каждого элемента будут найдены все ссылки, чтобы при автоопределении правильного обработка выбирала правильным тот элемент, у которого больше всего ссылок.
И всё. Если больше условий нет, тогда можно запускать выполнение
(16) Если база очень большая и там много кто работает, то надо «играться» с механизмом нагрузок. Тут чуть позапутаней, но оно того стоит.
Ах да, чтобы скорость не была слишком долгой, то не заставляйте механизм «нырять» сильно часто на клиента, но и слишком редко тоже плохо, т.к. не видно где он там копошится и сколько времени осталось.
информер показывает нечто странное
(19) Добрый день. Немного странно. Подскажите на какой операции это случилось?
Ну собственно на операции свертки дублей номенклатуры. Был установлен фильтр по ВидуНоменклатуры и 2 параметра сравнения: по Артикулу и Наименованию. Собственно, все. Никаких хитрых настроек не делалось. Конфигурация там допиленная УТ11.3.
Номенклатуры в базе много и дублей тоже. Информер дошел до «из них обработано» 20000 — и я прервал обработку.
Забавно еще то, что после этого мне никак не удается запустить в вашей обработке процесс поиска дублей — результат всегда пустой, хотя типовая обработка видит дубли по таким же параметрам.
2 файла — какой качать ? Хоть версию поставьте , что бы было видно какой последний …