Оплаченные реализации УТ 10.3. Оплаченные реализации по товарам УТ 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='\

27 Comments

  1. lunjio

    Прикольно, как такого плана отчет может не учитывать договора ? Нужно учитывать, что у некоторых ведение взаиморасчетов может быть в разрезе договоров, в данном случае как минимум в вашем отчете надо такие оплаты по fifo распределять, как максимум в самой организации подход надо менять, если надо в разрезе заказов учитывать, значит надо менять ведение взаиморасчетов. В таком случае все сводится к просмотру отчета взаиморасчеты.

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

    Reply
  2. apostal86

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

    Reply
  3. Rustig

    (0) реализация конечно непонятна, и как в СКД реализовать распределение по ФИФО?

    Reply
  4. lunjio

    (3) Ну как обычно два варианта, либо при помощи функций скд, но тогда не получится отбросить реализации на которые ничто не попало по итогам, либо сразу в запросе отчета, разве трудная задача нарастающего итога и распределения оплаты по нарастающему итогу ?

    Reply
  5. KVIKS

    (1) Согласен, договора нужны, но пока задача стояла разобрать контрагентов в целом без договоров. и отчет больше предназначен, для того чтобы посмотреть что оплата перекрыла себестоимость товаров или нет + в моем случае менеджеры получали зарплату не от валовой прибыли документа, а именно от того сколько клиент оплатил этой прибыли, поэтому пропорционально рассчитывается оплаченная наценка. А то реализации можно выписать много, а живых денег нету.

    Reply
  6. KVIKS

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

    Reply
  7. KVIKS

    (3)Там не только СКД, а в нее передаются внешние источники расчитанные и подготовленные

    Reply
  8. Rustig

    (7) вот-вот, и я об этом. ну значит, заранее подготовленные данные. понятно.

    Reply
  9. lunjio

    (5) А то реализации можно выписать много, а живых денег нету — Обычно это жестко контролируется, например при проведении реализации, как правило, а печать первичных из не проведенных запрещается.

    В целом может и корректно поступаете, отгружаете, когда клиент оплатил себестоимость как минимум.

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

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

    Reply
  10. Rustig

    (4) я думаю, что с помощью запросов ФИФО не реализуется.

    Я к платформе отношусь так:

    1) есть набор инструментов платформы — с помощью которого реализуется та или функциональность;

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

    СКД не исключение — СКД не является универсальным инструментом, с помощью которого можно реализовать сложные алгоритмы распределения вроде ФИФО. И помните, что в ФИФО есть «задача копеек».

    2) и есть алгоритмы, которые универсальны и с платформой не связаны — чаще всего сложные алгоритмы реализуются именно через заранее подготовленные данные, затем они обрабатываются;

    ФИФО — это один из самых распространенных способов решать ту или иную экономическую задачу, чаще всего ФИФО

    реализуется через алгоритмы, а не через запросы.

    Reply
  11. starjevschik

    (3) фифо можно в запросе сделать.

    (1) частично прав, надо отдельно рассматривать взаиморасчеты по заказам и по договору в целом. Но идея отчета правильная, много кому такой нужен.

    Reply
  12. Rustig

    (11)

    фифо можно в запросе сделать.

    есть ссылки на примеры?

    мы с вами, возможно, о разном говорим….

    Reply
  13. lunjio

    (10)

    Прямо тут в псевдокоде обьяснить могу, берете таблицу реализаций и реализуете нарастающий итог, по методу мадам Баттерфляй, ildarovic’а ))) или по классическому, далее левым соединением соединятесь с таблицей где договор и оплата, по условию : ТаблицаРеализаций.договор = ТаблицаоплатПоДоговорам.Договор И ТаблицаРеализаций.договор = ТаблицаоплатПоДоговорам.СуммаОплаты > ТаблицаРеализаций.СуммаНакопленныйИтогБезУчетаТекушей. Затем через выбор когда тогда «отщипываете» от оплаты по договору необходимую сумму на данную реализацию, думаю смысл понятен. В целом никто не мешает в коде реализовать, но задача не архисложная, недавно реализовал распределение резервов и свободно ожидаемых заказов поставщиков по потребностям, в запросе, по принципу фифо.

    Reply
  14. starjevschik

    (12) я сам делал

    ссылок вообще-то полно

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

    Reply
  15. Rustig

    (14)

    делаешь таблицы с нарастающими итогами

    нарастающий итог на каждый день или как? на какую дату наращивать итоги?

    Reply
  16. Rustig

    (14) отгрузки и оплаты — начиная с какой даты или какой отгрузки? с начала года?

    Reply
  17. Rustig

    (14) как узнать по каким реализациям долг закрыт? чтобы не пересчитывать лишний раз в запросе?

    Reply
  18. Rustig

    (13) вроде как поверхностно подходит, есть же подводные камни. мне вот пока не нравится нарастающий итог — с какой даты наращивать, до какой ?

    Reply
  19. KVIKS

    Ребята не спорьте, фифо сделать в скд можно, но мудрено, и может не для всех задач. Для этого отчета фифо в скд очень проблематично, потому что незакрытый долг у каждого клиента на разные даты висит. Была бы общая отправная точка то можно сделать,а поскольку в долгах общая дата это ввод остатков, то делать это в запросе не целесообразно.

    В данном примере подготовлены таблицы для СКД

    Кому интерсно для ут 11 тоже готовлю такой отчет, скоро будет.

    Reply
  20. starjevschik

    (15) за все время ессно. Если у договора есть реальные даты, то надо по каждому договору собирать во время его действия.

    Что такое ФИФО? Выпиши в столбик оплаты, в соседний столбик отгрузки. Совмести столбики, увидишь, что чем оплачено. Вот точно так же и пишем о)

    Reply
  21. starjevschik
    Reply
  22. lunjio

    (18)

    До какой, думаю вопрос не совсем корректен, а то, как именно отправная точка ФИФО будет определяться, тоесть порядок, зависит от того какое у вас соединение в условии запроса будет где собирается нарастающий итог, сделаете по моментВремени >=, будет фифо, обратный знак — лифо, можно по каким-то другим критериям

    Reply
  23. lunjio

    (19) Вы про какой не закрытый долг ?

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

    Что за дата ввода остатков ? давайте проясним — если вы ввели остатки, вы как правило занесли итоговый остаток по контрагенту в разрезе какого-то договора, наш долг ему или его нам, какие ещё отправные точки ? Как итог, в вашем «продукте» не хватает распределенных оплат по тем договорам, у которых ведение по договору в целом, без документов расчетов, сделать это не сложно, соответственно логично, что если по договору целом, то мы распределяем по методу ФИФО, а не каким-либо другим способом, если это не совсем так с точки зрения бизнес логики предприятия, значит у такого договора не должно стоять по договору в целом.

    Reply
  24. mariya.mary.00

    Добрый день!

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

    Заранее спасибо)

    Reply
  25. KVIKS

    (24)

    Добрый, при желании все можно, добавится еще 1 аналитика

    Reply
  26. mariya.mary.00

    (25)А не подскажите поподробнее,пробовала переделать запрос,но не получила нужный результат.

    Интересует именно отчет,который по номенклатуре.

    Reply
  27. evn-zorin

    годный отчёт! ещё бы вариант на выбор фифо и стандартный по разноске платежей

    Reply

Leave a Comment

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