<?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='\
Довольно интересная идея для снабженцев. Вопросы сразу:
1. Что означает блеклость строк отчета?
2. Алгоритм расчета колонок «1» и «2» пишите
И что делать если в течение дня происходит периодическое пополнение товара по стратегии «с нуля до максимума, до нуля и опять до максимума»?
1. Блеклость строк — условное оформление. Если товары продавались, то строки зеленые, Если продавались и остаток на конец периода = 0, то строки красные.
2. Периодичность расчета средних остатков день, т.е. остатки среднедневные. В Вашем случае средний остаток будет 0.5 максимума. При такой интенсивности продаж надо внутри дня детализировать до регистратора. Никто пока такой задачи не ставил..
(1) kostyaomsk, Или, глядя в отчет, увеличить количество энного товара в товарной матрице. Отчет как раз и сделан для корректировки товарной матрицы.
Ошибка загрузки документа.
http://v8.1c.ru/8.1/data-composition-system/settings }useInHierarchicalGroup Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema }anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {
Наверное, платформа не понимает тип «ЗначениеПараметраНастроекКомпоновкиДанных». Или обновитесь до 8.3.5, или закомментируйте все в модуле отчета — там «защита от дурака».
Как то оно неправильно количество дней на остатке считает…
У меня период с 1-го по 14-е число.
С 1-го по 5-е остатки на начало и конец — 2.
6-го числа на начало 2, на конец — 1.
с 7-го по 10-е на начало 1, на конец — 1,
11-го числа на начало 1, на конец — 0.
По идее количество дней остатка должно быть 10,5.
А в отчете дает 11,5.
(6) Spacer, Да, получается 10.5. Отлаживал на тестовой базе. Там есть запрос по вычислению периода, в зависимости от выбранного регистра (1 или 2) дает разные цифры.
Вообще, это надо было сделать на вычисляемых полях… Попробуйте в консоли запросов выполнить
Показать
Данная обработка очень помогла, спасибо большое.
Не нашел комментарий «Здравствуйте, а данная обработка не может вычислять остатки отдельно для конкретной группы номенклатуры?»
Если отбор по группе номенклатуры, то на втором скане показаны настройки. Если но номенклатурной группе, то надо изменить запрос (у заказчика не было номенклатурных групп).
Здравствуйте, вот такая ошибка. Конфигурация УТ 3.0 Для Украины (соответствует ут 11.0)
{(14, 44)}: Поле не найдено «ПродажиОбороты.Склад»
ПО ОстаткиОбороты.Склад = ПродажиОбороты.<<?>>Склад
(10) Странно, у меня все работает. Может, убрали реквизит «склад» в «ВыручкаИСебестоимостьПродаж»?. Надо посмотреть, куда и что пишет документ продажи.
Процедуру «ПриКомпоновкеРезультата» можно удалить, вместо этого у параметра «ВывестиПозиции» установить «Использование» = «Всегда».
Группировка «Склад» обязательно должна быть, иначе врет.
Адаптировал отчет для производственного предприятия. Деление на склады условное. Чтобы убрать склады, надо в запросе удалить строки со складом (в выборках и соединениях) и группировку «Склад». Склад остается доступным для отбора.
Для производственного предприятия по аналогии сделал отчет «Оборачиваемость материалов». Вместо продаж взял расход со склада на выпуск продукции.
Почему удваивает Дни наличия? Если в месяце 31 день и был целый месяц, выводит 62