Простой отчет по себестоимости, прибыли и наценке для УТ 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='\

12 Comments

  1. Terve!R

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

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

    Reply
  2. evn-zorin

    А чем типовой отчёт «Валовая прибыль» не устроил?

    Reply
  3. sergey_at

    1. Типовой отчет «Валовая прибыль» не устроил тем, что он работает отлично, когда партии в минус не уходили. А когда частенько сначала продавали, а только потом приходовали — себестоимость он определить просто не может. Отчет для этого и сделан, чтобы не заморачиваться с восстанвлением последовательности партий.

    2. Добавить последнего поставщика — можно даже не дорабатывая этот отчет: есть поле «Последняя Закупка» из него можно добавить. Если у кого не получается — пишите — помогу.

    Reply
  4. V.Nikonov

    Для оперативного учета надо сделать:

    • Определить ТипЦен Плановой себестоимости
    • Обязать регистрировать Плановую себестоимость при каждом Приходе товара
    • Дополнить Конфигурацию:

    В частности, для быстрого анализа модифицировал РегистрНакопления.Продажи. В него добавлен Ресурс ПлановаяСебестоимость.

    В документы регистраторы, добавлен механизм расчета ресурса. А в отчет по регистру, дополнительный расчетный ресурс — Наценка.

    Ещё добавил Спец.Обработку для перерасчета движений Регистра за период, т.к. в приходных накладных часто допускали Ошибки и перепроводили Задним числом (изменяли Плановую Себестоимость).

    При Желании можно пополнить Специализированные отчеты…

    Reply
  5. V.Nikonov

    (3) Любой расчет Прибыли на основе Плановой Себестоимости — будет не точным. Партионность — учитывает «Переоценки товарных Запасов».

    Reply
  6. sergey_at

    (4) V.Nikonov, Если программа ПРАВИЛЬНО настроена, то отлично сработает встроенный отчет «Валовая прибыль».

    А этот мой отчет нужен тогда, когда много косяков в партиях. и нет фикчации цен поступления. При этом ничего дорабатывать в конфигурации не надо. Включил — и сразу работает. И пофиг на партионный учет, а также на фиксацию цен. Результат — сразу. Если документ поступления вообще отсутствует — ничего. Посчитает наценку 100%. Это тоже нормально.

    Reply
  7. user666352_arcor

    а возврат товара он учитывает ?

    Reply
  8. sergey_at

    Да. Продажи берутся из регистра накопления «Продажи», а возвраты там учитываются тоже. Если нужно как-нибудь изменить алгоритм и/или добавить столбики/показатели/группировки — пишите — буду рад помочь.

    Reply
  9. Alik

    Отличное решение, но что делать с «Доп затратами» ?

    Reply
  10. user677344_fomin-innokentii

    шибка исполнения отчета

    по причине:

    Ошибка получения данных

    по причине:

    Ошибка создания набора данных «НаборДанных1»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    Ошибка выполнения запроса

    по причине:

    Ошибка при выполнении операции над данными:

    Ошибка SQL: Деление на 0

    по причине:

    Ошибка SQL: Деление на 0

    по причине:

    Деление на 0 значения типа Numeric

    «Управление торговлей», редакция 10.3 (10.3.36.1)

    Reply
  11. chaos555

    Здравствуйте . А можно сделать, что бы отчет показал среднюю цену.

    (10)

    Reply
  12. sergey_at

    Так он среднюю (продажную) и показывает. Максимально подробно, что вы хотите?

    Reply

Leave a Comment

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