Загрузка классификатора банков РФ ускоренная




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

11 Comments

  1. seermak

    http://infostart.ru/public/248275/ = для общего развития)))))

    Reply
  2. Теософ

    (1) seermak, спасибо! Пока непонятно всё равно, как совместить идею вычленить круг именно тех банков, с которыми работает организация, и по которым актуализация является задачей перманентной, непреходящей и неизбывной. Как вариант, я вижу при переходе к основному окну обработки видеть уже раскрытыми и помеченными те банки тех регионов, которые в последний раз обновлялись. Тогда участие пользователя сводится лишь к тому, чтобы только пробежаться глазами и уяснить, что всё на своих местах, всё нужное помечено, поэтому пользователь просто жмёт «далее» и получает желаемое очень и очень быстро! В идеале настройки конкретного пользователя, пользующегося обработкой, должны сохраняться. Ведь может быть и так в организации, что круг банков, требующих актуализации, за разными пользователями может быть закреплён свой, персональный…

    Reply
  3. seermak

    (2) ну, если Вам понравилось — флаг в руки — обработка бесплатна и открыта = мой гонорар — посмотреть измененную)))))

    Reply
  4. xten

    Заголовок «Загрузка классификатора банков РФ ускоренная», но похоже все-таки на загрузку Классификатора адресов. Дилемма)

    Reply
  5. Теософ

    (4) xten, спасибо за комментарий. Я не вижу здесь дилеммы. В своей организации я делал обработку, одновременно ставя цель проинформировать сообщество пользователей программы 1С в том, где находятся актуальные КЛАДР (работает аналогичная «выкачивалка» на WGET), ОКОФ и ЕНАОФ. Поэтому в описании к обработке я и написал «Не забываем поправить текст, который будет читать пользователь при запуске обработки!». Доска информации пользователей программы 1С сделана с целью информировать пользователей о значимых событиях с точки зрения того, кто присматривает за 1С. Опять же обратите внимание, что доска информации пользователей программы 1С имеет полный смысл лишь тогда, когда обработка стоит на старте программы (эффективность достигает 100%), потому что тогда она начинает играть роль некоего дайджеста от лица администратора, который позаботился о том, чтобы «содрать рекламу» от 1С, а вместо неё дать действительно полезную информацию о том, где что лежит, откуда что брать… Не секрет же, что за долгое время пользования 1С начинает вырабатываться негативное отношение к программе из-за проводимой 1С политикой впихнуть в юзверя побольше рекламы. Поэтому, на мой взгляд, такой подход к старту 1С, когда, повторюсь, «сдирается реклама», а вместо рекламы подается полезная информация, усиливает полярность отношения к работе на положительное и настраивает пользователей на деловой лад… Вот кто бы помог мне сделать автоматическое выкачивание актуального ОКОФ и ЕНАОФ! До сих пор не знаю, как это сделать! До сих пор руками выковыриваю из обновлений релизов!

    Reply
  6. seermak

    (4)http://1c-setup.ru/stati-1s/48-zagruzka-okof-v-1s-bukhgalteriya-8.html

    посмотри может поможет

    Reply
  7. Теософ

    (6) seermak, целью обработки ставилось максимально приблизить к пользователю справочники, чтобы сократить время на их поиск и актуализацию. Соответственно главной задачей на каждом шагу вырисовывается автоматизация того, что ещё не сделано, но всё ещё остаётся возможным сделать(см. самое начало описания — «несовершенство того, что уже есть»). За ссылку всё равно спасибо — освежить в памяти то, как это уже есть, нелишне, но, повторяюсь, конечной целью является заставить делать компьютеры всё то, что всё ещё делает человек, хотя множество операций — это постоянное повторение одних и тех же операций с той лишь разницей, что очередное обновление от 1С «упало» в папку с новым именем. Фокус должен заключаться в том, чтобы «выудить» из автоматически выкачиваемого очередного обновления два файлика (речь ведём про ОКОФ и ЕНАОФ) и скопировать их в папку с именем, отражающую номер релиза и дату скачивания. И пусть, например, такая история сохраняется на протяжении 10 последних классификаторов, а при скачивании 11-го пусть скачанный 1-ым удаляется или помещается в специальный долгосрочный архив. Пользователь же на доске информации будет видеть путь к папке, хранящей все эти 10 последних классификаторов, чтобы самому решить, что ему больше подходит — ведь ситуации бывают очень и очень разные! Это попытка, если хотите, разграничить-таки круг обязанностей между теми, кто отвечает за работоспособность, а кто за наполнение программы! И чтобы опять же эти два должностных лица на фирме как можно реже пересекались между собой в попытках выяснить, кто кому и чего должен, потому что, опять же повторюсь, есть «памятка» при открытии программы, которая наглядно разъясняет, где и что СВЕЖЕЕ лежит! Я понятно объясняю задумку?

    Reply
  8. zelevova

    А зачем загрузку банков доверять пользователям?

    Я гружу все банки. Места не много занимают, а поиск в любом случае по БИКу идет и наличие «лишних» банков не мешает.

    и по хорошему все это грузить фоновым заданием. Зачем пользователям информация о работе с классификатором банков, когда им нужна информация о самих банках?

    Я соглашусь еще что КЛАДР не всех регионов в базе нужен. Он большой и долго грузится.

    Reply
  9. Теософ

    (8) zelevova, спасибо за комментарий. Вы демонстрируете иной подход к вопросу. Это выходит за рамки обсуждения моего случая, когда всё же для экономии не грузят лишнюю информацию по банкам в базу с 1С. А потом не забывайте про всякого рода сложные случаи, когда, например, нужно оставить банк со старыми реквизитами (опять же как пример, банк тогда выносят в отдельную папку перед обновлением), но в то же время нужен банк и с новыми реквизитами… Имхо чтобы не плодить таким огульным, как Вы предложили, подходом среди пользователей программы тех, кому, скажем, сегодня, после обновления банков, перестало хватать банков с нужными реквизитами, потому что они затёрлись новыми, из классификаторов, предлагается всё же воспользоваться более щадящим методом, когда пользователь сам решает, что и как обновлять. И потом, если Вы исполняете админские функции, то не надо по моему глубокому убеждению баловать пользователей таким подходом, как у Вас! В один «прекрасный» момент можете неожиданно для себя стать фигурантом поговорки «хотел как лучше, а получилось, как всегда!». Фоновые задания от 1С — это вообще отдельная тема для разговора. Могу только сказать, что иногда они настолько нарушают работу сервера, что приходится от них просто-напросто отказываться. Лучшим решением всё равно остаются собственные средства планирования, заложенные в операционной системе. Поэтому опять же всегда останется обширный круг пользователей, которые сами решают, какие из банков им подгружать, а какие нет. Именно для такого круга пользователей и замышлялась моя обработка. Ну, про КЛАДР Вы и сами уже всё понимаете хорошо, мне абсолютно тут нечего добавить 🙂

    Reply
  10. LexSeIch

    Мир этому дому!

    Увидел в описании камушек в свой огород — не мог не ответить. Во первых, я не нашел в комментариях к своей обработке, на которую Вы ссылаетесь, обращения о помощи, поэтому был не в курсе о Ваших проблем в поиске так называемых ошибок в скрипте. Идея заимствованная мной из обсуждения — прозрачная, скипт на AutoIT, простейший и его код полностью приведен в статье — даже не надо было скачивать. Из всех скачавших — никто не обращался с какими то вопросами по обработке. Просто Вам необходимо корректно обращаться за помощью и Вам никто не откажет. Или разбираться самому, но в этом случае уповать на собственные силы и не обвинять голословно, что Вам отказали в помощи. Удачи в скриптописании…

    Reply
  11. Теософ

    (10) LexSeIch, Я Вам ответил в личку. Приношу извинения за допущенную в описании двусмысленность. Понимаю, что в наше время более привычным стало, когда пытаются запустить камень в соседа или украсть его добро. У Вас остались вопросы ко мне?

    Reply

Leave a Comment

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