Пересчет итогов по регистрам по расписанию. 8.3




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

10 Comments

  1. DitriX

    а почему это хорошо? И почему модераторы пропускают вообще подобные штуки?

    Вы понимаете что выполняя это — вы делаете очень плохо, и в первую очередь — для СУБД? Это же выстрел себе прямо в ногу 🙂

    Скройте лучше публикацию пока не поздно и не набежали знающие люди и не влепили минусов.

    А сами пока почитайте это https://infostart.ru/public/177171/

    Reply
  2. Dnki

    (1) Вот набросился! Влепил бы минус ответу, если бы мог.

    1. «модераторы пропускают подобные штуки» — потому что публикация не содержит матюков и проч. Следовательно рассуждать что такое «хорошо» и что такое «плохо» — удел публики.

    2. Обработка наверняка использует штатные команды 1С. Следовательно, большого зла не натворит. Советы делать некоторые операции ср-ми СУБД более ответственны.

    3. Споры про пересчет ведутся давно. И я не пытаюсь в них вступать. но у меня реальный был случай, когда пересчет ускорил работу отчета в 2 раза. А для чего-то придумала пересчет именно 1С . Только посоветовал бы не делать это слишком часто. В упомянутой статье много написано про фрагментацию.

    Reply
  3. igoSolo

    (1)

    А сами пока почитайте это https://infostart.ru/public/177171/

    Спасибо за статью, но в ней же статье написано:

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

    В статье описаны как положительные стороны так и отрицательные…

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

    Если у вас есть инфа о том что это

    очень плохо

    для начала сообщите об этом в 1С, пока

    не набежали знающие люди и не влепили минусов

    на партнерском форуме…

    Reply
  4. DitriX

    (2)

    1. Та понимаю, но от этогоне легче 🙂

    2. Не штатные команды, а служебный функционал. Т.е. если человек понимает — что делает, он и сам напишет 5 строк кода, а если не понимает — то можно еще и навредить.

    3. Споры о чем? Споры — это когда нет официальной документации, и результаты исследований дают разные ответы. Вот тогда и рождаются споры. А в вашем случае — все уже давно исследовано.

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

    Но вы просто выкинули обработку со стандартным функционалом, как вы выразились. Зачем?

    Если бы это было панацеей — то 1С бы сами добавили регламенты в конфу, и всем было бы счастье, разве нет? Но они этого не сделали, вы задавались вопросом — почему?

    Плюс — в метаданных обработка называется — «… регистров накопления», в статье написано, что работае и с бухгалтерскими, а еще ниже написано, что тестировалось на УТ11, где нет бух. регистров. Шта?

    З.Ы. Не принимайте близко к сердцу, просто хочется видеть более качественный контент, в слудущий раз — напишите мне в личку, я попробую вам помочь оформить хорошую и полезную статью, или остановлю вас от траты времени впустую 🙂 Это не сарказм.

    Reply
  5. DitriX

    (3) но ниже написано, что после этого надо делать перерасчет индексов, что как бы логично, а у вас я этого не увидел, и если у меня стоит постгря — мне этот код может очень сильно снизить производительность.

    Почитайте вот этот комментарий:

    http://forum.infostart.ru/forum86/topic81618/message1560967/#message1560967

    Т.е. из всей трагедии — вы опиали только один пункт, который помог — только вам, только в одной системе, и только для построения отчета.

    а насколько просела запись, например?

    Почитайте ветку целиком, включая камменты, и тогда вы познаете дзен 🙂

    Reply
  6. igoSolo

    (4)

    Не штатные команды, а служебный функционал.

    Вот именно что штатный. В пользовательский интерфейс кнопка выведена.

    Т.е. если человек понимает — что делает, он и сам напишет 5 строк кода, а если не понимает — то можно еще и навредить.

    Мне понадобилась эта обработка, не нашел ее здесь, сделал, выложил. Может еще кому нужно.

    Споры — это когда нет официальной документации

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

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

    Ну в правилах сайта нет такого. Я вроде не обязан никого посвящать, или я опять что-то пропустил?

    Но вы просто выкинули обработку со стандартным функционалом, как вы выразились. Зачем?

    Автоматизирован запуск в регламенте. Написано же…

    Если бы это было панацеей — то 1С бы сами добавили регламенты в конфу, и всем было бы счастье, разве нет?

    По вашему 1С уже все доделали?

    Но они этого не сделали, вы задавались вопросом — почему?

    Не успели. В некоторых конфигурациях, 1С совместимо, такое регламентное есть.

    Плюс — в метаданных обработка называется — «… регистров накопления», в статье написано, что работае и с бухгалтерскими, а еще ниже написано, что тестировалось на УТ11, где нет бух. регистров. Шта?

    Код написал для обоих видов регистров. тестировал только на УТ. Что это еще может значить?

    Не принимайте близко к сердцу

    Вообще не парюсь.

    в слудущий раз — напишите мне в личку, я попробую вам помочь оформить хорошую и полезную статью, или остановлю вас от траты времени впустую

    Обязательно напишу. Это тоже не сарказм.

    Reply
  7. igoSolo

    (5)

    Т.е. из всей трагедии — вы опиали только один пункт, который помог — только вам, только в одной системе, и только для построения отчета.

    Это не я написал. кому-то еще помогло)

    Я про свои проблемы которые решил при помощи этой обработки не написал вообще….

    Reply
  8. igoSolo

    (5)

    Почитайте ветку целиком, включая камменты, и тогда вы познаете дзен 🙂

    Спасибо, обязательно почитаю.

    Reply
  9. Dnki

    (4)

    Не принимайте близко к сердцу

    А что поделаешь — оно у меня большое и доброе. И потому и заступился за автора статьи.

    Reply
  10. unknown181538

    (4) Ну у меня вот штатная команда «Установка периода рассчитанных итогов», включенная по умолчанию в БП, нарушает напрочь эти самые итоги…

    Reply

Leave a Comment

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