Стоимостная оценка склада в ценах номенклатуры (доработана)




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

28 Comments

  1. ValentinV

    А что это — «единица отчета»?

    Reply
  2. WiseSnake

    Хорошо «единица для отчетов» так понятней?

    Reply
  3. luns

    (1) Реквизит элемента справочника «номенклатура»

    Reply
  4. ValentinV

    (3) За долгую жизнь я привык понимать как, единица измерения.

    Если читать «Единица измерения — отчет»,

    то что-то не то получается.

    Если я не точен или недостаточно точен, поправьте меня пожалуйста.

    Reply
  5. WiseSnake

    (4) «Единица измерения для отчетов» — реквизит справочника номенклатура.

    Еще «Базовая ЕИ», «ЕИ хранения остатков», «ЕИ для отчетов» (это она!), «ЕИ мест».

    Поправил описание еще раз, так понятней?

    Reply
  6. WiseSnake

    +(4) Добавил скриншот, показывающий какую ЕИ я имею ввиду.

    Reply
  7. pink2k

    Нельзя ли добавить колонку «Цена по себестоимости», которая вычислялась бы как себестоимость, деленная на количество? Или, может, подскажете, как это сделать?..

    Reply
  8. pink2k

    (7) Сам добавил, прошу прощения за беспокойство.

    Reply
  9. Glenas

    Спасибо огромное. По сути, сделали работу 1С по доработке глючного оригинала

    Reply
  10. souldiver

    А почему результаты в столбцах «Количество», отображаемые стандартным отчетом отличаются от результатов, отображаемых вашим отчетом?

    Reply
  11. souldiver

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

    Reply
  12. WiseSnake

    (10) То есть количество в единицах хранения отличается от стандартного?

    Странно остальное полностью типовой отчет… возможно из-за версии конфигурации… У Вас какая версия УТ?

    Reply
  13. souldiver

    У меня 10.3. Без изменений — стандартная конфигурация. Отличия в столбцах «в ед. хранения»

    Reply
  14. WiseSnake

    (13) 10.3…. а дальше? У меня то нет различий…

    Reply
  15. souldiver

    10.3.1.17

    Reply
  16. WiseSnake

    Понятно…старенький…

    Вы можете сохранить этот отчет как внешний и кинуть мне его на мыло? Мыло кинул в личку..

    Reply
  17. souldiver

    Отправил

    Reply
  18. WiseSnake

    (17) Посмотрел одним глазком… Дело в том что действительно у Вас старый релиз и на нем не работает вот что:

    В Вашем релизе в запросе используется «ДатаОтчета», а сейчас используется «ДатаКон», по этому видимо отчет в Вашей базе формируется на пустую дату (по есть на текущий момент) отсюда и отличия…

    Варианта исправления 2:

    1. Обновиться

    2. По аналогии с моими доработками сделать доработки в своем отчете

    Reply
  19. souldiver

    Спасибо большое за совет!

    Скорее всего поступлю по второму варианту 🙂 Поскольку не знаю, собираются ли делать обновления 🙂

    Reply
  20. WiseSnake

    (19) Пожалуйста! Найдете косяки пишите мне в личку 🙂 А то стыдно 🙂 Пока смотрел, сам нашел небольшой косячёк 🙂

    Reply
  21. laikyti

    скажите пож-та, а можно в настройке в «группировки строк» при выборе поля добавить ДокументОприходования?

    Reply
  22. evil_wizard
    pink2k пишет:

    (7) Сам добавил, прошу прощения за беспокойство.

    Как ты это сделал. у меня отчет ни в какую не хочет отображать значение по новой колонке.

    Reply
  23. Romario940

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

    Reply
  24. namazi74

    тема ещё поддерживается?

    Reply
  25. WiseSnake

    (24) Неа, устарело это все уже

    Reply
  26. namazi74

    Случайно для 8.2 не делали подобного?

    Reply
  27. namazi74

    (25) доработал для УТ 10.3 для 8.2. Могу выложить в новую тему? Вас добавлю в качестве изначального автора

    Reply
  28. WiseSnake

    (27) Конечно, выкладывайте.

    Reply

Leave a Comment

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