Валовая прибыль для УТ, УПП с анализом по типу цены




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

38 Comments

  1. zarius

    (1) Возможно! Но почему то не нашел когда искал пару недель назад…

    Если есть возможность — «ссылки в студию»…

    Reply ↓
  2. zarius

    По поводу аналогов: недавно появилась обработка «Отчет по валовой прибыли УПП» (http://infostart.ru/public/68586/). Данный отчет отличается отсутствием выбора конкретного типа цены и, что самое главное, по ценам берется «срез последних». В предлагаемом мной отчете цены расчитываются на дату документа продажи, т.е. в расчете будет учавствовать именно та цена которая была на момент продажи, что, ИМХО, более правильно.

    Reply ↓
  3. mir1m

    видимо что-то с поиском на сайте.

    вот так работает:

    http://www.google.ru/search?hl=ru&lr=&newwindow=1&q=site:infostart.ru+валовая+прибыль&start=20&sa=N

    Reply ↓
  4. zarius

    (4) может я как то не так ищу? данный поиск не дал ссылок на какие-либо обработки с подобным функционалом (правда я платные разработки не смотрел). Из бесплатных — самая приближенная по смыслу разработка описана в посте 3 (там же и отличия). Возможно я что-то пропустил, если есть возможность, Eugeneer и mir1m, наставьте на путь истинный…

    Reply ↓
  5. igor_gk

    (3) Тоже не нашел и тоже сомневаюсь, что вы имеете ввиду бесплатную обработку 😉

    Reply ↓
  6. zarius

    почти 100 скачиваний и всего 3 комента …. 😥

    Reply ↓
  7. zarius

    Если кому то надо добавить возможность пересчета в выбранной валюте — сообщите

    Reply ↓
  8. gogast

    не подцепляет цены товара если ведётся учёт по характеристикам номенклатуры, а цены на отдельные характеристики не заданы

    и в итогах зачем то пишет цену расчёта

    Reply ↓
  9. zarius

    (9) хм… вообще то по поводу цен с характеристиками — согласен, что может быть и такое, когда характеристики ведутся, а цены устанавливаются без учета характеристик…

    В принципе особо страшного ничего нет — пишите в личку… расмотрим варианты доработки…

    По поводу цены расчета в итогах — выводится максимальная встреченная цена по обходу запроса — это сделано для упрощения вывода цены расчета из запроса — вообще эта колонка носит больше информативный характер и вывожу ее лишь для удобства. Т.е. все группировки (в т.ч. по номенклатуре/группам номенклатуры) показывают лишь максимальную цену в пределах данной группировки. Передо мной не стояла задача показать по каким ценам были продажи, поэтому отдельной группировки по ценам не ведется. Расчет же выполняется корректно.

    Reply ↓
  10. gogast

    он просто считает что цены не установлены… со всеми вытекающими

    Reply ↓
  11. zarius

    (11) я прекрасно понимаю что в этом случае не считает 🙂

    Reply ↓
  12. zarius

    (11) тут вариантов несколько:

    1) доработать отчет самим (код открыт)

    2) ждать когда у меня дойдут руки до этого

    как вариант — если отчет для вас интересен, при небольшой денежной стимуляции я скорее всего пересмотрю сроки решения данной задачи…

    Reply ↓
  13. imshev

    Отчет работает на РАУЗ?

    Reply ↓
  14. sashtet

    Спасибо за отчет, что раньше считал в ручную , то в твоём отчете прям на экран выскакивает.Мне очень подравилось совмещение стандартого отчета Валовая прибыль и твоего блока Валовая прибыль по ТЦ.При наличии распределения доп.услуг на поступление товаров в стандартом отчете показывается реальная себестоимость, а вот посмотреть реализацию в цене закупа не посмотришь.У тебя и то и то видно…Спасибо!

    Reply ↓
  15. Craig

    У меня УПП, и проблема с себестоимостью, какой тут принцип расчета?! откуда берется себестоимость?

    Reply ↓
  16. Craig

    У меня переменной себестоимостью является сумма затраты на выпуск, можете для меня сделать этот же самый отчет только в место вашей себестоимости поставить себестоимость из вот такого документа «Отчет производства за смену 00000000001», и в место рентабельности рассчитывать маржинальную прибыль. ???

    Reply ↓
  17. sashtet
    Craig пишет:

    У меня УПП, и проблема с себестоимостью, какой тут принцип расчета?! откуда берется себестоимость?

    Этот отчет не показывает себестоимость в прямом виде.В отчете можно отразить валовую прибыль на один и тот же товар , но в двух типах цен, к примеру цена закупа и цена продажи.Если цена закупа и есть себестоимость(если не было других накладных расходов при осуществлении сделки),то это и есть себестоимость.Если при сделке пришлось доставить товар до покупателя, то эти расходы, я лично распределяю на накладную закупа документом «Услуги сторонних орг.», себестоимость перераспределяется или по сумме (деньги) или по кол-ву…,себестоимость товара увеличивается,валовая прибыль уменьшается…

    Reply ↓
  18. Kostalmed

    Спасибо за отчет!!! Весьма помог! От начальства поступило как раз на разработку аналогичного отчета. по неведомым причинам стандартный отчет не подходил. так что спасли можно так сказать!!!!!

    Reply ↓
  19. zarius

    (19) ну… я рад, что отчет пригодился 🙂

    кстати, если кому надо такой отчет, но по оплате — пишите в личку…

    Reply ↓
  20. Tota

    На РАУЗе работает?

    Reply ↓
  21. zarius

    (21) нет

    Reply ↓
  22. revril

    спасибо за отчет)))

    Reply ↓
  23. байт

    Неплохой отчет помог, только кое-что пришлось переделать изменить тип цен, не номенклатуры, а номенклатуры контрагентов, а так помог, использовал для Комплексной автоматизации редакция 1.1.9.1 по РАУЗу валовая не формируется да и вообще типовой отчет Валовая прибыль в КА кривой, позже познакомился с произвольными отчетами в типовой демо версии КА получилось еще быстрее, спасибо!

    Reply ↓
  24. zarius

    (28) не совсем понял что имелось ввиду

    Reply ↓
  25. revril

    а это под 8.1 или 8.2 отчет?

    Reply ↓
  26. zarius

    (30) изначально писалось для 8.1, чтобы на 8.2 заработало — просто конвертируй в 8.2

    Reply ↓
  27. sashtet

    До сих пользую этот отчет, еще раз спасибо!

    Reply ↓
  28. revril

    ага__спасибо))конвертировала!!все нормально работает))

    Reply ↓
  29. Halabala

    Спасибо за отчет. Весьма полезен будет. А то стандартный «Валовая прибыль» вообще не годится.

    Reply ↓
  30. sashtet

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

    Reply ↓
  31. sinjevla

    Отчет хороший вот только партий не учитываются. Мне так кажется это не совсем правильно.

    Reply ↓
  32. AlexO

    (8)

    Если кому то надо добавить возможность пересчета в выбранной валюте

    эдак вы одним отчетом и мультивалютность реализуете в УПП и УТ? 🙂

    Reply ↓
  33. zarius

    (37) что значит «партий не учитываются»? Себестоимость считается как раз по партиям. Это по сути — типовой отчет «Валовая прибыль» с доп. колонками пересчета стоимости в соответствии с выбранным типом цены.

    Reply ↓
  34. zarius

    (38) посмотрите на http://infostart.ru/public/69323/ — это по сути немного переделанный вариант текущей разработки — там есть вариант с пересчетом в выбранной валюте…

    Reply ↓
  35. sinjevla

    (39) Типовой отчет считает все верно, а вот дополнительные колонки не совсем или я что-то не догоняю и хочу разобраться.

    Примеры писать не очень хочется, но посмотрим …

    Цены рассчитываются на дату документа продажи! что есть не совсем правильно так как товар может быть из более ранней партии и его закупочная цена не равна той цене которая стоит в день его продажи.

    Хотя по большому счету.

    Reply ↓
  36. zarius

    (41) не совсем понимаю ход ваших мыслей… складывается впечатление что вы хотите в колонке пересчета от цены получить реальную себестоимость по партии… зачем? Реальная себестоимость у нас есть в колонке «Себестоимость», и она считается как в типовом отчете — по партиям. Колонки пересчета от типа цен сделаны для другого — это средство анализа продаж от типа цены. Бывает такие ситуации когда реальный закуп пляшет с большим разбросом, но тип цены закупа не меняется (закупили товар у другого поставщика по бросовой цене (возможно даже нулевой) и т.д.). В этом случае по партиям данный товар будет давать разную себестоимость и как результат — различную валовую прибыль. Это бывает не совсем удобно когда необходимо оценить результативность отдела продаж (особенно когда ЗП отдела продаж зависит от заработанной маржи), посмотреть среднюю наценку и т.д. В этом случае можно воспользоваться текущим отчетом и рассчитать данные в пересчете от выбранного типа цены. Повторюсь — это средство анализа — не надо в этих колонках искать себестоимость и т.д.

    Reply ↓
  37. adhocprog

    (0) ценный отчет! спасибо автору )

    Reply ↓
  38. vis_tmp

    Спасибо, очень пригодилось — взял отчёт как основу для своего!

    Reply ↓

Leave a Comment

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