<?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. Да, считает за любой период. Он берет последнюю цену из документа регистратора регистра сведений «Цены номенклатуры контрагента» на момент документа реализации товара. Т.е. например была изменена цена номенклатуры контрагента 03.06.17 года в 13:51:00. Себестоимость документа реализации от 02.06.17 года, и от 03.06.17 13:49, например, он посчитает по старой цене, документа от 03.06.17 13:52 — уже по измененной. В данном случае период не важен. Он может быть любым.
2. Да, меняются. Да, можно. Отчет сделан полностью в СКД, соответсвенно группировки можно менять любым образом. По реквизитам документа продажи, справочника номенклатуры. Хоть склады, хоть ответсвенный менеджер за номенклатуру, хоть контрагенты, хоть ответсвенный за документ.
(1)
1. Да, считает за любой период. Он берет последнюю цену из документа регистратора регистра сведений «Цены номенклатуры контрагента» на момент документа реализации товара. Т.е. например была изменена цена номенклатуры контрагента 03.06.17 года в 13:51:00. Себестоимость документа реализации от 02.06.17 года, и от 03.06.17 13:49, например, он посчитает по старой цене, документа от 03.06.17 13:52 — уже по измененной. В данном случае период не важен. Он может быть любым.
2. Да, меняются. Да, можно. Отчет сделан полностью в СКД, соответсвенно группировки можно менять любым образом. По реквизитам документа продажи, справочника номенклатуры. Хоть склады, хоть ответсвенный менеджер за номенклатуру, хоть контрагенты, хоть ответсвенный за документ.
Добрый день! Отчет работает не верно, не все реализации попадают! сможете поправить??
(4)
Доброго времени суток!
Интересует конкретика. Какой релиз УТ? Какие именно реализации не попадают? У меня все работает верно.
Два предположения навскидку:
1. Не попадают реализации, где нет товаров, а только услуги. Их нет в регистре цен номенклатуры контрагентов, соответсвенно они не попадают.
2. Не попадают реализации, где не установлены цены номенклатуры контрагентов на дату реализации.
Просмотрите номенклатуру в этих реализациях, посмотрите регистр сведений цены номенклатуры контрагентов на дату документов. Исходя из этого, решим Вашу проблему.
(5)
При данных вариантах., можно будет подумать об обработках чтобы например создался документ Установка цен номенклатры контрагента со всей номенклатурой, и, скажем, установкой цены 0 у нее с датой раньше всех реализаций. И, например, обработка, которая на основании поступления товаров и услуг, где не стоит галочка «регистрировать цены поставщика», создавать документы Установка цен номенклатуры контрагентов с датой поступления и ценой документа.
Вы могли бы дописать чтоб продажи попадали все и товары и услуги (хотя бы товары) даже если НЕТ «Цен номенклатуры контрагента» Потому что вижу что продажи не все, а где искать? Получается если возникло расхождение нужно делать реестр документов и крыжить вручную с вашим отчетом. Я хотел уйти от перепроведения и экономить время вашим отчетом. А тут другая байда.
(7)
Отправил отчет Личным сообщением.
(8)
На данном скриншоте выделено желтым в колонке сумма продажи ,где и произошли расхождения со стандартным отчётом в демо версии УТ 10.3, также не попадает возврат товара, если необходимо можем прислать вам копию базы.
(9)
Доброго времени суток!
В документе «Возврат товара от покупателя» в табличной части в столбце «Документ партии» вводится документ реализации, по которому проходит возврат товара. Отчет выводит сумму продажи по реализациям с учетом возврата по этим реализациям. Т.е. например реализация была на сумму 100 рублей. Затем был возврат нескольких позиций по этой реализации на сумму 30 рублей. Отчет покажет реализацию на 70 рублей и посчитает валовую прибыль также с учетом возврата.
Проверьте этот момент.
Проверить можно просто взяв для примера несколько возвратов по реализациям, и сделать отбор по данным реализациям в отчете.
Ну уж если совсем непонятно, то присылайте копию, посмотрю.
(10)
И вам доброго времени суток.
В некоторых документах именно так и считает и цифры сходятся, но в других всё иначе.
Как вы считаете сумму продажи и себестоимость?
Из какого регистра берутся продажи? Можно ли сделать чтоб сумма продаж по стандартному отчету валовая прибыль и вашему отчёту совпадали во всех группировках?
(10)Что с вопросом 11?? Вы смотрели??
(11) (12)
1. В отчете задействованы два регистра — Продажи и ЦеныНоменклатурыКонтрагентов.
2. Как вариант могу предположить еще, что не проставлены цены номенклатуры контрагентов.
Прикрепляю простую обработочку, которая проставит цены номенклатуры контрагентов. Ее необходимо чуток отредактировать под свои коды типов цен, контрагентов.
В моей базе все совпадает. Эту к сожалению пока времени нет смотреть. Постараюсь в ближайшее время.
Единственный нюанс. Если выбрать период, где возврат покупателя существует, а реализация находится вне периода отчета, то в отчете отобразится реализация с минусовой суммой по позициям возврата на суммы возврата.
Можете сделать детализацию по номенклатуре в реализациях, где суммы не совпадают, и тогда увидите что именно не учитывает отчет и почему.
В любом случае отпишитесь. Посмотрю в ближайшее время.
(13)
Доброе утро, решили проблему, мы добавили группировку по характеристикам так как было удвоенное количество товара и сумма продаж была больше.
(14)
Доброе! Хорошо.
Добрый день, отчёт работает не верно, в отчёт попадает реализации из другого периода, вы в показателях используете документ — измерение регистра продажи. С документа возврата от покупателя в это измерение пишется документ реализация относящаяся к другому периоду не заданному в отчёте. И документа возврата вообще невидно.
(16) Добрый день!
Попадает документ другого периода, потому что в этом периоде был возврат части документа реализации того периода. И попадает он с минусом.
Соответственно, для учета себестоимости возвращенного товара предыдущего периода, необходимо учитывать дату, время реализации товара и, исходя из нее, смотреть последнюю запись регистра сведений цен номенклатуры контрагента.
Именно поэтому, в отчете фигурируют реализации со знаком минус за предыдущий период, если возврат был в этом периоде, а реализация в другом.
Добрый вечер. Подскажите пожалуйста, можно ли в этом отчете сделать детализацию по характеристикам номенклатуры?я пытаюсь добавить новую группировку, но там нет параметра «характеристика»
Спасибо.
(18) Доброго времени суток.
Данный отчет писался на базе, в которой не учитываются характеристики номенклатуры.
Придется дописывать.