<?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='\
Добавлю чуток описания:
— Отчет служит для выявления «потенциальных опасностей», возникших
из-за несоответствия положению НК.
— возможен расчет «разбегания» цен по двум алгоритмам: МАКС-МИН/Средневзвешенный
— в полученном отчете указываются документы, в которых выявлены «несоответствия».
— ВНИМАНИЕ!!! При использовании возможностей множественного фильтра возможно
«искажение» отчетных данных, так как использованием МФ вы «обрезаете» набор
документов для анализа — имейте это в виду! Используйте с умом…
Отчет действительно очень нужный, есть у нас параноидальные бухгалтера, а главное налоговики
будут соображения по улучшению — пиши.
В использовании все понятно было? Вопросы есть?
Хочется предупредить: средневзвешенная цена продажи СЧИТАЕТСЯ исходя из продаж, зарегистрированных в базе — принимая допущением, что продажные цены в фирме отражают рыночную ситуацию… Так что данные этой программулины надо принимать как «первое приближение»…
Реальную рыночную цену взять неоткуда — либо запрос в статорганы делать, либо самому из ситуации на рынке выводить..
Главное, никому в конторе этот отчет не показывать кроме ГБ (а он его должен иметь под рукой вдали от глахз проверяющих) — чтоб на вопрос, а хрен ли у вас цена так сильно скачет смело рассмеялся в лицо — не скачет а колебается в пределах 7% — ах не верите? что, первичку дать чтобы посчитали — ну нате… не жалко 1400 накладных за месяц, щитайте… 😉
у нас 60 тысяч накладных в месяц 🙂
задолбаются считать
Ну и я так говорю… Эта обработка для параноидальных ГБ, потому как если начнут в эту сторону копать — это значит ничего другого не нашли, что, сам понимаешь — практически невероятно. Был бы человек, а статья найдется… Никто не будет сажать за порез перочинным ножиком, когда ты 3 старушек замочил топором с изощренной жестокостью… 😉
Очень полезная штука.
Добавил картинку в описание
Поправил ошибочку.
> под БУХ ее переточить — проблем не представляет.
а можно для больных и слабых, а? 🙂
персональную версию для совсем далеких от программирования… спасибо!
Я думаю, можно… Цена вопроса?
> Я думаю, можно… Цена вопроса?
цена неимоверно велика! будет вам большое человеческое спасибо! 🙂
А почему не для всех стандартных конф на оперативном учете?
Для 1С:Предприниматель слабо?
(14) потому что задача такая не стояла… в принципе, по идее, разработка должна легко модифицироваться под прочие штатные конфы — надо просто глянуть в коде.. там инфа из регистров тащится.
.
была у меня еще идея в качестве индикатора рыночных цен тянуть данные с инет-торговых площадок, но это существенно усложнит использование для неквалифицрованных «буЛгахтеров»…
(15) Да, переделать можно. Наверное, лучше сделать в виде отдельной обработки, т.к. придется попутно выкинуть разрезы: Проект, Фирма, УпрАналитика, ЮрЛицо, Свойства номенклатуры и контрагентов.
А зачем обрабатывать НП?
Его уже давно нет и не предвидется.
Выкидывать-то необязательно, достаточно проверить идентфикаторы типовых конф и разветвить…
(17) а нехай будет… есть не просит.. и тем более — ВДРУГ…
(18) Разветвить в общем виде не получится, т.к. вызываются ф-и гл.модуля ТИС, которых нет в ИП
Я люблю универсальные решения.
Добавил ветвление для ИП: изменения в модуле пометил комментарием //PBOUL
Добавил новый слой на форму (Разделитель), чтобы скрыть переключатели для ИП.
Исправил ошибку, убрав формулу «ПриИзмененииДаты()» для реквизитов ДатаНачала и ДатаКонца.
Исправил ошибку, назначив виды справочников для ВыбРазделительХ.
Просьба протестить и включить в свою разработку 😉
Осталось сделать для Бух.
Вообще, не понятно почему автор позиционирует обработку для оперативного учета, ведь регистры не используются. Голимый черный запрос.
(21) ок, посмотрим, включим.
(22) давно было.. 4 года назад… сейчас уже и не упомню…
Вот, переделал на скорую руку для Типовой Бухии. Работает.
Поскольку возиться с ним больше не собираюсь, отдаю автороство на откуп автору и прошу включить себе в разработку (после долизывания если потребуется).
Исправил ошибки:
1) Убрал отбор по Автору, т.к. в типовой бухии его нет
2) Исправил ошибку во Множ.фильтре — не работал отбор по Номенклатуре: для этого везде в тексте модуля заменил «пзНоменклатура» на «Номенклатура»
3) Исправил ошибку, которая появляется в случае реализации товара по нулевой цене.
Ошибки 2) и 3) присутствуют и в автороской обработке для оперативного учета 🙁
О! Пригодилось…
Всплыла тонкость: при торговле с разными ставками НДС — для контроля надо использовать цену, «очищенную» от НДС — иначе будет искажение данных. То бишь надо посмотреть в отчет — я там судя, по всему, из регистра «ПРОДАЖИ» собираю именно по конечной цене для покупателя, т.е. с НДС.
Ну и по бухверсии — тоже надо смотреть аналогично — там может быть проще — можно юзать себсетоимость продаж.
судя по всему цена у меян в отчете уже получается очищенная от НДС…
(25) > 3) Исправил ошибку, которая появляется в случае реализации товара по нулевой цене.
— надо глянуть, как ты там исправил.. по идее реализацию по нулевой цене (то есть безвозмездную передачу) — в расчет средневзвешенной цены по данному отчету включать не надо…
Опочки, косячок: отчет не учитывает если в типе цены задана скидка, берется цена без скидки…
(30)Эту ошибку я не выявил, т.к. юзаю Предпринимателя, а в нем скидки не реализованы. Будешь исправлять, учти чтоб и у Предпринимателя работало.
Существенно доработал в части обработки для торговой конфигурации…
.
— учитываются продажи через комиссионеров;
— протоколирование расчета средневзвешенной цены (в Консультанте в свое время нарисовали заумную хрень, все считается проще); расшифровка значения средневзвешенной цены в отчете; расчет «неучтенной» суммы как разницы между ценой продажи и макимально допустимы отклонением, в данную сумму не следует включать отгрузки по ставке 0%;
— ускорено формирование отчета;
— ошибки прочие мелкие;
.
Если надо — торговый вариант тебе могу презентовать.