Полезные процедуры по работе с СКД и динамическими списками (часть 3)




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

20 Comments

  1. VmvLer

    Такая подача материала характеризуется очень просто — «в час по чайной ложе».

    Если быть честным до конце, то это просто халтура.

    мое мнение может не совпадать …бла бла бла.

    Reply
  2. json

    (1) Тролли всегда найдут до чего докопаться. Их мнение меня слабо интересует

    Reply
  3. al_zzz

    (1) Сказал человек, имеющий нулевой вклад в сообщество…

    Reply
  4. oleg-x

    (1) Верну тебе один минус, но все же. Может и по чайной ложке, но из таких маленьких статей, потом можно собрать всю необходимую информации. Если сделать конкретный запрос, получишь ссылку на статью (если она есть) с конкретным ответом. И не придется листать огромную статью, в поисках нужного материала.

    А если модераторы пропустили статью, значит какое то право на жизнь она имеет.

    Reply
  5. triviumfan

    Ребят, это же все есть в БСП…

    КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы();
    КомпоновкаДанныхКлиентСервер.ДобавитьОтбор();
    …
    
    Reply
  6. json

    (5) в 2.4?

    В 2.3.5 я такого не нашел

    Reply
  7. mitia.mackarevich

    (7) Плюсану, но «Не нашел как добавить отбор в элемент»????? что же такое творится то !!!

    ОбщегоНазначенияКлиентСервер — живет там не первый год вместе со всем остальным

    по поводу первого — сериализатором XDTО не проще воспользоваться для сохранения настроек и всего прочего — благо все сериализуется? Все равно если реквизит сохранятеся в хранилище настроек форм — там то он хранится в сериализованном виде

    Reply
  8. json

    (5)

    (8)

    Коллеги, позвольте уточнить, что во второй части публикации основная мысль не «как добавить отбор», а «как установить служебный отбор в списке, в котором уже могут присутствовать ручные и служебные отборы». Я этот служебный отбор назвал Предопределенным. Моя идея в том, чтобы собрать их в группу, а группу узнавать по представлению. Тогда служебные отборы будут жить вместе с ручными и мы не удалим лишнего при переключении служебного отбора.

    Подумаю, как лучше сформулировать эту мысль в публикации, чтобы не возникало таких двусмысленностей.

    Reply
  9. json

    (5)

    Немного неточно сформулировал мой вопрос.

    Я не могу найти модуль КомпоновкаДанныхКлиентСервер и метод СкопироватьЭлементы().

    Установил ещё БСП 3, но не оказалось на компе платформы 12. Чуть позже поковыряюсь. Интересно что там нового появилось.

    Спасибо за комментарий. Возможно действительно велосипед, но я ее писал полтора года назад, когда ещё не было новых БСП

    Reply
  10. json

    (8) настройки динамических списков не сохраняются. Нет там галочки Сохранение, посмотрите повнимательнее.

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

    И кстати, предложенная мною функция копирует не только отборы, а любые элементы настроек. Отборы приведены в качестве примера

    Reply
  11. json

    (12)

    эта идея — велик, причем устаревшей модели

    это вы как обычно троллите?

    Или сможете привести доказательство, что вы это уже где-нибудь встречали?

    А можно использовать мозг по назначению — изучить общие модули и всегда быть на коне

    полученных знаний.

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

    Reply
  12. json

    (14) если бы могли, то сделали.

    А если не хотите тратить свое время — то что вы тут комментируете тогда.

    Дело не во времени, а в том, что вы сначала написали, а потом не можете подтвердить свои слова. Так делают обычные балаболы

    Reply
  13. VmvLer

    (15) «лечить» наивность труд неблагодарный, вы должны сами все найти и усвоить, тогда будет толк. Лучший способ это сделать — балаболить.

    «хотите про это поговорить?»
    Reply
  14. json

    (16) спасибо за ваши советы, о великий разработчик, зарегестрированный 1,5 года назад даже без аватара.

    Буду счастлив, если вы избавите меня от своих комментариев

    Reply
  15. VmvLer

    (17) это ж хорошо, если мои слова делают вас счастливее, а ум пытливым

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

    Reply
  16. json

    (18)

    а дело не в личности, а в вашей компетенции.

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

    С любого конкретного вопроса вы съезжаете. Типа нет времени или еще какая причина.

    Но зато грязь подливаете вы охотно, причем не только в мою публикацию

    Reply
  17. mitia.mackarevich

    (11)

    ) настройки динамических списков не сохраняются.

    Я про реквизиты формы в целом писал — предварительная сериализация проходит, как еще они иначе храняться=)

    Reply
  18. json

    (20)

    да, прошу прощения, неправильно понял. С телефона читал.

    Reply
  19. triviumfan
    Reply
  20. json

    (22) выглядит солидно.

    Спасибо большое, чуть позже поразбираюсь.

    Возможно вы правы, и велосипед имеет место быть))

    Reply

Leave a Comment

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