Adaptersoft : RefKillRepeat




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

16 Comments

  1. adapter

    Просьба вопросы задавать здесь

    http://www.adaptersoft.ru/index.php?name=Forums&file=viewforum&f=1

    Reply
  2. maljaev

    Делал как-то давно подобное, библиотечка к 1С есть для поиска фонетически похожих фраз. Если это аналогичная вещь, то наверняка полезная, в случае если предоставляет пользователю право выбора. Хочу сказать что невозможность ведения учета ТМЦ по методике, отличной от средневзвешенных цен, в типовой бухгалтерии 7.7 — это не аксиома, а недочет 1С, поэтому некоторые решают этот вопрос ведением учета в ТиС и выгрузкой проводок в БУ, некоторые дорабатывают типовую конфигурацию, а те кому бабла на то и другое жалко а работать ИНАЧЕ позарез нужно — вводят дубликаты ТМЦ с разными ценами и отслеживают движения по ним вручную.

    Reply
  3. ibm2007

    Вроде не 1 апреля ???

    Reply
  4. a.kuznetsov

    Че за хз…, а где «Алгоритм нечеткого поиска ищет по вероятности совпадения слов» 🙁

    Reply
  5. Abadonna

    RefKillRepeat6.ert, а сохраняться собирается NewReport41Basic.zip

    Стрелы попутал?

    Reply
  6. JohnyDeath

    угу, либо автор промохнулся и перезалил сюда «Новейший отчет», либо на сайте глюки

    Reply
  7. ssn1978

    Пошел по ссылке, нашел сабж, запустил на справочнике контрагентов, уже отработано 13%, сделано добротно, результаты дает, ставлю ПЛЮС

    Reply
  8. adapter

    нда, сорри, попутался. Ну уже перезалил. И вообще лучше вегда качать с моего сайта, там и версии новые будут и обсуждение.

    Reply
  9. chev

    Не плохо. Мне понравился. Ставлю «плюс»

    Reply
  10. Fisherru

    Работаем с номенклатурой, порядка 3500 элементов

    монопольно на локальной машине

    показала, что нужно 20 млн операций

    2% за более чем 3 часа работы

    Комп intel Core™2 CPU

    6420 @ 2.13 GHz

    2/13 ГГц, 1 GB ОЗУ

    Это нормально?

    Коэффициент похожести 0.9

    шаг поиска 3

    Это она мне почти неделю круглосуточно 3,5 тыс номенклатуры будет обрабатывать?

    а в другой базе более 40 тыс — это 2,5 месяца?

    а оно точно надо?

    Reply
  11. adapter

    ну а куда деваться? Ты справку читал? на закладке «результат» кнопка есть.

    Reply
  12. adapter

    хотя может ты накосяковал чего ? 3,5 тыр. эл-в это 12 лимонов с копейками, а не 20

    Reply
  13. adapter

    посмотри за одно на производительность своего сервака. анализируй счетчики загрузки оперативки, свопа, проца, очередь записи на винт. Можешь узкие места увидишь. Про производительность вообще отдельная песня. Семерка втрой проц не ест например. Если хочешь чтобы оба лопатили, то скул юзать надо ну и т.д. В общем кодом уже быстрее ничего не сделаешь, я на оптимизацию и так много времени потратил, код вылизал. Раза в два быстрее от первых версий стало. Дальше тока админ. и организационными средствами рулить надо

    Reply
  14. Fisherru

    Работаю монопольно на локальной машине

    справочник номенклатура, при нажатии на кнопку [кол.элементов] показал 3958 элементов

    при нажатии на кнопку [Новый поиск] изменил цифру количества элементов на 3197

    и написал «надо выполнить операций» 10 220 809

    удивительно

    копия базы и справочник, те же, что и 10-го числа, а цифры другие, там точно 20 лимонов было…

    Reply
  15. adapter

    справку читал? там два режима — новый поиск и продолжение по старому состоянию справочника. Может причина в этом?

    Reply
  16. uriy

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

    //добавим в список сохр. сост. поиска

    Если сзСохрСостояния.Принадлежит(гВыбСпр)=0 Тогда

    сзСохрСостояния.ДобавитьЗначение(гВыбСпр);

    КонецЕсли;

    Для сч1=м по колЭл цикл

    // добавил текст

    Если сч1+22> КолЭл Тогда // здесь если дубликаты встечаются рядом на 21 позицию

    н=КолЭл;

    Иначе

    н=сч1+22;

    КонецЕсли;

    Для сч2=сч1+1 по н цикл // а здесь убран бессмысленный повторный поиск

    и теперь вместо нескольких суток ишет не более двух часов.

    Reply

Leave a Comment

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