Отчет "Остатки в ценах продажи" (БП 2.0, 8.2)




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

22 Comments

  1. IDija

    (0) Да ладно, есть подобные например: http://infostart.ru/public/78026/

    Reply
  2. ErrorEd88

    По ссылке — отчет для УТ, я его видел до этого. Для БП не нашёл в свое время. Может и были отчеты, я не спорю.

    Reply
  3. cucuruza

    А остатки на 43 в ценах продажи учитывает?

    Reply
  4. ErrorEd88

    Сейчас допишу..

    Reply
  5. cucuruza

    Отчет понравился и ему не было бы цены, если бы отбор шел не по номенклатурной группе, а по номенклатуре, было бы намного удобнее.

    Reply
  6. ErrorEd88

    Добавил отбор по номенклатуре

    Reply
  7. cucuruza

    Спасибо за оперативность.

    Reply
  8. cucuruza

    Не отбирает по номенклатуре (целой папкой), отбор идет только по группе.Но если выбрать одну позицию, то все работает.

    Reply
  9. ErrorEd88

    Понял, допишу чуть позже, на днях, дел чуть меньше станет.

    Reply
  10. ErrorEd88

    Теперь отчет отбирает по группам. Чуть позже доработаю, чтобы в отчете товары группировались по группам номенклатуры.

    Reply
  11. beslane

    а есть ли такая же обработка на 8.1?

    Reply
  12. ErrorEd88

    Нет, могу сделать. Просто БП 2.0 на 8.1 уже не обновляется, насколько я знаю.

    Reply
  13. tonic-spb

    отличный отчет! все просто и понятно! автору огромный плюс!!! в бухгалтерии 8.2 работает «на ура». что редкость…

    еще — было бы классно его чуть чуть доработать — сделать фильтр по количеству (что бы например, посмотреть только отрицательные остатки, или остатки больше определенного количества).

    Reply
  14. tonic-spb

    (1) кстати, та обработка не идет под 8.2!!!

    Reply
  15. IDija

    (15) Во-первых как сказано в (2) — он для УТ и УПП, во — вторых чтоб отчет работал в 8.2 его надо конвернуть…

    Reply
  16. ErrorEd88

    На неделе постараюсь добавить фильтр по количеству.

    Reply
  17. polocatik

    У меня бухгалтерия 2.0 (платформа 8.2). и выдается пустой отчет.

    Reply
  18. ErrorEd88

    Только что скачал и перепроверил — формируется. У многих клиентов стоит. Только один раз была подобная ситуация — на «капризной» базе, в которой помимо этого было множество проблем. Попробуйте сделать тестирование и исправление базы. Может еще — с движениями по регистру бухгалтерии проблемы..

    Reply
  19. madamonika

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

    Reply
  20. n949eo

    До отчета не добрался, но вопрос в том:

    Как в отчете реализовано состояние склада на определенную дату?

    ВводНачОст+Приход+Перемещение-Перемещение-Расход+Возврат-Списание+Оприходование… что я забыл?

    Как играть с датами?

    Reply
  21. bazis-spb

    (18) polocatik, а Вы не забыли установить тип цен? все поля заполнены? у меня такое было, когда не указал склад например — тоже выдавался пустой отчет.

    Reply
  22. VNN21122006

    Скачал и установил на программу 1С:Бухгалтерия предприятия 8.2 2.0.27.10 работает но отчете не группирует товары по группам номенклатуры. Пришлось дорабатывать. А еще не формирует когда устанавливаешь основную номенклатуру. А так отчет в принципе нужный и понятный.

    Reply

Leave a Comment

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