Валовая прибыль. УТ 10.3, не партионный учет




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

19 Comments

  1. V.Nikonov

    А за большой период (Квартал, Год) считает? А как это делается (если за период отчета менялась Цена закупки)?

    А группировки меняются? Можно увидеть свод по Подразделениям, Складам, Клиентам?

    Reply
  2. Scorpanatoly

    1. Да, считает за любой период. Он берет последнюю цену из документа регистратора регистра сведений «Цены номенклатуры контрагента» на момент документа реализации товара. Т.е. например была изменена цена номенклатуры контрагента 03.06.17 года в 13:51:00. Себестоимость документа реализации от 02.06.17 года, и от 03.06.17 13:49, например, он посчитает по старой цене, документа от 03.06.17 13:52 — уже по измененной. В данном случае период не важен. Он может быть любым.

    2. Да, меняются. Да, можно. Отчет сделан полностью в СКД, соответсвенно группировки можно менять любым образом. По реквизитам документа продажи, справочника номенклатуры. Хоть склады, хоть ответсвенный менеджер за номенклатуру, хоть контрагенты, хоть ответсвенный за документ.

    Reply
  3. Scorpanatoly

    (1)

    1. Да, считает за любой период. Он берет последнюю цену из документа регистратора регистра сведений «Цены номенклатуры контрагента» на момент документа реализации товара. Т.е. например была изменена цена номенклатуры контрагента 03.06.17 года в 13:51:00. Себестоимость документа реализации от 02.06.17 года, и от 03.06.17 13:49, например, он посчитает по старой цене, документа от 03.06.17 13:52 — уже по измененной. В данном случае период не важен. Он может быть любым.

    2. Да, меняются. Да, можно. Отчет сделан полностью в СКД, соответсвенно группировки можно менять любым образом. По реквизитам документа продажи, справочника номенклатуры. Хоть склады, хоть ответсвенный менеджер за номенклатуру, хоть контрагенты, хоть ответсвенный за документ.

    Reply
  4. doctorov_s

    Добрый день! Отчет работает не верно, не все реализации попадают! сможете поправить??

    Reply
  5. Scorpanatoly

    (4)

    Доброго времени суток!

    Интересует конкретика. Какой релиз УТ? Какие именно реализации не попадают? У меня все работает верно.

    Два предположения навскидку:

    1. Не попадают реализации, где нет товаров, а только услуги. Их нет в регистре цен номенклатуры контрагентов, соответсвенно они не попадают.

    2. Не попадают реализации, где не установлены цены номенклатуры контрагентов на дату реализации.

    Просмотрите номенклатуру в этих реализациях, посмотрите регистр сведений цены номенклатуры контрагентов на дату документов. Исходя из этого, решим Вашу проблему.

    Reply
  6. Scorpanatoly

    (5)

    При данных вариантах., можно будет подумать об обработках чтобы например создался документ Установка цен номенклатры контрагента со всей номенклатурой, и, скажем, установкой цены 0 у нее с датой раньше всех реализаций. И, например, обработка, которая на основании поступления товаров и услуг, где не стоит галочка «регистрировать цены поставщика», создавать документы Установка цен номенклатуры контрагентов с датой поступления и ценой документа.

    Reply
  7. doctorov_s

    Вы могли бы дописать чтоб продажи попадали все и товары и услуги (хотя бы товары) даже если НЕТ «Цен номенклатуры контрагента» Потому что вижу что продажи не все, а где искать? Получается если возникло расхождение нужно делать реестр документов и крыжить вручную с вашим отчетом. Я хотел уйти от перепроведения и экономить время вашим отчетом. А тут другая байда.

    Reply
  8. Scorpanatoly

    (7)

    Отправил отчет Личным сообщением.

    Reply
  9. soi

    (8)

    На данном скриншоте выделено желтым в колонке сумма продажи ,где и произошли расхождения со стандартным отчётом в демо версии УТ 10.3, также не попадает возврат товара, если необходимо можем прислать вам копию базы.

    Reply
  10. Scorpanatoly

    (9)

    Доброго времени суток!

    В документе «Возврат товара от покупателя» в табличной части в столбце «Документ партии» вводится документ реализации, по которому проходит возврат товара. Отчет выводит сумму продажи по реализациям с учетом возврата по этим реализациям. Т.е. например реализация была на сумму 100 рублей. Затем был возврат нескольких позиций по этой реализации на сумму 30 рублей. Отчет покажет реализацию на 70 рублей и посчитает валовую прибыль также с учетом возврата.

    Проверьте этот момент.

    Проверить можно просто взяв для примера несколько возвратов по реализациям, и сделать отбор по данным реализациям в отчете.

    Ну уж если совсем непонятно, то присылайте копию, посмотрю.

    Reply
  11. soi

    (10)

    И вам доброго времени суток.

    В некоторых документах именно так и считает и цифры сходятся, но в других всё иначе.

    Как вы считаете сумму продажи и себестоимость?

    Из какого регистра берутся продажи? Можно ли сделать чтоб сумма продаж по стандартному отчету валовая прибыль и вашему отчёту совпадали во всех группировках?

    Reply
  12. doctorov_s

    (10)Что с вопросом 11?? Вы смотрели??

    Reply
  13. Scorpanatoly

    (11) (12)

    1. В отчете задействованы два регистра — Продажи и ЦеныНоменклатурыКонтрагентов.

    2. Как вариант могу предположить еще, что не проставлены цены номенклатуры контрагентов.

    Прикрепляю простую обработочку, которая проставит цены номенклатуры контрагентов. Ее необходимо чуток отредактировать под свои коды типов цен, контрагентов.

    В моей базе все совпадает. Эту к сожалению пока времени нет смотреть. Постараюсь в ближайшее время.

    Единственный нюанс. Если выбрать период, где возврат покупателя существует, а реализация находится вне периода отчета, то в отчете отобразится реализация с минусовой суммой по позициям возврата на суммы возврата.

    Можете сделать детализацию по номенклатуре в реализациях, где суммы не совпадают, и тогда увидите что именно не учитывает отчет и почему.

    В любом случае отпишитесь. Посмотрю в ближайшее время.

    Reply
  14. soi

    (13)

    Доброе утро, решили проблему, мы добавили группировку по характеристикам так как было удвоенное количество товара и сумма продаж была больше.

    Reply
  15. Scorpanatoly

    (14)

    Доброе! Хорошо.

    Reply
  16. soi

    Добрый день, отчёт работает не верно, в отчёт попадает реализации из другого периода, вы в показателях используете документ — измерение регистра продажи. С документа возврата от покупателя в это измерение пишется документ реализация относящаяся к другому периоду не заданному в отчёте. И документа возврата вообще невидно.

    Reply
  17. Scorpanatoly

    (16) Добрый день!

    Попадает документ другого периода, потому что в этом периоде был возврат части документа реализации того периода. И попадает он с минусом.

    Соответственно, для учета себестоимости возвращенного товара предыдущего периода, необходимо учитывать дату, время реализации товара и, исходя из нее, смотреть последнюю запись регистра сведений цен номенклатуры контрагента.

    Именно поэтому, в отчете фигурируют реализации со знаком минус за предыдущий период, если возврат был в этом периоде, а реализация в другом.

    Reply
  18. Vorondeath

    Добрый вечер. Подскажите пожалуйста, можно ли в этом отчете сделать детализацию по характеристикам номенклатуры?я пытаюсь добавить новую группировку, но там нет параметра «характеристика»

    Спасибо.

    Reply
  19. Scorpanatoly

    (18) Доброго времени суток.

    Данный отчет писался на базе, в которой не учитываются характеристики номенклатуры.

    Придется дописывать.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *