Защита от повторений номенклатуры при сохранении




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

51 Comments

  1. Арчибальд

    Не вдаваясь в подробности, заявляю: это есть хорошо.

    Reply
  2. MRAK

    Ставлю авансом

    Reply
  3. MRAK

    походу, рано плюсанул. уже минут 20 ищет дубли, номенклатуры всего около 20 тыс

    Reply
  4. anbxp

    (0) Хорошо. Остается приделать любой вид справочника и возможность выбора элемента в документ прямо из обработки

    Reply
  5. MRAK

    + так и убил процесс, не дождавшись…

    Reply
  6. MRAK

    платформа 8.1, УТ 10.2, доработанная

    Reply
  7. anbxp

    (0) Косячок. В обработке Таб.НоваяКолонка(«Эл»,»Справочник.Контрагенты»); Соответственно, элемент не открывается. Переделал на Таб.НоваяКолонка(«Эл»,»Справочник»);

    Reply
  8. JohnyDeath

    В этих делах самое удачное (а главное быстрое) решение — это ВК StrMatch.dll

    Сам её использовал здесь: http://infostart.ru/projects/1915/ У чебура по-моему что-то было на эту тему.

    Отмазка «у меня без ВК» — не катит ;)))

    Reply
  9. O-Planet

    (3) 20 тыс можно победить, знаю как

    (7) Реально, косячок ) Сейчас исправлю.

    (8) Согласен. Но у меня без ВК 🙂 Собственно, и ставил целью сделать без ВК

    Reply
  10. O-Planet

    (4) Любой вид справочника — не сложно. Сперва так и хотел. Но потом подумал, а что нужно защищать от повторений, кроме номенклатуры и контрагентов?

    Reply
  11. anbxp

    (10) Да я уже переделал:) Какой справочник хочешь проверить, в том и вызываешь обработку

    Reply
  12. gutentag

    Ошибка в Бухгалтерия предприятия, редакция 1.6 (1.6.15.6)

    {Форма.Форма(62)}: Ошибка при вызове метода контекста (Закрыть): Операция не доступна для не открытой формы

    ЭтаФорма.Закрыть();

    по причине:

    Операция не доступна для не открытой формы

    Reply
  13. O-Planet

    (12) Исправил.

    Reply
  14. gutentag

    (13) обработка поработала-поработала и закрылась…. Это правильно?

    Reply
  15. O-Planet

    (14) значит, не нашла ничего. а правильно или нет — не знаю. как правильно?

    Reply
  16. gutentag

    (15) вот на десятом счете несколько похожих ТМЦ болтаются, и никто не обнаружен:

    Папка скоросш-ль, А4, прзрачный верхний лист синий

    Папка скоросш-ль, А4, прзрачный верхний лист черны

    Папка скоросш-ль, А4, прзрачный верхний лист серый

    Папка скоросш-ль, А4, прзрачный верхний лист красн

    Ручка шариковая «PILOT» красная

    Ручка шариковая «PILOT» синяя

    Ручка шариковая «PILOT» черная

    Ручка шариковая «PILOT» зеленая

    —————

    РЕЗЮМЕ: наверное я не в ту сторону обработку запустил 😉

    Reply
  17. O-Planet

    (16) Проверил. Все — ок. наверное, не в ту. Читай

    Reply
  18. O-Planet

    … комментарии к установке.

    Что я делаю:

    1. Добавил в справочник «Папка скоросш-ль, А4, прзрачный верхний лист синий»

    2. Добавляю «Папка скоросш-ль, А4, прзрачный верхний лист серый»

    Открывается проверка. Проверяю. Находит.

    Reply
  19. gutentag

    (18) > … комментарии к установке.

    А почему нельзя сделать просто как «внешнюю обработку» или «внешнюю печатную форму» к справочнику ? …Подключил — и — проверяй!

    —-

    Увы, я бухгалтер, а не программер :-/

    Reply
  20. O-Planet

    (19) Это будет уже другая задача. Можно и такую. А бухгалтерам написал: «автор готов оказать помощь в интеграции этих проверок в вашу конфигурацию» 😉

    Reply
  21. Olyunchik

    (20) Очень надо… А то даже качать не стала, потому что не знаю как ее применить… А дубликатов в базе много не то слово…

    Reply
  22. Olyunchik

    У меня 7.7…

    Reply
  23. CheBurator
  24. CheBurator

    (21) Олюнчик, у меня сейчас проходит обкатку на номенклатуре порядка в 30 тыс наименований побработка поиска дублей… скоро будет выложена…

    Reply
  25. O-Planet

    (24) Не тронь Олюнчика, развратник! Девушка хочет ездить на мерсе (т.е. работать с моей обработкой) а не на запорожце 🙂

    Reply
  26. O-Planet

    (21) Кстати, Olyunchik, отписался в личку еще вчера.

    Reply
  27. CheBurator

    (25) Ваш мерс (на самом деле китайской сборки) — жрет кучу бензина и наработка на отказ у него маленькая, а мой — ездиет реально везде! 😉

    Reply
  28. O-Planet

    (27) Ы… Вот и будет повод померяться пиписками )) Только в своем мерсе ударю кувалдой кое-где. Я ведь выложил версию для широкого использования, но ее можно сделать более быстрой при несложной доработке.

    Reply
  29. AXoxol

    Порадовала терминология в коде относительно символов «мусора» 🙂

    Reply
  30. Арсенал

    еще не пробовал но как попробую свое мнение напишу 😉

    Reply
  31. O-Planet

    По просьбе гутентага сделал групповую обработку справочника номенклатуры. Алгоритм сравнения оптимизировал для групповой обработки: http://infostart.ru/projects/4964/

    Reply
  32. Martin74

    Да у нас и 100 тыс. летает

    Reply
  33. CheBurator

    (32) не принципиально… для 100 тыс будет у меня просто увеличение предстатрового интервала времени (если все штатными методами)

    Reply
  34. larisab

    (34) Плюсану за тебя.

    Reply
  35. larisab

    + (34) И тебе 🙂

    Reply
  36. Altair777

    (34) Раньше надо было думать. Когда ботов заводили.

    Reply
  37. Evgeniy

    Очень медленно работает поиск:(

    Reply
  38. O-Planet

    (38) Медленно в текущей реализации. При небольшом изменении в конфигурации метод можно ускорить в десятки раз. Если интересно — пишите в личку.

    Reply
  39. BabySG

    Хм…. А какова производительность на 500+ тыс элементах?

    Reply
  40. specialist.1c

    Такая обработка есть в сервисе типовых конфигураций!!!

    Reply
  41. O-Planet

    (41) Такой нету. В 77 нет никакой.

    Reply
  42. _Xelon_

    Да уж. Ну очень медленно работает. Без оптимизации не обойтись. Скорее всего нужно хранить нормализованное наименование в справочнике и выборку, возможно, делать запросом.

    Reply
  43. _Xelon_

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

    Reply
  44. O-Planet

    (43) Нет, не в справочнике. Версия, которую ставил клиентам по запросу, формирует список значений при открытии конфы, и в нем хранит. Это дает прирост скорости в десятки раз.

    Reply
  45. anbxp

    (45) И, если справочник 100 тыс. наименований…

    Reply
  46. O-Planet

    (46) Да. Но здесь, конечно, скорости не достаточно. проверку нужно делать не средствами языка, а ВК.

    Reply
  47. _Xelon_

    (45) А если какой-то элемент номенклатуры был переименован? Нужно отслеживать и обновлять список значений. Почему не сделать это хранимым реквизитом справочника. Это и ускорит запуск 1С, и поиск элементов.

    Reply
  48. O-Planet

    (48) Потому что работа с объектом в базе данных — медленнее, чем работа с объектом в памяти.

    Reply
  49. abwgd

    хорошая штучка, полезная

    Reply
  50. andervers2005

    Обработка хорошая, добавил в конфигурацию. Все запускается, ищет!

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

    Reply
  51. nexochyka

    Судя по дате обновления, ошибки и недочеты в производительности были устранены или я ошибаюсь?

    Reply

Leave a Comment

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