[NALOG] Разброс цен для НУ (статья 40, п.2, пп.4, п.3)




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

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 не будет опубликован. Обязательные поля помечены *