Синхронизация итоговых цифр АДВ-6-2 с РСВ-1




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

17 Comments

  1. Boroda

    «каких сотрудников из каких и в какие пачки перебросить…» Т.е. сделать, так сказать, «пересортицу» сотрудников, разместив их не в алфавитном порядке (и переместив из пачки в пачку) с тем, чтобы изменились округления в самих пачках, и соответственно, убралась разница с РСВ-1?

    Reply
  2. jack19

    (1) Boroda,

    Именно так. Алфавитный порядок, насколько я знаю, не особенно важен, хотя внутри каждой пачки можно после переброски и отсортировать. Важнее соответствие РСВ-1.

    Reply
  3. Boroda

    Ну, да, проще бывает подкорректировать пачки, чем спорить с туповатыми ПФР-овцами и пытаться объяснить им, что «у нас всё правильно», а расхождения идут в результате их непонимания простой арифметики и ещё дебильных требований, зачастую не учитывающих положений законодательства.

    Reply
  4. jack19

    (4) artbear, Вопрос не в том, что перебросить руками сложно, а в том, чтобы найти, кого перебрасывать и куда, чтобы одновременно совпали 4 итоговых числа. Моя обработка только даёт такую информацию, но не перебрасывает (я намеренно не стал этого делать, хотя можно было). Естественно, пачка-откуда и пачка-куда при этом имеют один ключ (тип пачки, категория з/лица).

    Reply
  5. marlen

    (5) помню что такой фигней занималась до 2010 года, потом как-то необходимость отпала , как-то по-другому что ли стала делать, ну не бывает у меня расхождения больше чем на рубль между рсв и АДВ-6-2. Просто изначально подгоняю не пачки а рсв

    Reply
  6. jack19

    (6) marlen, Если вы такая «умная», то объясните нам, чтобы мы не занимались «фигнёй»:

    1. Как вы подгоняете РСВ?

    2. Если у вас всё-таки бывают расхождения в 1 рубль, то что вы с ними делаете?

    Reply
  7. marlen

    (7) ну во-первых итого по каждой пачке давно уже в рублях с копейками показываем. Только Итого по всем пачкам в АДВ-6-2 идет в рублях. Вот это последнее проверяется со строками в РСВ (всего начислено за период, всего уплачено за период). В РСВ всегда подгоняю эти цифры к максимально приближенным результам из ЗиК (там все в копейках и видно к чему стремиться). Чтобы подогнать, внизу в разделе 2 по начисленным от базы налогам цифры по месяцам разрешается менять +-1 рубль(кроме первой итоговой колонки). Вот так и равняю чтобы в разделе 1 было расхождение с пачками и с данными бухучета максимум 1 рубль — это допустимое расхождение с точки зрения пфр.

    з.ы. на разноску уплаты в 1с77 я давно «забила», перегружаю все в пу 5, соответственно окончательные пачки формирую там

    з.ы.ы. я не «умная», а умная.

    Reply
  8. jack19

    (8) marlen, Да, сегодня работник ПФ, с которым расчетчики организации (об этом я написал выше) пытались договориться о том, чтобы он всё-таки принял пачки за 4 квартал, сказал о том, что можно округлять не каждую пачку, а итоговые суммы по пачкам. Тогда встаёт вопрос, почему об этом никто не говорил раньше и почему 1С сделала так, как сделала.

    /Вот так и равняю чтобы в разделе 1 было расхождение с пачками и с данными бухучета максимум 1 рубль — это допустимое расхождение с точки зрения пфр./

    Этим расчетчикам тоже говорили, что 1 рубль — можно. И каждый отчетный период это условие выполнялось. Но потом в ПФ сказали, что с 2010 года накопилось 3 рубля, а это не допустимо. И вот вторую сдачу организация сдает отчетность с очень большим трудом. Так что, если вы ещё с этим не столкнулись, это не значит, что вы это избежите.

    Reply
  9. marlen

    (9) Но потом в ПФ сказали, что с 2010 года накопилось 3 рубля

    ну так и ровнять надо было то в большую, то в меньшую сторону, чтобы в итоге начиная с 2010 все сходилось с бухучетом!!! У них ведь в проверках все сверки с начала 2010 идут.

    То есть данные между собой должны быть равны РСВ = БУ = пачки.

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

    Reply
  10. jack19

    (10) marlen, /ну так и ровнять надо было то в большую, то в меньшую сторону/

    Ну так, пока не возникла проблема, никто из пфр не говорил, что эти рубли копятся. Сейчас то диагноз ясен. Что касается «то в большую, то в меньшую сторону», то проще вообще под ноль. И моя обработка, которая по вашим словам занимается фигнёй, как раз и помогает свести разницу к 0 или, при необходимости, к +1(-1) рублю. Про переплату ничего не могу сказать, суммы уплаты сами как-то считаются, но чувствую, что с ними тоже могут возникнуть проблемы.

    Reply
  11. Boroda

    (6) Дело в том, что несовпадение это возникает не из-за неправильности учёта (он, за редким исключением, всегда правильный), а из-за количества формируемых пачек, т.е. от величины и сложности предприятия. На большом предприятии у вас не может не быть этой ошибки, уже заложенной в методику ПФР. Например, у меня на одном большом предприяии разница СЗВ с РСВ достигала 5 рублей, за счёт округлений до рубля в самих пачек (их было что-то около 10). Чтобы «била» арифметика итоговая сумма в АДВ «подгоняется» под эти пачки и, естественно, расходится с РСВ. Я немного доработал отчёт в ПФР, чтобы показывал суммы в АДВ с копейками (РСВ тоже смотрел с точностью до двух знаков) — и они совпали с абсолютной точностью. А с округлением до рублей разлетаются враз.

    Обработка, безусловно, хорошая и нужная, чтобы не «колупаться» вручную (я уже попробвал на практике: страховая ещё куда ни шло, а если и ту, и другую подгонять — утомительно), луше иметь её в своём арсенале.

    Reply
  12. Boroda

    Евгений, кстати, можно было бы расширить обработку и корректировать также и пачки СЗВ-6-3 (АДВ-6-4), т.к. там тоже возникает расхождение по этому поводу.

    Или сделать отдельной, если с первой возникнут какие-либо нестыковки.

    Reply
  13. marlen

    (12) Boroda, вот так я сдаю пачки. Сначала складываются все пачки (рубли с копейками) например по страховой, и только ПОТОМ округляются до рубля. Внутри xml-файла по пачке СЗВ-6-1(2) все цифры в рублях с копейками. Внутри xml-файла АДВ-6-2 строки по пачкам как на картинке рубли с копейками и только итоговая в рублях.

    Ну не страдаю я от округления) по крайней мере в этом месте. В нашем пфр давно так разрешили

    Reply
  14. Borisych

    В КА 1.1.18.1 вообще встроенная проверка косячит — когда на начало года в РСВ была переплата (сумма с минусом) например, по страховой, и на конец отчетного периода (в конкретном случае — 2011 год) тоже переплата

    Reply
  15. finadezda

    (15) Borisych,

    у меня такая же история, переплата на начало года и переплата на конец года, внутри пачки ПФ требует перераспределения по работникам… и подойдет ли данная обработка для исправления?

    Reply
  16. Borisych

    (16) finadezda, причем тут обработка? эта обработка для 7.7. А КА — это на 8-ке конфигурация. Ошибку в модуле обработки подготовки сведений исправил и всё прошло успешно — отправили отчетность через интернет. По другой организации выдала другие ошибки — что типа разница больше чем три копейки, а суммы показывает — разница = з копейки. Поправил в модуле проверки — чтобы разницу в 0.0322 рубля округлил 0.03 — и всё прошло — тоже отправили отчетность через интернет

    Reply
  17. Екатерина2011

    Жаль что увидела эту обработку так поздно. очень полезная штука

    Reply

Leave a Comment

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