Поиск, замена и удаление дублей любого ссылочного элемента (не только справочников)




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

28 Comments

  1. rus128

    Я слабо себе представляю, как обработка ищет дубли ДОКУМЕНТОВ, и не дай бог, чтобы мне это хоть раз понадобилось, но плюсую за идею.

    Reply
  2. DJDUH

    как Вы себе представляете дублъ документа, расчета и тд и тп.? Код уникальный должен быть — не так ли?

    Reply
  3. baa50

    (1) rus128, Спасибо за плюс, может быть всякое например когда в базу назагружали всякого разного (согласен что это экзотические и единичные случаи, но иногда случаются). (2) DJDUH Всякого насмотрелся , при переходе и загрузке из зик в зуп там вы увидете много чего, о чем даже и не догадывались, этой обработкой много чего подправил (например когда было штучек 6-7 практически одинаковых видов расчета)

    Reply
  4. Just

    (3) Так если у меня в базе после переноса несколько, например, северных надбавок, то этой обработкой можно все заменить на одну? Вы сами пробовали это проверить ?

    Reply
  5. baa50

    (4) Just, У вас несколько видов расчета, северная надбавка? да заменяет, может только возникнуть проблема когда эти виды расчета участвует в базе других и при замене они двоятся чего быть не может, тогда ругнется и не удалит, я поступал следующим образом менял метил на удаление и в 3-4 видах убирал дубли и замечательно все пашет.

    Reply
  6. staspdb

    Эта обработка будет работать под УТ 11 редакции ?

    Reply
  7. baa50

    (6) staspdb, данная обработка для обычного приложения для управляемых форм не было необходимости, если вам дубли справочников то на это есть стандартная обработка, если что-то еще то можно попробовать запустившись в обычном режиме, если жалко маней на пробу скажите мыло вышлю так

    Reply
  8. gull22

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

    Reply
  9. cargobird

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

    Reply
  10. psixo666

    Добрый день! Задвоился план счетов, конфигурация Бухгалтерия 3.0, под обычном режимом поможет, если пройтись по дублям счетов?

    Reply
  11. baa50

    (10) psixo666, на бухгалтерии не проверял, на зуп 3,0 отработало нормально, попробуйте если не получится мани верну

    Reply
  12. Serg_KSV

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

    Reply
  13. baa50

    (12) Serg_KSV, уточните пожалуйста конфу, релиз, вид док

    Reply
  14. Serg_KSV

    (13) baa50

    УПП 1.3.62.1 + Бит-Финанс 3.0, платформа 8.2.19.76

    Документ — отражение ЗП в регламентированном учете.

    Думаю, что релиз и конфа тут ни при чем.

    И еще сразу ошибку выдает если реквизит поиска код:

    {Форма.Форма.Форма(2115)}: Поле объекта не обнаружено (ТипКода)

    Если Метаданные[ТипДанныхДляПоиска][мВидОбрабатываемогоСправочника].ТипКода = Метаданные.СвойстваОбъектов.ТипКодаСправочника.Число Тогда

    но потом отрабатывает, но как я и писал — не полноценно.

    Я справился сам — допилил старую еще обработку Поиск и Замена значений — чтобы менял данные в режиме ОбменДанными.Загрузка()=Истина.

    Reply
  15. maxon

    Спасибо огромное!!! 🙂 обработка просто спасла меня :)))

    Reply
  16. alla1978

    Подскажите работает эта обработка в 1С 8.3

    Reply
  17. baa50

    (17) alla1978, в (7) ответ на ваш вопрос

    Reply
  18. Iggo

    И еще когда пишу комент с этой страницы проходит http://infostart.ru/public/286167/#comm

    А если осюда http://forum.infostart.ru/forum24/topic111487/message1554168/#postform то появляется надпись У Вас недостаточно прав для добавления сообщения в этой теме.

    Reply
  19. Iggo

    Задам еще раз вопрос по ходу удалили коменты до этого.

    Кто то пробовал эту обработку в 3.0? 8.3. в режиме управляемого приложения?

    Не могу написать в личку появляется надпись EMPTY_UID что это не понятно.

    Reply
  20. Iggo

    Короче купил. Не работает в 3.0

    Reply
  21. baa50

    (23) Iggo, Добрый день данный вопрос поднимался ранее (7) И вопрос что вы имели ввиду когда говорили что Купил? Вы не скачивали данную обработку

    Reply
  22. maxon

    (17) Да работает.

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

    Склеивание дублей в плане счетов — будет работать и в УФ, но из под толстого клиента. Причесывал ею БП 3.0.58 (это подправленная старая обработка склеивания план счетов и ПВХ)

    — на сегодняшний день единственная обработка по склеиванию предопределенных дублей в плане счетов

    (если кто найдет другой механизм — размещайте ссылки)

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

    По сути просто поправил — пару мест (возле исправлений стоит комментарий: //KKY)

    — Отработает и удалит только те дубли где нет ссылок «на одном из».

    — в тандеме использовал обработку «поиск и замена значений (с перепроведением док.)

    Автору спасибо за удобный механизм и до сих пор актуальный.

    Reply
  25. veraspb

    (7) Для управляемых форм не подойдет? Оч нужна. Может посоветуете подобный механизм?

    Reply
  26. veraspb

    (22) Та же потребность?

    Reply
  27. antont

    (27) Спасибо! Пригодилось.

    Reply
  28. victor_k

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

    Reply

Leave a Comment

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