Ввод на основании Отчета мастера смены документов




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

    Не работает 😥

    Reply
  2. vshish

    (1) сначала добавь эту обработку в дополнительные внешние обработки заполнения табличных частей. и будет у тебя счастье. в результате появится в кнопке заполнить новая строка с названием Ввод документов на основании отчета мастера смены. и тогда все заработает. а просто так с чего бы оно работало.

    Reply
  3. vshish

    (1) я ответил на Ваш крик души?

    Reply
  4. MGreg

    Да, все работает, я лохонулся 😀 но есть пожелания развить приблизив к стандартной обработке по формированию «документов выпуск», если Вы не против.

    Reply
  5. vshish

    Да в общем, это было сделано практически на коленке часа за 1,5.

    Reply
  6. vshish

    Эта обработка была сделана практически на коленке за 1 час. Так что если есть необходимость пожалуйста, код открыт. Можно дорабатывать.

    Reply
  7. ag_1c

    Есть небольшая недоработочка:

    заполняется номер документа по принципу 000000nnn

    (если в базе при нумерации используются префиксы, то нумерация документов корёжится) 🙁

    лучше бы это поле оставлять пустым, прога сама заполнит при записи документа как надо (ИМХО);



    КА, редакция 1.1 (1.1.11.1)

    С уважением.

    Reply
  8. vshish

    1. Ну правку под свои нужды еще никто не отменял.

    2. В общем случае склад не известен и заполняется перед проведением документа.

    Reply
  9. madamonika

    У меня вышла ошибка и не получилось загрузить. Поэтому расстроилась! Где мне найти групповой ввод требований накладных :(((

    Reply
  10. madamonika

    Подсоединила, рботает, но мне не понадобился, нашла стандартную схему списания сырья и материалов в производство. Для производственных предприятий сложна в применении.

    Reply
  11. vshish

    Да есть типовая схема, я ее тоже нашел но уже после того как сделал обработку.

    Reply
  12. dtybr

    Типовая схема формирует только Выпуск продукции. Подскажите как можно реализовать групповой ввод документов требование накладная?

    Reply
  13. Sedow

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

    Reply
  14. vshish

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

    Reply
  15. Uplifted

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

    Reply
  16. vshish

    заполнить номенклатурную группу в номенклатуре, на закладке дополнительно или номенклатурную группу затрат. точно не помню. попробуйте оба варианта

    Reply

Leave a Comment

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