Быстрый План-фактный анализ с хитрой программной расшифровкой СКД




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

8 Comments

  1. Xatori111

    Возможно кого то такой отчет и устроит, но есть множество недостатков:

    1. Отчет не различает Полные спецификации и сборочные, следствие некорректные данные, причем практически все (если используются разные виды спецификаций).

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

    3. Некорректно отрабатывает возвратный отход (вообще не увидел что бы где то это обрабатывался).

    4. Ну и позвольте, если отчет называется План фактный Анализ, где сам план кроме непонятных %.

    5. Факт с Планом так же сопоставляется не полностью, нет сопоставления по аналогам.

    6. Нет возможности сравнить разные месяца, т.е. на подобии как в типовом.

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

    P/S Сейчас тоже занимаюсь отчётом такого типа, думал что то стоящее будет.

    Reply
  2. Ulus
    Ну и позвольте, если отчет называется План фактный Анализ, где сам план кроме непонятных %.

    Вы немного перепутали речь не о том. Вы имеете виду Объектно-Календарное планирование (ОКП).

    А отчет это это план факт себестоимости выпуска. Спецификации с фактом затраты сырья. Стандарный отчет во всех типовых конфигурациях. К ОКП никакогоотношения не имеет.

    Нет возможности сравнить разные месяца, т.е. на подобии как в типовом.

    То же же самое. Стандартный отчет в УПП который сверяет план с фактом именно в ОКП. Там есть разные месяца сранивать. Мой же отчет отвечает на вопрос, повторюсь: сколько положили сырья по факту и сколько вы должны были положить по норме(спецификации, рецептуре)

    Далее

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

    Тут согласен. Но смотрите. Факт собирается с регистров берется Количество, то есть это Единица хранения остатков. Ну переведите в единицу хранения остатков КолПродукции в одной временной таблице в запросе СпецификацияВыход.

    Всегда, когда пишется что то, вы кидаете 30% времени/затрат на отладку, как минимум (что то не учли. и.т.п). Про единицы не учел, согласен. просто у нас все спецификации в единицах хранения разнесены.

    Отчет не различает Полные спецификации и сборочные, следствие некорректные данные, причем практически все (если используются разные виды спецификаций).

    Полные спецификации не отрабатываются. Мне надо было описать это в описании отчета.

    Ну и резюме.

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

    И зачем мне делать универсальный, он есть в типовой конфигурации. Конкурировтаьс с ним?

    Я подправлю единицы измерения. И опишу в описании что: не учитывает возвратные отходы и полные спецификации. (опять же возвратные отходы дописать недолго). За эти комментарии спасибо.

    Отчет рабочий. Формируется быстро. Допишите возвратные отходы и поставьте отбор, чтобы анализировал только сборочные спецификации и все ОК.

    Reply
  3. Ulus
    P/S Сейчас тоже занимаюсь отчётом такого типа, думал что то стоящее будет.

    Давайте обсудим что под вашим пониманием «стоящее»

    1) Ед. изм. исправим

    2) Возвратные отходы можно добавить совместными усилиями (это не усложнит запрос)

    Но опять же определитесь что именно вам надо:

    План факт из ОКП или План факт себестоимости выпуска. А то как бы перемешались «и кони и люди»

    Пишите, давайте пообщаемся.

    Reply
  4. Xatori111

    (3) Типовой путается в Возвратных отходах, некорректно показывает плановые данные при условии полной спецификации и нескольких выходных изделиях(допиливал очень долго).

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

    Reply
  5. Ulus

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

    Я посмотрел. Там в случае сборочной спецификации добавить один запросик к табличной части Возвратные отходы справочника Спецификации, но только с минусом. (так и в типовом сделано).

    Сам возвратный отход он кидает в выпуск (так как движение по РН «Выпуск продукции идет»), как в моем отчете, так и в типовом. Его просто из отбора по продукции надо убирать и все.

    И все должно отрабатываться. Сделаю попозже, сейчас просто времени нету.

    Типовой путается в Возвратных отходах, некорректно показывает плановые данные при условии полной спецификации и нескольких выходных изделиях(допиливал очень долго).

    Честно не работал с полными спецификациями. Но судя по комментариям баги там есть 🙂

    Reply
  6. Xatori111

    (5)Ты даже не представляешь на что приходится идти что бы их пофиксить.

    Reply
  7. kaa79

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

    Reply
  8. Ulus

    (7) kaa79,

    Спасибо за плюс.

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

    Чуть отклонения — не отрабатывает.

    Да еще я хотел показать пример рашифровки…

    Reply

Leave a Comment

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