[NALOG] Разброс цен для НУ (статья 40, п.2, пп.4, п.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='\

31 Comments

  1. Добавлю чуток описания:

    — Отчет служит для выявления «потенциальных опасностей», возникших

    из-за несоответствия положению НК.

    — возможен расчет «разбегания» цен по двум алгоритмам: МАКС-МИН/Средневзвешенный

    — в полученном отчете указываются документы, в которых выявлены «несоответствия».

    — ВНИМАНИЕ!!! При использовании возможностей множественного фильтра возможно

    «искажение» отчетных данных, так как использованием МФ вы «обрезаете» набор

    документов для анализа — имейте это в виду! Используйте с умом…

    Reply
  2. harleq

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

    Reply
  3. будут соображения по улучшению — пиши.

    В использовании все понятно было? Вопросы есть?

    Reply
  4. Хочется предупредить: средневзвешенная цена продажи СЧИТАЕТСЯ исходя из продаж, зарегистрированных в базе — принимая допущением, что продажные цены в фирме отражают рыночную ситуацию… Так что данные этой программулины надо принимать как «первое приближение»…

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

    Reply
  5. CheBurator

    Главное, никому в конторе этот отчет не показывать кроме ГБ (а он его должен иметь под рукой вдали от глахз проверяющих) — чтоб на вопрос, а хрен ли у вас цена так сильно скачет смело рассмеялся в лицо — не скачет а колебается в пределах 7% — ах не верите? что, первичку дать чтобы посчитали — ну нате… не жалко 1400 накладных за месяц, щитайте… 😉

    Reply
  6. Снусмумрик

    у нас 60 тысяч накладных в месяц 🙂

    задолбаются считать

    Reply
  7. Ну и я так говорю… Эта обработка для параноидальных ГБ, потому как если начнут в эту сторону копать — это значит ничего другого не нашли, что, сам понимаешь — практически невероятно. Был бы человек, а статья найдется… Никто не будет сажать за порез перочинным ножиком, когда ты 3 старушек замочил топором с изощренной жестокостью… 😉

    Reply
  8. LysI

    Очень полезная штука.

    Reply
  9. CheBurator

    Добавил картинку в описание

    Reply
  10. CheBurator

    Поправил ошибочку.

    Reply
  11. sll

    > под БУХ ее переточить — проблем не представляет.

    а можно для больных и слабых, а? 🙂

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

    Reply
  12. CheBurator

    Я думаю, можно… Цена вопроса?

    Reply
  13. sll

    > Я думаю, можно… Цена вопроса?

    цена неимоверно велика! будет вам большое человеческое спасибо! 🙂

    Reply
  14. victuan

    А почему не для всех стандартных конф на оперативном учете?

    Для 1С:Предприниматель слабо?

    Reply
  15. CheBurator

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

    .

    была у меня еще идея в качестве индикатора рыночных цен тянуть данные с инет-торговых площадок, но это существенно усложнит использование для неквалифицрованных «буЛгахтеров»…

    Reply
  16. victuan

    (15) Да, переделать можно. Наверное, лучше сделать в виде отдельной обработки, т.к. придется попутно выкинуть разрезы: Проект, Фирма, УпрАналитика, ЮрЛицо, Свойства номенклатуры и контрагентов.

    Reply
  17. victuan

    А зачем обрабатывать НП?

    Его уже давно нет и не предвидется.

    Reply
  18. CheBurator

    Выкидывать-то необязательно, достаточно проверить идентфикаторы типовых конф и разветвить…

    Reply
  19. CheBurator

    (17) а нехай будет… есть не просит.. и тем более — ВДРУГ…

    Reply
  20. victuan

    (18) Разветвить в общем виде не получится, т.к. вызываются ф-и гл.модуля ТИС, которых нет в ИП

    Reply
  21. victuan

    Я люблю универсальные решения.

    Добавил ветвление для ИП: изменения в модуле пометил комментарием //PBOUL

    Добавил новый слой на форму (Разделитель), чтобы скрыть переключатели для ИП.

    Исправил ошибку, убрав формулу «ПриИзмененииДаты()» для реквизитов ДатаНачала и ДатаКонца.

    Исправил ошибку, назначив виды справочников для ВыбРазделительХ.

    Просьба протестить и включить в свою разработку 😉

    Reply
  22. victuan

    Осталось сделать для Бух.

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

    Reply
  23. CheBurator

    (21) ок, посмотрим, включим.

    (22) давно было.. 4 года назад… сейчас уже и не упомню…

    Reply
  24. victuan

    Вот, переделал на скорую руку для Типовой Бухии. Работает.

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

    Reply
  25. victuan

    Исправил ошибки:

    1) Убрал отбор по Автору, т.к. в типовой бухии его нет

    2) Исправил ошибку во Множ.фильтре — не работал отбор по Номенклатуре: для этого везде в тексте модуля заменил «пзНоменклатура» на «Номенклатура»

    3) Исправил ошибку, которая появляется в случае реализации товара по нулевой цене.

    Ошибки 2) и 3) присутствуют и в автороской обработке для оперативного учета 🙁

    Reply
  26. CheBurator

    О! Пригодилось…

    Всплыла тонкость: при торговле с разными ставками НДС — для контроля надо использовать цену, «очищенную» от НДС — иначе будет искажение данных. То бишь надо посмотреть в отчет — я там судя, по всему, из регистра «ПРОДАЖИ» собираю именно по конечной цене для покупателя, т.е. с НДС.

    Ну и по бухверсии — тоже надо смотреть аналогично — там может быть проще — можно юзать себсетоимость продаж.

    Reply
  27. CheBurator

    судя по всему цена у меян в отчете уже получается очищенная от НДС…

    Reply
  28. CheBurator

    (25) > 3) Исправил ошибку, которая появляется в случае реализации товара по нулевой цене.

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

    Reply
  29. CheBurator

    Опочки, косячок: отчет не учитывает если в типе цены задана скидка, берется цена без скидки…

    Reply
  30. victuan

    (30)Эту ошибку я не выявил, т.к. юзаю Предпринимателя, а в нем скидки не реализованы. Будешь исправлять, учти чтоб и у Предпринимателя работало.

    Reply
  31. CheBurator

    Существенно доработал в части обработки для торговой конфигурации…

    .

    — учитываются продажи через комиссионеров;

    — протоколирование расчета средневзвешенной цены (в Консультанте в свое время нарисовали заумную хрень, все считается проще); расшифровка значения средневзвешенной цены в отчете; расчет «неучтенной» суммы как разницы между ценой продажи и макимально допустимы отклонением, в данную сумму не следует включать отгрузки по ставке 0%;

    — ускорено формирование отчета;

    — ошибки прочие мелкие;

    .

    Если надо — торговый вариант тебе могу презентовать.

    Reply

Leave a Comment

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