<?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='\
Есть одно ограничение для фильтров — подразумевается, что для реквизита «Организация» существует справочник «Организации» (не «Фирмы»), для «Склад» — Склады и т.д. Не хотелось заморачиваться с определением имени метаданного… будем считать что конфигурация у нас от нормальных программистов.
Надеюсь эта моя реализации понравится больше, чем то что (аналогичное) я увидел сегодня на этом ресурсе. Поэтому и написал ее сейчас :), пусть у пользователя будет ПРОДУКТ.
Эх, кто б когда придумал менять время в пределах одной секунды… потому как «Перенести в конец дня» не ставит документ реально ПОСЛЕ всех прочих, в отличие от семёрки.
(2) Действительно ,последним документом считается документ с максимальным ДатойВремя. Если эти ДатаВремя совпадают у нескольких документов ,то последним из них считается имеющий максимальное значение Ссылки.
(т.е. созданный позднее других в реальном времени) . А в чем проблема ?
Ну так вот МоментВремени б научится менять, а то наши бухи не понимают, как получается, что аккуратно перенумерованные какой-то там обработкой документы, отсортированные при обработке по времени, никак не хотят выстраиваться в одинаковую последовательность в журнале по дате и по номеру.
Задача с переназначением времени возникла так:
бухи попросили ее сделать… документы одного дня — сначала расход стоит, а потом приход (приход на секунду позже, потому что КТО ТО ОПЕРАТИВНО ПЕРЕПРОВЕЛ ДОКУМЕНТ) — и в этом случае начинается Wопа! 🙂
Спасибо, коллеги, за ваши плюсики.
(6) МоментВремени содержит ДатуВремя и Ссылку . Ссылку менять как-то затруднительно. Проще всё-таки располагать документы со сдвигом во времени.
Документы с одним ДатойВременем — явление редкое.
на (6)
А если документов за день 25 000 штук как тогда их размещать со сдвигом? просто секунд не хватит
(6) Увы, документы с одной датой и временем — явление очень частое для конца месяца.
(7) 8-ч рабочий день — это 28 800 сек . И в чем проблема ?
(8) Не существует приемлего варианта , при котором документы с одинаковым временем располагались на временной оси так как Вам нужно.
Я извиняюсь , но без воспитательной работы с бухгалтерами не обойтись.
Собственно мною было опубликовано вариант выравнивания времени документов при востановлении последовательности:
удивил пункт автора под номером (7) как ВАЖНо, что полользователь может отменить, да это применяется всеми программистами. Это как правило хорошего тона программирования.
(10) да не всегда при программировании реализуют простой, но важный для пользователя сервис…
Очень выручила Ваша обработка! Руководство настаивает на принудительной установке времени проведения документов вида:
1. Заказ поставщику – 0:00
2. Поступление товаров и услуг, Отчет производства за смену – 1:00
3. Перемещение на СГП с цехов – 2:00
Собираюсь сделать автоматом для новых доков, а с помощью Вашей обработки многократно ❗ упрощается задача обработки документов закрываемого периода!
Спасибо!
(12) Используйте подписку для всех документов и в зависимости от вида документов устанавливайте в процедуре (обслуживающей подписку) нужное время принудительно — а время, которое должно быть установлено для вида документов, лучше хранить в регистре сведений, и может даже в периодическом..
Удачи! Спасибо за хорошй отзыв.
Обработка очень удобная! Пользуется бухгалтерия каждый квартал для сведения НДС!!! Спасибо!!!
Обработка очень удобная!
С помощью Вашей обработки, в конце квартала разносим по времени документы поступления и реализации товара, а так же поступления денежных средств.
Поступления товара 0-00-00
Поступление денежных средств 23-00-00 (для случая когда приход денег и реализация в один день, что бы не было аванса)
А реализации остаются между ними со своим старым временем.
Очень удобно, спасибо!