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




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

18 Comments

  1. tormozit

    Уникальная разработка в номинацию «Открытие года» или я что то упустил?

    Reply
  2. DrugOn

    (1) tormozit,

    Да нет, не думаю. Хотя эту обработку я писал годами (только для себя). Сейчас же я был вынужден опубликовать её, потому что понадобились SMы «прямочас». У меня (как у человека, стремящегося к лучшему) просьба: если найдете какие-нибудь недоработки или недостатки в обработках — пожалуйста, напишите об этом в комментариях. Особенно это касается обработки для управляемых форм (3.0), которая оттачивалась и тестировалась значительно меньшее время, чем версия для обычных форм.

    Reply
  3. tormozit

    (2) Я писал свой пост в надежде получить информацию о преимуществах этого инструмента по сравнению с десятками уже опубликованных.

    Reply
  4. Интерьер-Маркет

    Добрый день.

    Бухгалтерия 3.0 Бухгалтерия предприятия, редакция 3.0 (3.0.42.54)

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

    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)

    В чем может быть проблема? Спасибо!

    Reply
  5. lopatin

    (4) Интерьер-Маркет, Для подключения через Дополнительные отчеты и обработки, обработки должны писаться специально. Открывайте эту обработку через меню Файл

    Reply
  6. Интерьер-Маркет

    (5) lopatin,

    Вот так открывается через файл (

    Reply
  7. serpent

    Скачали для УФ…

    переменная «Соб» не определена (208,13)

    не порядок

    сли (ЗначениеЗаполнено(ВыбЭл.Код) и ЗначениеЗаполнено(ПредЭл.Код)
    и (Не Соб.ЕстьНеЦифры(СокрЛП(ВыбЭл.Код)))
    и (Не Соб.ЕстьНеЦифры(СокрЛП(ПредЭл.Код)))
    Reply
  8. DrugOn

    Я прошу у всех прощения. Из-за технических проблем никак не мог ответить раньше. Изменил редакцию обработки для УФ до 3.1 (проблема с переменной «соб» решена) Я писал обработку для сильно устаревшей конфигурации тройки (двухгодичной давности). И не было возможности протестировать на современных релизах тройки. Я намерен сделать все, чтоб у всех все работало.

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

    Reply
  9. serpent

    (8)

    За перезагрузку СМ не требует, Запускается, НО… не работает в УНФ.

    Вы позиционируете обработку как

    Конфигурация

    Все для 1C:8

    но не заработало.

    в частности в УНФ у спр Контрагенты нет реквизита «ЮридическоеФизическоеЛицо», а есть «ЮрФизЛицо». тоже и с «ДокументУдостоверяющийЛичность.»

    Исправьте в описании для какой конфигурации сея поделка.

    Reply
  10. DrugOn

    (6) Интерьер-Маркет,

    Я специально для вас скачал установочную версию бухгалтерии 3.0.42.54.

    Версия 3.1 запускается в этой версии конфигурации (в том числе и в интерфейсе «такси», правда только через «Файл»). Перепроверил все функции. Возникли проблемы с переносом ссылок типа «Регистр сведений ключ записи». Исправил в версии 3.2

    Reply
  11. DrugOn

    (9) serpent,

    Исправил в версии 3.3. Сколько найдете ошибок, столько буду исправлять.

    Reply
  12. karpik666

    Данная публикация еще раз доказывает, что людям гораздо проще написать свой велосипед, чем ознакомиться с уже имеющимися разработками. Присоединяюсь к комментарию (1), чем ваша разработка отличается от других, может поиск дублей или замена ссылок проходят гораздо быстрее, замена ссылок производится ли в регистрах, пока все что я вижу, это какая-то урезанная версия стандартного поиска дублей. Если не знаете как воспользоваться поиском, то вот ссылка Поиск дублей, а также разработка автора Tormozit, в которую уже включен более универсальный поиск дублей Инструменты разработчика

    Reply
  13. V.Nikonov

    Если бы в Вашей обработке существовал внятный алгоритм обработки подчиненных объектов… Если бы Ваша обработка корректно расхлёбывала некоторые узкие места (например проблема с Установка цен номенклатуры при замене Номенклатуры)…

    А в таком виде — проблематичный способ зарабатывать Sm!

    Reply
  14. DrugOn

    (13) V.Nikonov,

    Это уже ближе к вменяемой критике. Ваше замечание по поводу «Установок цен номенклатуры» принято к сведению и исправлено (в обоих обработках). Если найдете ещё узкие места — укажите мне их — буду их исправлять.

    По поводу «внятного алгоритма обработки подчиненных объектов» — суть претензии не понятна. Если это возможно, раскройте, пожалуйста её более подробно.

    Reply
  15. tormozit

    (13) Частично эта проблема решена в ИР 3.46

    Reply
  16. Интерьер-Маркет

    Добрый день, сможете выслать файл напрямую, ранее уже оплачивали m. Спасибо! tev2609@mail.ru

    Reply
  17. ssn5810

    отличная обработка (особенно для изменения док. Установка цен), была бы еще супер если

    для номенклатуры ;

    1. находила по не полностью одинаковым наименованиям (возможность выбора)

    2. переносила штрих код удаляемого оставляемому (возможность выбора)

    3. показывала цену (как родителя) выбранных объектов.

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

    спасибо!!!

    Reply
  18. ssn5810

    попробовал на УТ 11.4 не заменяет в документах номенклатуру, на Рознице 2 все норм. ?

    Reply

Leave a Comment

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