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




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

11 Comments

  1. Scorpanatoly

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

    Reply
  2. alex_davydov

    Скачал отчет, который работает не правильно 🙁 Обидно, потратил стартмани 🙁

    Отчет выводит резерв каждой характеристики как резерв по номенклатуре (см. картинку).

    Скажите, как быстро сможете поправить?

    Reply
  3. Scorpanatoly

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

    Reply
  4. mentozavr

    Доброго времени суток. Скачал отчет «Стоимостная оценка склада в ценах номенклатуры с учетом свободных остатков, товаров к передаче, резерва» в работе очень нужен. но вопрос — что можно туда добавить чтобы показывать цены во всех типах цен. Заранее спасибо

    Reply
  5. Scorpanatoly

    (4)

    Добрый день!

    Данный отчет не предусматривает этого.

    Вы представляете, как он будет выглядеть, если мы добавим несколько типов цен?

    Добавится колонок = Количество типов цен * 4. Или я неверно понял вопрос?

    З.Ы.

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

    Reply
  6. mentozavr

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



    10.01 — одна цена по одному типу цен

    12.01 — другая цена по второму типу цен

    12.01 — третья цена по третьему типу цен

    Регистр сведений срез последних вытащит их все, а надо только те которые были самые поздние.. один из вариантов это упорядочивать по дате УБЫВ и вытаскивать через ПЕРВЫЕ…

    Может есть другой вариант

    Reply
  7. Scorpanatoly

    (6)

    В целом мысль Ваша верная.

    Решение аналогичного вопроса лежит вот в этом моем отчете https://infostart.ru/public/712553/. Если разбираетесь в запросах, разберетесь сами.

    Там как раз таки вычисляется последняя цена из всех типов цен номенклатуры контрагентов.

    Reply
  8. Scorpanatoly

    (7)

    Извиняюсь ссылку не на тот отчет выложил.

    Вот правильная.

    https://infostart.ru/public/712610/

    Reply
  9. mentozavr

    (8) этот отчет мне не подходит. у меня партионный учет упп. учет по характеристикам….а за идею спасибо

    Reply
  10. Scorpanatoly

    (9) Я прекрасно понимаю, что это совсем другой отчет. Привел его в пример, так как, как раз в нем есть хитрая схема вычисления последней цены из регистра сведений цены номенклатуры поставщиков. Т.е. существует множество поставщиков, у них разные типы цен. И вот как раз находим самую последнюю из всех типов на определенный момент времени.

    Reply
  11. mentozavr

    Ясно. спасибо. ознакомлюсь

    Reply

Leave a Comment

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