<?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='\
(0) вы проверяли ваш отчет для случаев когда у вас > 1 СФ к расчетному документу ?
(1) Так пишу об этом:
(2) 2 или более СФ могут быть , при наличие расчетов по разным договорам в БП (в одном документе ) или ,например , когда взаиморасчеты ведутся «по заказам» в УТ и по документам расчетов . Мне кажется в этом случае будет дублирование строк отчета , с разными СФ но одной сумой , что приведет к искажению итогов по документу расчетов
(2) мне кажется в данном случае целесообразно в схеме КД , поле СФ (вместе с суммами) выводить как вычисляемое через ВычислитьВыражениеСГруппировкойТаблицаЗначений(
(3)
да, такая ситуация может быть, но в моей практике такого не было. Допишу в статью.
(4) не совсем понял, как это поможет устранить дублирование строк при количестве с/ф более одной
(6) если честно у меня нет опыта работы с этим выражением , но думаю можно сделать по аналогии сhttps://infostart.ru/public/267055/
(7)спсб, посмотрю
(7)
если вы подразумевали, что на вывод одной строки расчетного документа будет в соседней колонке выводиться весь набор введенных с/ф, то да, наверное так можно было бы сделать, но я как и вы не силен в «ВычислитьВыражениеСГруппировкойТаблицаЗначений», хотя это повод заняться данным пробелом)
Интересно, а будет ли работать этот метод в Бухгалтерии 20
(10)няп, там отчет тоже на СКД, возможно с небольшими переделками взлетит… или даже без переделок…
(11) странно, сделал точно как написано, поля появились, но в отчет не выводится, как будто поле пустое. Бухгалтерия 20
(12) что же странного? как раз про это и пишу, что возможно нужны переделки какие-либо
но структура данных мало чем отличается в этом случае, скорее всего что-то несерьезное, но вот что… нужно посмотреть…
спасибо автору за информацию, сэкономил время для решения данной задачи. кстати приведенный отчет для Бухгалтерия 20 тоже рабочий, только добавленный участок кода начинающийся с «Если Отчет.Счет.Код=»76.АВ» надо поставить внутрь цикла.
(11) как с вами связаться? не могу вам отправить личное сообщение
(15) написал в личку, дошло?
Внешняя форма себя странно ведет в последних релизах бухгалтерии 3.0
Поля в настройках отчета появляются, но при выводе —
{ОбщийМодуль.БухгалтерскиеОтчеты.Модуль(241)}: Поле объекта не обнаружено (ДанныеСФВыд)
Для Каждого ПолеНабора Из Схема.НаборыДанных[ИмяНабора].Поля Цикл
И схема как будто без этих наборов данных, хотя они есть.
Чувствую, что 1с как то использует стандартную схему, но не могу понять где.
(17)посмотрю, клиенту недавно делали обновление, жалоб не было.
На всех последних релизах ругается?
(18)
Я глубоко не проверял, просто внешний отчет взял и запустил на них.
В результате скопировал стандартный и изменил по рекомендациям в статье. Так работает. Но не как внешний.
В Бухгалтерия предприятия КОРП, редакция 2.0.65.41 отчет взлетел.Спасибо автору
В новых релизах в СКД совсем пусто… Не подскажете как теперь можно добавить это поле?
Бухгалтерия предприятия, редакция 3.0 (3.0.71.83)
(21)не скажу, т.к. еще не обновлялись до свежих релизов, как будут новости то сделаю обновление статьи
(22) Появилась потребность на использование Вашего внешнего отчета, БП 3.0.74.51.
Подскажите, когда ждать обновление?
(23) со временем пока не очень… попробую в выходные заход сделать, если получится, то отпишусь
(21) там 2 компоновки, смотрите вторую
Может быть кому-то пригодится такая информация.
Для отслеживания остатков в разрезе счетов-фактур можно воспользоваться отчетом «Остатки НДС по авансам покупателей» с соответствующей настройкой.
На 3.0.73.60 не работает…
(27)если вы про внешний, то читайте выше в комметах