<?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='\
А чем Вас стандартный документ не устроил?
(1) Aleksey-29,
Стандартный документ надо создавать, заполнять, записывать в базу. И он работает только по одному контрагенту.
реализация интересна, вот только каков практический смысл?
если формировать пакетно годовую инвентаризацию, то тогда не хватает шапки, подвала для каждого акта,
просто на выходи имеем нереальной длинны портянку с которой банально не удобно работать.
а для разового акта — достаточно существующего документа.
кстати — в курсе почему в типовой акт сверки это документ а не отчет?
потому что, помимо всего прочего, составление акта сверки — один из вариантов взаимодействия с контрагентом,
и от даты составления акта сверки (либо письма или иной хоз.операции) считается 3 года,
после которого задолженность можно списывать.
(3) v_den_v, Смысл отчета — замена карточки счета иили отчета по проводкам.
В отчете можно посмотреть все движения по контрагентам за период, чего нет в типовой бухгалтерии
Будьте добры, этот отчет могу сформировать в разрезе холдинга получается, тобишь могу сразу указать несколько контрагентов или несколько договоров, с сортировкой по контрагенту или договору. У меня такая ситуация, контрагент является холдингом, есть много контрагентов входящих в этот холдинг, мне необходимо делать акт сверок в одном документе с сортировкой по контрагентам в списке входищим в этот холдинг, поскольку плательщик является холдинг то и акт сверок надо ему отправлять, но с указанием контрагентов в списке или хотя бы по договору
Плюсанул. Часто вижу как бухгалтера даже не пытаются искать акт сверки по какому-либо контрагенту, а создают новый и заполняют его, просто что бы просмотреть задолженность, при чем при заполнении конечно же документ записывается в базу, не спрашивая пользователя будет ли он его печатать либо же просто проверил себя и забыл.
УПП 8.2 Выдала вот такую ошибку
{ОбщийМодуль.ТиповыеОтчеты.Модуль(4765)}: Метод объекта не обнаружен (ПолучитьПараметрыИсполненияОтчета)
ПараметрыИсполненияОтчета = ОтчетОбъект.ПолучитьПараметрыИсполненияОтчета();
Помогите разобраться пож-та, уж очень для меня актуальный данный отчет.
Автор, найди пож-та время, ответь, работает данная обработка на УПП 8.2 типовая, не доработанная. у меня ошибка вышла, описана постом выше!
(7) Пишут, что ни попадя. Нет такой конфигурации УПП 8.2
(9) Поручик, Ну тут не до уточнений, Конфигурация УПП типовая, на платформе 8.2, сути не меняет в данной ситуации дела 🙂 В Публикации заявлено что должна работать в УПП на платформе 8.2
(10) Чесс слово, блин. На платформе 8.2. может работать и УПП 1.2 и УПП 1.3.
(11) Поручик,
Автор не указал, какая конфигурация, обощил все в одном УПП, подразумевалось наверное что и там и там, в принципе если для УПП 1.2, то простая конвертация обработки и рабочая обработка под 1.3 а вот если обратно, то тоды ОЙ, как говорится 🙂
Отчет работает хорошо…Лучше чем стандартный документ
В УПП 1.3 заработало сходу. Не могу сказать, что лучше стандартного документа, идеология другая, к тому уже неоднократно видел и сам делал заполнение штатного документа нештатным алгоритмом. Но для быстрой проверки задолженности очень неплохо. Особенно если еще контрагента вынести на форму в быстрые отборы, что у себя сейчас и сделаю.
Автору спасибо!!
Отчет действительно хороший и практически применимый.
Однако в печатной форме типового Акта сверки есть: Сальдо начальное, Сальдо конечное, Обороты за период. А данный отчет по Организации показывает только Обороты, а Сальдо нет! И вообще я думаю, гораздо удобней по Контрагентам Сальдо начальное, Сальдо конечное вынести в колонки, а не выводить по строкам как сейчас. Т.е. сделать 4 колонки: Сальдо начальное (общее Дт+Кт), Обороты Дебет, Обороты Кредит, Сальдо конечное (общее Дт+Кт).
Ну и как уже здесь писали, добавить на форму в быстрые отборы.
а он формирует и в валюте и в рублях одновременно? или только в выбранной валюте?
довольно таки удобно для менеджеров (тк не все могут разобраться со стандартными отчетами ведомость по взаиморасчетам). Жаль, что нет стандартных кнопок «сохранить настройку» и «восстановить настройку»