Валовая прибыль управленческая (в любой валюте)




Принцип обмена данными из 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='\

28 Comments

  1. WKBAPKA

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

    Reply
  2. rrrr5

    в любой валюте? 😮 да вам надо нобелевскую премию вручить!

    внеоборотные активы в управленческом учете

    Reply
  3. wildhog

    (1) (2) Удивляет сарказм )

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

    (3)Ссылка на сайт 1С:УУ не вдохновила по двум причинам :

    1. Страница «Они уже внедрили» на доработке (нет возможности сравнить с количеством внедренных конфигураций УТ).

    2. Отчет предназначен для УТ 10.3. Если в 1С:УУ данный функционал реализован — это замечательно. В УТ этого нет — а, хочется.

    Reply
  4. WKBAPKA

    как раз в данном случае это был не сарказм… я посмотрю Ваш отчет, и думаю, что поставлю плюс… имелось ввиду следующее, что взаиморасчеты с контрагентами ведуться в двух валютах, а себестомость партий товаров только в управленческой… вот это маразм и сильно портит жисть

    2(2): на лету пересчитывать из валюты в валюту нет никаких сложностей, так что нобелевскую премию можете оставить себе )

    Reply
  5. wildhog

    (4) вот именно, что пересчет идет именно по валюте упр учета, а не по валюте договора — причем основные регистры на котором строится отчет — «Продажи» и «ПродажисСебестоимость». Они то все в валюте упр учета.

    Вы правы — пересчитать на лету не проблема, выложил как готовое решение + получилось внести изменения «аккуратно» — можно использовать как «рыбу» для переделки других отчетов УТ.

    С учетом того, что почти все типовые отчеты в УТ 10.3 довольно удобны в части запроса — внесение изменений по пересчету становится очень простым делом.

    Reply
  6. WiseCATSpb

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

    Reply
  7. wildhog

    (6) Насколько помню в регистры пишутся суммы пересчитанные по курсу валюты управленческого учета на дату документа из валюты и курса документа.

    Т.о если валюта документа = валюте упр учета, а курс отличается — то, сумма которая попадет в регистр будет больше или меньше суммы указанной в документе.

    Имхо, в данном случае курс и валюта документа не играют абсолютно никакой роли — можно смело опираться на данные в регистре и курс валюты упр. учета на дату документа.

    Или я не прав? 😉

    Reply
  8. WiseCATSpb

    Вопрос в том, что например мне очень важно, чтобы в управленческий

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

    евро. Иначе говоря, при каждом проведении любого документа, в евро он

    или в рублях, в справочнике курса я устанавливливаю правильную

    цифру… В итоге я идеально вижу картину в евро, чего мне и надо…но

    для финансового отчета требуется стоимость проданного в рублях, чего

    при управленческом в евро в итоге отчетом не увидишь…приходится

    дорабатывать в Экселе, опираясь на записанный курс взаиморасчетов по

    отдельно каждому документу… К сожалению ваша обработка не выдала

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

    справочнике, для этого надо было всю базу проводить через один курс,

    указанный в справочнике, но тогда бы в отчетах по евро, встроенных в

    программу картина бы была кривая (неправильная)…Не знаю, удалось ли

    объяснить… может быть в итоге то, чего мне хотелось от подобного

    отчета — слишком сложная задача, но скорее всего через курс

    взаиморасчетов по каждому отдельному документу — это решаемо…

    Reply
  9. wildhog

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

    Reply
  10. WiseCATSpb

    сохраняется…в комментариях заполняю информацию по каждому документу…в любой момент можно снова перепровести по правильному для этого документа курсу

    Reply
  11. wildhog

    (10) Мдя…. Вам не кажется, что данное решение как минимум странно?

    Ну да ладно, Вам виднее, наверное )

    Reply
  12. WiseCATSpb

    А какие еще есть решения?…мне нужна точная евровая сумма управленческого учета…Может мне и не виднее, я просто нашла такой способ точности учета, а какие еще есть возможности?

    Reply
  13. WiseCATSpb

    подскажите…

    Reply
  14. wildhog

    (13) У тебя какая версия УТ?

    Reply
  15. WiseCATSpb

    10.3.7.9

    Reply
  16. wildhog

    Если есть возможность постучись в аське — 331631312. постараюсь помочь.

    Reply
  17. WiseCATSpb

    спасибо, обязательно, завтра

    Reply
  18. barmolei3

    Если вести управленческий учет в валюте например в USD, то при получении данных в рублях данные будут ошибочны, ниже пример:

    Купили товар по 3000 руб., курс в базе 30.00 руб., Себестоимость = 100 USD

    Продаём товар по 6000 руб., курс в базе 32.00 руб., Стоимость продажи в USD = 187,5 USD. Прибыль в USD = 87,5 USD.

    И тут самое главное, какова прибыль в рублях? Из условия видно, что должна быть 3.000 руб., но по отчёту (курс берётся на дату продажи) 87,5 * 32 = 2800 руб.

    Поэтому, чтобы отчёт выводил фактическую прибыль в рублях, надо считать так:

    ПрибыльВРуб = (ПродажиUSD * КурсНаДатуПродажи) — (СебестоимостьUSD * КурсНаДатуДокументаОприходования), т.е. в цифрах так:

    3000 = (187,5 * 32) — (100 * 30) = 6000 — 3000

    Reply
  19. rdl0

    ываыв

    Reply
  20. SDmitriy2

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

    Reply
  21. lawko

    (18) barmolei3,

    С точки зрения математики и количества денег в валюте «руб.» расчет однозначно верен, но, представьте, что Ваш бизнес жестко привязан к USD, тогда 3000 руб. для Вас не будут тремя тысячами с точки зрения прибыли на день продажи. 3000 руб. на день продажи равны 93,75 USD, но ведь это абсолютно не соответствует действительности, т.к. прибыль в долларах составила всего 87,5 USD.

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

    В 1С 7.7 похожий отчет считал прибыль в валюте, отличающейся от учетной, по курсу на день формирования отчета. Ни на день закупки, ни на день продажи, а именно на день формирования отчета. Полагаю, такой подход является правильным, т.к. аналитическую ценность отчет все равно представляет лишь в той валюте, в которой ведется управленческий учет. А остальные валюты являются лишь эквивалентом той, которая нам важна.

    Если представить ситуацию, что мы месяц торговали, а в конце месяца решили рассчитаться с поставщиками и конвертировать все полученные по сделкам деньги в валюту учета, то, в принципе, у нас и получится картина, которую выдавал нам отчет в 1С 7.7 — прибыль в рублях будет равна прибыли в долларах, умноженной на курс доллара на день формирования отчета.

    Reply
  22. mezhmidinov

    (18) barmolei3, на самом деле данный учет является правильным.

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

    Мое руководство ведет учет в другой программе и отчеты строят в 3-х валютах: Euro (товар, закупаемый в евро), USD (товар, закупаемый в USD) и руб. (товар, закупаемый в руб.). При чем все продается в рублях (по курсу на день продажи).

    И формула расчета прибыли и наценки должна быть именно (ПродажиUSD * КурсНаДатуПродажи) — (СебестоимостьUSD * КурсНаДатуДокументаОприходования), т.к. если курс берется на дату продажи в обоих случаях, то из-за скачков курса себестоимость считается неправильно.

    Reply
  23. wildhog

    (22)

    Необходимо в добавляемом запросе (процедура ИсправитьТекстЗапросаДляРасчетаУправленческойСебестоимостиИВ­ознаграждений) исправить источник данных — не Продажи, а Продажи себестоимость. И тут же Регистратор на ДокументОприходования.

    Reply
  24. mezhmidinov

    (23) вроде исправил, но выдается ошибка…»Неверные параметры»

    Reply
  25. wildhog

    Перед выполнением запроса в отладчике получите «собранный» запрос и проверьте хоть конструктором его синтаксис.

    Reply
  26. kishv

    (18) Кому удалось решить этот вопрос? ссылку дайте пожалуйста…

    Reply
  27. balmainq

    Подскажите пажалуйста, имею 1с 8,3 УТП 1.2 при формирование вашего отчета вылазит ошибка «не включать ндс в стоимость партий» как ее исправить?

    Reply
  28. Antimyslitel

    (5) Добрый день! Скачал отчет все отлично но есть один небольшой ньюанс!

    У меня валюта упр.учета Доллар а валюта рег.учета рубль. Теперь весь прикол курс к примеру 30

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

    есть какой то другой вариант? я хотел бы видеть что бы то что в договорах хоть и рубль пускай покажет и себестоимость и продажу в рублях или если поменял на доллар то в долларах! Ваш же отчет как только выбираю доллара считает по курсу но только почему то сам доллар делит на 30 а в рублях показывает цену продажи и себестоимость по цене долларовой и получается что я цена продажи 5000 рублей себестоимость 0.14 центов! в итоге прибыль 4999.86 рублей показывает или наоборот))) как мне решить данную проблему? Заранее благодарен!

    Reply

Leave a Comment

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