Проверка по начислению НДС с авансов




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

24 Comments

  1. gutentag

    Пожелание(Примечание) к обработке:

    1. переделать обработку во внешний отчет (а то имхо некошерно получилось)

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

    И если в «наименование договора» у Поставщика имеется указанный выше «признаку», то можно контролировать счет 76.ВА и расчеты по НДС с постаавщиками. Имхо.

    Reply
  2. zzerro

    (1)

    1. А чем внешняя обработка «некошерно»?

    2. Если потребуется для нашей деятельности такое, то и это предусмотрим

    Reply
  3. gutentag

    ИМХО обработка, по своей сути, должна своим функционалом что-либо изменять в регистрах прогрммы. А ваш отчет только показывает данные сгруппированные особым образом и ничего не делает(т.е.не вносит изменений и не создает каких-либо новых записей) 🙂



    ps. вот пример отчета(но не мой) немного похожего на ваш 🙂

    http://infostart.ru/projects/3288/

    Reply
  4. zzerro

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

    P.S. На будушее приму к сведению

    Reply
  5. Anything

    (3) В приведенном Вами примере «отчет» как раз изменяет регистры. Например, может перепроводить документы.

    Так что, различие между отчетом и обработкой весьма условно. А формат *.erf или *.epf выбирается исключительно из соображений использования СКД. 😉

    Reply
  6. Alav

    А что означает вкладка «сальдо 62/76». А то он неправильно там данные выводит

    Reply
  7. zzerro

    Там должны отображаться итоги на счетах 76.АВ и 62.02 на дату окончания периода.

    Reply
  8. Alav

    А почему в процедура ОборотыКт6202Дт76АВ используется только счет 51. Что авансы по кассе прийти не могут?

    Reply
  9. zzerro

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

    Reply
  10. YAN

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

    Но в твоем коде есть недостаток!

    это:

    Запрос.УстановитьПараметр(«ДатаКон», КонецДня(ДатаКон));

    его необходимо заменить (везде) на:

    Запрос.УстановитьПараметр(«ДатаКон», Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая));

    Да и еще очень не хватает итогов!!! Они бы облегчили жизнь бухгалтера.

    Reply
  11. gutentag

    Ошибка в отчете: обработка не видит документов «возврат от покупателя(а может быть и поставщика». Но видит ихние счета-фактуры.

    Специально проверял: там где отчет выдает отклонения — были возвраты от покупателя(были ли возвраты поставщику и возвраты через Р/С — я не проверял)

    Reply
  12. gutentag

    + еще одна ошибочка: обработка не видит проведенные документы по реализации , но у которых нет проводки 62 — 90 и 90 — 68-ндс (образовалось из-за автоматической замены/оставления только одного договора у клиента при перепроведении документов)

    \

    Reply
  13. ValeraEm

    Согласен с замечанием (10)

    «Но в твоем коде есть недостаток!

    это:

    Запрос.УстановитьПараметр(«ДатаКон», КонецДня(ДатаКон));

    его необходимо заменить (везде) на:

    Запрос.УстановитьПараметр(«ДатаКон», Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая));»

    Для «Остатки» и «ОстаткиИОбороты» актуально!

    Обработка полезная. Жизнь главбуху облегчила. Савлю плюс

    Reply
  14. zzerro

    о_О … я разве не исправил еще? значит забыл обновить, поправлю.

    Reply
  15. zzerro

    (13) Исправил этот косячок ❗

    Reply
  16. husky

    с УПП будет работать?

    Reply
  17. zzerro

    (16) К сожалению или к счастью УПП у нас нет и видеть ее не видел, так что сказать по этому поводу ничего не могу, скачайте и попробуйте

    Reply
  18. husky

    Обработка не видит операции по документу Корректировка долга. Нужно подправить в блоке Дт62.02 Кт 76.АВ, и наверное в блоке К62.02 Д76.АВ

    Reply
  19. ash2015

    БЛАГОДАРЮ! 🙂

    Reply
  20. zzerro

    Обновил обработку (добавил еще один файл) для редакции Бухгалтерия предприятия 2.0 (платформа 8.1, хотя если сконвертировать то и для 8.2 тоже наверно подойдет, не пробовал еще)

    Reply
  21. nookie

    Здравствуйте. Использовали Вашу чудесную обработку на реальной базе, в которой велся учет в 1С: БП 8 ред.2.0 целый год и возник ряд замечаний:

    1. При проверке сальдо 62.02 и 76.АВ (третья закладка) не совсем красиво схлапываются субконто. Судя по всему сделано намеренно, но в случае когда у нас несколько договоров очень тяжело сверять данные. Дело в том, что в субконто №2 попадают и расчетные документы (как субконто 76.АВ) и договоры (как субконто 62.02). Предлагаю Вам выполнять полное сцепление аналитик, вытаскивая для счета 76.АВ в качестве второго субконто договор из документа расчетов (заодно получите еще одну потенциальную возможность выявления ошибок, которые случаются если аванс перевесили на другой договор, а счета-фактуры на аванс не переформировали — в итоге сальдо идет, а потом зачет не происходит). И данная закладка будет красивее и функциональнее.

    2. При проверке сальдо 62.02 и 76.АВ (третья закладка) очень желательно реализовать отбор по виду взаиморасчетов договора путем выбора «в списке». Иначе существенная часть аудитории пользователей обработки выпадает. Объясню почему: у некоторых предприятий часть деятельности НДС не облагается. Скажем, если предприятие продает софт (НДС не облагается) и оказывает услуги (НДС облагаются). Такие предприятия, как правило, на каждый такой договор заводят вид взаиморасчетов и проставляют особый порядок учета авансов.

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

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

    3. На закладке «Сальдо 60,62» лучше сделать прямо на форме возможность быстрого отбора по контрагенту. Зафиксировано пожелание в 100% случаев из 100.

    4. На закладке «Реализации без с/ф» добавить в запрос дополнительное условие не включать в результат те документы, в реквизите «Сумма» которых ноль. Такое бывает 🙂 У некоторых даже в избытке

    Вроде все. Удачи в развитии обработки. Очень надеемся, что совместными усилиями она превратится в первую по-настоящему полнофункциональную обработку для проверки НДС.

    Reply
  22. sfo

    Работает ли обработка на 8.2?

    Reply
  23. natalika1601

    Работает на 8.2! Отлично, большое спасибо

    Reply
  24. ssn5810

    отличная обработка, просьба, можно чтобы » БезНДС» в отчет не попадало.

    Reply

Leave a Comment

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