Универсальный поиск и замена дублирующихся элементов справочников (управляемое и обычное приложение)




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

47 Comments

  1. ekaterinaeon

    Спасибо! как раз понадобилась такая обработка в управляемом)

    Reply
  2. NOVOHUDONOSO

    Спасибо. Выручил.

    Reply
  3. Saifa

    Очень пригодилась, спасибо!

    Reply
  4. AltF1
    Это доработанная стандартная обработка с Диска ИТС «Поиск и замена дублирующихся элементов справочников» (далее Обработка) с возможностью работы в управляемом приложении.

    Поиск на картинке виден, а где замена?

    Reply
  5. CeHbKA

    Спасибо! 🙂

    Reply
  6. Ionmuerto

    Данная обработка Поиск и замена дублирующихся элементов справочников подходит под управляемые формы 1с Управление Торговлей 11.1?

    Reply
  7. sanymust

    Доброе время суток, попытался поспользоваться обработкой в РК ЖКХ 3.0 (аналог БП 3.0) открылась управляемая форма без возможости выбора объектов и реквизитов. Глянул внутри, там нет кнопок выбора и нет обработок перед началом выбора, только обработка выбранного значения. Каким образом можно исправить? Запускаюсь под управляемым приложением с полными правами.

    Reply
  8. sanymust

    (10) разобрался, было отключено свойство редактирования текста в поле

    Reply
  9. Alex

    Спасибо. Но как вручную добавить объекты на замену? Если они ни чем не похожи?

    Reply
  10. lartnec

    Обработка не работает с Управление торговлей 11.1.4.10

    Reply
  11. 1CService

    Управление торговлей 11.1.4.10 — обработка не работает. Пишет: «На элементы есть ссылки.» и замена не происходит.

    Reply
  12. lartnec

    (16) baa50, И эта обработка не работает с УТ 11.1.4.10… Выходит пустая форма, в которой доступно поле «все действия» — изменить форму и F1

    Reply
  13. 1CService

    (16) baa50, работает аналогично типовой обработке.

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

    Решение ситуации:

    — удаление помеченных объектов (запуск обработки через все функции)

    — пере проведение документов где есть ссылки (в моем случае это документы ввод начальных остатков)

    После этого работает!

    Reply
  14. RoL$

    1С:Предприятие 8.3 (8.3.4.437) Розница, редакция 2.0 (2.0.8.12).(версия для 1с 8.3) Не ищет по похожим словам номенклатуры. Нажимаю кнопку найти… Будем искать долго? ОК, ни что не происходит.

    Reply
  15. Solo1

    Нужна была для поиска для замены дублей номенклатуры, а по полному наименованию не ищет, вариант для поиска — только по похожим словам. Без этого, к сожалению, бесполезна для данной задачи в моих условиях. Чтож никто написать подобную не может?

    Reply
  16. rosinfoteh

    НЕ РАБОТАЕТ ПОД — По похожим словам!!!!!

    Reply
  17. baa50

    (23) rosinfoteh, попробуйте поэкспериментировать с ползунком на один шаг вправо и сделайте поиск

    Reply
  18. rosinfoteh

    (24) baa50, пробовал. не тот случий((

    Reply
  19. rosinfoteh

    (24) baa50, вы прикрасно должны понимать…что если ползунок поставить на максимум…он хоть должен думать…а он вообще не реагирует…

    Reply
  20. Ламия

    даа, хотела скачать, а тут такие коменты, задумалась, тратить ли бабло….

    Reply
  21. dmitryburykin

    1с БП 3.0 (8.3 упр. приложение)

    Для чего качал: Наименование договора для каждого контрагента уникально, однако по одному контрагенту есть несколько договоров с одним и тем же наименованием и др. параметрами.

    Поиск по наименованию Договора и отборам Вид договора и вхождению в группу Контрагентов работает, удаление нет.

    При нажатии «Замена во всех группах» выдает ошибку «Индекс находится за границами массива».

    Верните деньги.

    Reply
  22. rfcor

    (28) Кстати да, на номенклатуре тоже выдает ошибку об индексе за пределами массива.

    Reply
  23. feel_deep

    (14) 1С43, попробуйте снять галку «Выполнять все замены в одной транзакции»

    Reply
  24. Willforre

    не работает по отбору «содержит» — для меня бесполезна.

    Верните деньги.

    Reply
  25. Saengmyung

    У меня есть аналогичная, тоже хорошо работает. Так что советую.

    Reply
  26. PinchukVera

    Спасибо, за обработку. Помогло!

    Reply
  27. mrmasson

    не работает в управляемом приложении!

    Вообще не заполняется список справочников. Скачал обе версии, у обеих одно и то же!

    Разработчик верни деньги!!!

    Reply
  28. camel

    Не нашёл там:

    а как поиск штрих-кодов осуществить?

    Reply
  29. gull22

    Спасибо за обработку. Но как удалить найденные объекты, когда поиск проводился по похожим реквизитам? В частности не обрабатывать найденную группу или из группы удалить ненежную строку. Явно, мне не надо заменять «Александра Захарова» на «Александра Петрова», но надо оставить замену «Александра Захарова» на «Алесандра З». В штатной обработке 1с «Поиск и замена дублей» в такой ситуации убирал из табличной части ненужные строки, а дальше Автовыбор и удаление. В Вашей обработке не могу удалять из табличной части Объекты

    Reply
  30. AlgoritmS

    В бух 3.0 пытался заменить дублирующие организации. Выдает ошибку «неверное имя колонки».

    из табличной части нельзя удалить необъединяемые элементы, чтобы обойти эту ошибку.

    К сожалению, обработка не помогла.

    Reply
  31. DmitriyKB

    Спасибо, очень пригодилась.

    Reply
  32. fomix

    По первым ощущениям — обработка, то что нужно! Есть волшебная кнопка «Автоопределение правильных», по которой обработка вычисляет объект, который нужно оставить. После замены, дубли помечаются на удаление. Пока тестирую, по результатам доложусь. Спасибо автору!

    Reply
  33. kotlovD

    У меня вылетало с ошибкой индекса, после 899 строки модуля формы вставил следующий код:

    Если НЕ НаборЗаписи.Количество() тогда
    Продолжить;
    КонецЕсли;

    По похожим словам не ищет т.к. не проходит проверку на более чем 1000 обрабатываемых элементов. Автор почему то спрашивает «точно продолжить» и вне зависимости от ответа ставит Возврат… Короче закомментил проверку

    Reply
  34. fomix

    (42) kotlovD, Как это не ищет по похожим словам?! У меня все нашла. Даже сотров в ЗУПе по похожим именам-отчествам нашла. Хотя нужно было только по фамилии. Может с ползунком настройки сходства переборщил… А так вполне рабочая обработка — советую к работе.

    Reply
  35. maksa2005

    Спасибо за обработку.

    Reply
  36. kostik_love

    модуль формы номер строки 1150

    вместо

    Если ТипВопроса = «ОбработкаВопросов» И

    нужно

    Если (ТипВопроса = «ОбработкаВопросов» Или ТипВопроса = «ПоискПоПохожимСловам») И

    в случае если КоличествоЭлементовДляПоиска > 1000 и Пользователь ответил «Да»

    Reply
  37. kostik_love

    так же в обработке убраны 2 очень важные функции: Возможность добавления и удаления строк таблицы значений «НайденныеОбъекты»

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

    Reply
  38. fixin

    Три замечания:

    1. Не работает как-то с последовательностями, ошибка индекса в измерениях, убрал оттуда.

    2. Пометка на удаление вызывается через УстановитьПометкуУдаления, поменял так:

    ОбъектСсылки.ОбменДанными.Загрузка = истина;

    ОбъектСсылки.ПометкаУдаления = истина;

    ОбъектСсылки.Записать();

    3. Режим загрузки по умолчанию включен. Если вызывать замену во всех группах, не открывается окно настроек замены, что есть криво и отдельно его никак не вызвать.

    Чисто практические замечания.

    Так вроде работает.

    Reply
  39. AlgoritmS

    Не работает.

    ПоказатьПредупреждение(Новый <<?>>ОписаниеОповещения(«ОбработкаОповещений»,ЭтаФорма,»ОтсутствиеПрав»),»Для выполнения поиска и замены дублирующихся элементов необходимо наличие роли «»Полные права»» !»);

    Reply
  40. Светлый ум

    +1, Работает в «Рознице 2.1» (Поиск и замена дублирующихся элементов справочников (версия для 1с 8.3)):

    Склеил дублирующихся пользователей.

    Reply
  41. apd1c

    Отличная обработка! Спасибо!

    Reply
  42. dka80

    Обработка отработала на отлично ЗУП 3.1. Спасибо

    Reply
  43. pentanom

    Какая-то недоделанная обработка 🙁

    Под обычным приложением (БП 2.0) вообще не запускается.

    Под управляемым (УТ 11.3) запускается, но в результате поиска контрагентов по ИНН получаем просто список контрагентов с одинаковыми ИНН, а настроить колонки списка, чтобы выбрать «правильный» нет.

    Зря потратил смартмани !!!

    Reply
  44. xurij

    8.3 конфа ДО. При попытке искать по похожим значениям, ничего не происходит, кнопка не реагирует. Думал БСП Переделали

    Но в этой старой, переделанной из ут, в режиме толстого работает поиск похожих

    https://infostart.ru/public/100041/

    Reply
  45. xurij

    Закоментировал часть в модуле формы, где предупреждение типа «вы правда хотите искать похожие значения? Это долго!»

    И все заработало. Понравились окна прогресса текущей стадии разбора похожих слов.

    Спасибо автору доработки

    Reply
  46. xurij

    Да прочитал внимательно, про комментирование уже писали в посте 42. Работает

    Reply
  47. artfa

    модальные вызовы есть в обработке?

    Reply

Leave a Comment

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