<?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='\
Чем вас не устроила типовая обработка в УПП:http://joxi.ru/Y2LQgOyTnNw11A ? К тому же гораздо функциональнее.
(1) стартмани за типовую не капают 😀
(2) А я тут все планы порушил )
Но почему такой убогий интерфейс?
(1)Тем, что стандартной обработкой можно сдвинуть только границу партий, в предлагаемой обработкой можно сдвинуть границу РасчетыПоПриобретениюОрганизации и РасчетыПоРеализацииОрганизации
(2)В каком месте она типовая?
(4)Главное функционал. Те кто в УПП ведут учет по УУ и БУ, меня поймут, т.к. очень часто бухгалтерия частенько наровит поменять проводку в закрытом периоде, а из-за одного документа запускать восстановление состояния расчетов не предпочтительно, это касается тех, кто использует партионный учет
На INFOSTART-е есть обработка для восстановления последовательностей по приобретению и реализации и гораздо более функциональная (с возможностью отбора по контрагенту и договоруhttp://infostart.ru/public/164918/) . Там же принудительно устанавливаются границы без перепроведения документов.
(3)
(8)Ни кто не заставляет вас, скачивайте то что вам нравится. Моя обработка с задачей сдвинуть принудительно границы расчетов и партий на заданную дату, справляется на 100%.
Как показала практика, при сдвиге границы последовательности партий назад, при большом документообороте возвращение ее назад стандартным механизмом осуществляется через перепроведение по регистрам партионного учета всех документов которые оказались за границей занимает чудовищно много времени причем с полной блокировкой таблиц.
У нас в месяц порядка 20-25 тыс документов, каждый день несколько партий производится и перемещается, куча товаров и комплектующих, скажем смещение на 2 месяца назад грозит временем проведения и блокировки таблиц в пару дней. даже на нашем на совсем старом железе и дисковыми массивами на ссд и выделенной оперативной памятью под скуль порядка 150 гб, чтобы можно было загружать в память обрабатываемые таблицы целиком.
Если не перепроводить документы, а просто в таблице последовательности партий поменять признак средствами 1с то картина по времени становится чуть лучше, но ненамного.
Выход, напрямую в скуле это делать запросом вида:
Update [dbo].[_Seq25697]
set [_Fld25699] = 0x01
where [_Fld25698RRef] = 0xA2B20015174CFA4511DD54A14025EB9B and [_Period] < ‘4017-01-05 00:00:00.000’ and [_Fld25699] = 0x00
Дело нескольких секунд.
Понятное дело, что названия таблиц и полей у каждого будут свои. но в целом метод самый быстрый.
Если были изменения в партиях, то конечно правильность писаний и себестоимости будет нарушена, при таком подходе, но если в партиях не было изменений, то это выход.
Добавлю свои 5 копеек, хотя тема старая. Столкнулся именно в УПП.
В УПП при проведении любого документа, входящего в последовательность и датой меньше, чем граница последовательности, сразу меняется граница последовательности на дату документа. Поэтому восстановление последовательностей надо проводить с учетом всех последовательностей, входящих в конфигурацию. Даже с учетом управленческого и бухгалтерского. Иначе, если Вы восстановите сегодня последовательность по партиям в бух.учете, а завтра в управленческом — то завтра Вы нарушите последовательность в бух. учете. Это надо учитывать всегда. Сдвиг границы последовательности никак не связан с перепроведением документов (не восстанавливает партиионный учет), а сдвигает только границу. Если Вы уверены, что перепроводить нет смысла — можно двигать границу. Но это вопрос больше к бухгалтеру, чем программисту.