Изменение времени любых документов (8.1)




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

    Есть одно ограничение для фильтров — подразумевается, что для реквизита «Организация» существует справочник «Организации» (не «Фирмы»), для «Склад» — Склады и т.д. Не хотелось заморачиваться с определением имени метаданного… будем считать что конфигурация у нас от нормальных программистов.

    Надеюсь эта моя реализации понравится больше, чем то что (аналогичное) я увидел сегодня на этом ресурсе. Поэтому и написал ее сейчас :), пусть у пользователя будет ПРОДУКТ.

    Reply
  2. e.kogan

    Эх, кто б когда придумал менять время в пределах одной секунды… потому как «Перенести в конец дня» не ставит документ реально ПОСЛЕ всех прочих, в отличие от семёрки.

    Reply
  3. Ish_2

    (2) Действительно ,последним документом считается документ с максимальным ДатойВремя. Если эти ДатаВремя совпадают у нескольких документов ,то последним из них считается имеющий максимальное значение Ссылки.

    (т.е. созданный позднее других в реальном времени) . А в чем проблема ?

    Reply
  4. e.kogan

    Ну так вот МоментВремени б научится менять, а то наши бухи не понимают, как получается, что аккуратно перенумерованные какой-то там обработкой документы, отсортированные при обработке по времени, никак не хотят выстраиваться в одинаковую последовательность в журнале по дате и по номеру.

    Reply
  5. KukA.5

    Задача с переназначением времени возникла так:

    бухи попросили ее сделать… документы одного дня — сначала расход стоит, а потом приход (приход на секунду позже, потому что КТО ТО ОПЕРАТИВНО ПЕРЕПРОВЕЛ ДОКУМЕНТ) — и в этом случае начинается Wопа! 🙂

    Спасибо, коллеги, за ваши плюсики.

    Reply
  6. Ish_2

    (6) МоментВремени содержит ДатуВремя и Ссылку . Ссылку менять как-то затруднительно. Проще всё-таки располагать документы со сдвигом во времени.

    Документы с одним ДатойВременем — явление редкое.

    Reply
  7. KukA.5

    на (6)

    А если документов за день 25 000 штук как тогда их размещать со сдвигом? просто секунд не хватит

    Reply
  8. e.kogan

    (6) Увы, документы с одной датой и временем — явление очень частое для конца месяца.

    Reply
  9. Ish_2

    (7) 8-ч рабочий день — это 28 800 сек . И в чем проблема ?

    (8) Не существует приемлего варианта , при котором документы с одинаковым временем располагались на временной оси так как Вам нужно.

    Я извиняюсь , но без воспитательной работы с бухгалтерами не обойтись.

    Reply
  10. logarifm

    Собственно мною было опубликовано вариант выравнивания времени документов при востановлении последовательности:

    http://infostart.ru/projects/4010/

    удивил пункт автора под номером (7) как ВАЖНо, что полользователь может отменить, да это применяется всеми программистами. Это как правило хорошего тона программирования.

    Reply
  11. KukA.5

    (10) да не всегда при программировании реализуют простой, но важный для пользователя сервис…

    Reply
  12. Mortal

    Очень выручила Ваша обработка! Руководство настаивает на принудительной установке времени проведения документов вида:

    1. Заказ поставщику – 0:00

    2. Поступление товаров и услуг, Отчет производства за смену – 1:00

    3. Перемещение на СГП с цехов – 2:00

    Собираюсь сделать автоматом для новых доков, а с помощью Вашей обработки многократно ❗ упрощается задача обработки документов закрываемого периода!

    Спасибо!

    Reply
  13. KukA.5

    (12) Используйте подписку для всех документов и в зависимости от вида документов устанавливайте в процедуре (обслуживающей подписку) нужное время принудительно — а время, которое должно быть установлено для вида документов, лучше хранить в регистре сведений, и может даже в периодическом..

    Удачи! Спасибо за хорошй отзыв.

    Reply
  14. csmail

    Обработка очень удобная! Пользуется бухгалтерия каждый квартал для сведения НДС!!! Спасибо!!!

    Reply
  15. balabani

    Обработка очень удобная!

    Reply
  16. Oleg_N

    С помощью Вашей обработки, в конце квартала разносим по времени документы поступления и реализации товара, а так же поступления денежных средств.

    Поступления товара 0-00-00

    Поступление денежных средств 23-00-00 (для случая когда приход денег и реализация в один день, что бы не было аванса)

    А реализации остаются между ними со своим старым временем.

    Очень удобно, спасибо!

    Reply

Leave a Comment

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