РСВ-1 для ЗиК: вариант для единой отчетности ПФР




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

38 Comments

  1. nicotin

    Забыл упомянуть в тексте публикации. Если хотите исправить ошибку в пачке раздела 6, не меняя при этом исходные данные, то в нужном подразделе введите какое-нибудь измененное значение, затем снова введите исходное. Ну и далее жмитекнопу «Записать», либо программа сама запросит сохранение при выходе из раздела 6. Иначе, если нет модификации, то в файле ничего не изменится.

    Reply ↓
  2. u_n_k_n_o_w_n

    Удобная форма. Еще бы добавить заполнение раздела 2.5 из сформированных персонифицированных сведений.

    Reply ↓
  3. nicotin

    (4) u_n_k_n_o_w_n, но ведь раздел 2.5 и так заполняется на основании сведений из перс. учета. В разделе 6 есть отдельная кнопка для заполнения. Надо только, и об этом сказано в статье, чтобы соответствующие файлы были размещены в каталоге выгрузки. Если у вас есть сомнения в правильности заполненного файла *.pcb, то лучше удалите его, и тогда будет проверяться непосредственно наличие файлов. Или вы имели в виду заполнение на основании файлов сохранения, наподобие _1_ИСХОДНАЯ_12014.pf ? Но для этого надо быть уверенным, что заполняем РСВ-1 в той же конфигурации, что и сведения персучета.

    Reply ↓
  4. nicotin

    Обновлены файлы для сдачи отчетности за 1 квартал 2015 года, а именно: для тарифов организации инвалидов, СМИ, ЕСХН и некоторых других сделано принудительное приведение к общему налоговому режиму.

    Reply ↓
  5. u_n_k_n_o_w_n

    Автору огромный «+» за труды!!!

    Reply ↓
  6. nicotin

    (7), увы, не учёл одну важную вещь — скорость, с которой ПФР клепает изменения в правилах отчетности.

    В версии от 24.07.2015 добавлена возможность работы с форматом, введенным постановлением от 04.06.2015 №194п.

    Reply ↓
  7. lexlex89

    а в каком релизе ЗиКа работает?

    Reply ↓
  8. lexlex89

    что за *pcb

    Reply ↓
  9. nicotin

    (9) lexlex89, работа отчета тестировалась на релизе 252 ЗиК. Насчет работы на более ранних релизах сказать затрудняюсь. Замечу только, что при заполнении используется стандартная процедура сбора данных для страховых взносов, а она почти не изменилась. В разделе 6 появилась, не помню в каком релизе, отметка об увольнении сотрудника.

    Reply ↓
  10. nicotin

    (10) lexlex89, если в отчете «Подготовка сведений для ПФР» для выгрузки использовать пункт «все пачки (сформировать комплект)» то в дополнение к файлам ПФР будет сформирован файл с именем

    Прав(НомерПФР,15)+»_»+ ДатаГод(ОтчетныйПериод) + «_»+ ПолучитьНомерКварталаОтчетногоПериода2014(ОтчетныйПериод) + «.pcb»

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

    1. С использованием файла ХХХХХХ.pcb

    2. Если таковой файл не обнаружен, то заполнение идет на основании имеющихся файлов ПФР

    В обоих случаях необходимо, чтобы файлы располагались в каталоге, указанном для выгрузки РСВ-1. Важно: проводится фильтрация файлов по регистрационному номеру ПФР налогоплательщика и по отчетному периоду.

    Reply ↓
  11. lexlex89

    Плохой тип переменной

    Reply ↓
  12. lexlex89

    вот такая ошибка выходит при попытке заполнить раздел 2.5 РСВ_1_2014.ERT(3365)}: :следующие теги не закрыты: Файл обмена

    Reply ↓
  13. nicotin

    (14) lexlex89, судя по ошибке, в каталоге кроме файлов ПФР имеются «лишние» файлы, которые программа анализирует некорректно. Тег «ФайлОбмена» имеется в файлах Конвертации Данных. Если вы имеете возможность предоставить доступ ко всем файлам из каталога, то я смогу более точно выяснить причину ошибки. Ну или хотя бы дайте доступ к файлу с тегом ФайлОбмена.

    Reply ↓
  14. lexlex89

    (15) могу конечно,архивом либо могу дать доступ через TeamViewer

    Reply ↓
  15. nicotin

    (16) lexlex89, ОК, дайте ссылочку на архив.

    Reply ↓
  16. lexlex89

    (17) спасибо! с файлами разобрался) теперь не проходит проверку выгрузка в программе chekPFR от 21.07.15,вы не в курсе случайно нет ли более поздних версий для проверки,сколько ни бьюсь толку нет

    Reply ↓
  17. nicotin

    (18) lexlex89, нет, более свежих версий я не видел. А почему вы решили, что это ошибка проверяющей программы ? Может быть это реальная ошибка в файлах, и её нужно исправлять. Дайте описание ошибки.

    Reply ↓
  18. lexlex89

    1.1. Ошибка

    a. РСВ1

    30

    Зна­че­ни­е, у­ка­за­нное в гра­фе 2 стро­ки «­И­то­го» до­лжно ра­вня­ть­ся су­мме зна­че­ний граф 4-6 стро­ки 204 по­дра­зде­ла 2.1 Ра­сче­та по всем ко­дам та­ри­фо­в.(У­ка­за­но в ра­зде­ле 2.5.1 :8910742,44, Ра­счи­та­но по ра­зде­лам 1 и 2.1: 0)

    b. РСВ1

    30

    Зна­че­ни­е, у­ка­за­нное в гра­фе 3 стро­ки «­И­то­го­», до­лжно ра­вня­ть­ся зна­че­нию у­ка­за­нно­му в гра­фе 3 стро­ки 114 ра­зде­ла 1 у­ме­нь­ше­нно­му на зна­че­ния граф 4-6 стро­ки 206 по­дра­зде­ла 2.1(при на­ли­чие не­ско­ль­ких по­дра­зде­лов 2 у­ча­ству­ют зна­че­ния граф 4-6 206 ка­ждо­го из ра­зде­ло­в)(У­ка­за­но в ра­зде­ле 2.5.1 :1960363,33, Ра­счи­та­но по ра­зде­лам 1 и 2.1: 0)

    c. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 4 стро­ки 400 (410,420 и т.д.) по­дра­зде­ла 6.4, до­лжно бы­ть ме­нь­ше и­ли ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 3 стро­ки 200 по­дра­зде­ла 2.1. по всем ко­дам та­ри­фо­в(У­ка­за­но в РСВ :0, Ра­счи­та­но: 18957126,83)

    d. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 5 стро­ки 400 (410,420 и т.д.) по­дра­зде­ла 6.4, до­лжно бы­ть ме­нь­ше и­ли ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 3 стро­ки 204 по­дра­зде­ла 2.1. по всем ко­дам та­ри­фо­в.(У­ка­за­но в РСВ :0, Ра­счи­та­но: 16698110,98)

    e. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 5 стро­ки 401 (411,421 и т.д.) по­дра­зде­ла 6.4 до­лжно бы­ть ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 4 стро­ки 204 по­дра­зде­ла 2.1 по всем ко­дам та­ри­фо­в(У­ка­за­но в РСВ :0, Ра­счи­та­но: 2824522,6)

    f. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я­»­по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 5 стро­ки 402 (412,422 и т.д.) по­дра­зде­ла 6.4 до­лжно бы­ть ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 5 стро­ки 204 по­дра­зде­ла 2.1 по всем ко­дам та­ри­фо­в(У­ка­за­но в РСВ :0, Ра­счи­та­но: 2721275,83)

    g. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 5 стро­ки 403 (413,423 и т.д.) по­дра­зде­ла 6.4, до­лжно бы­ть ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 6 стро­ки 204 по­дра­зде­ла 2.1 по всем ко­дам та­ри­фо­в(У­ка­за­но в РСВ :0, Ра­счи­та­но: 3364944,01)

    h. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 7 стро­ки 400 (410,420 и т.д.) по­дра­зде­ла 6.4, до­лжно бы­ть ме­нь­ше и­ли ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 3 стро­ки 203 по­дра­зде­ла 2.1 по всем ко­дам та­ри­фо­в.(У­ка­за­но в РСВ :0, Ра­счи­та­но: 196105,23)

    i. РСВ1

    30

    По всем ра­зде­лам 6 по ти­пу «­И­СХО­ДНА­Я» по всем ка­те­го­ри­ям ЗЛ зна­че­ние гра­фы 7 стро­ки 403 (413,423 и т.д.) ра­зде­ла по­дра­зде­ла 6.4, до­лжно бы­ть ра­вно зна­че­ни­ю, у­ка­за­нно­му в гра­фе 6 стро­ки 203 по­дра­зде­ла 2.1 по всем ко­дам та­ри­фо­в.(У­ка­за­но в РСВ :0, Ра­счи­та­но: 196105,23)

    Reply ↓
  19. nicotin

    (20) lexlex89, получается, что разделы 1 и 2.1 РСВ-1 вообще не заполнены и нужно их заполнить. Видимо, здесь произошла небольшая путаница. На форме имеются две кнопки «Заполнить». Та, что расположена в 6 разделе, заполняет только раздел 2.5 и раздел 6 для просмотра индивидуальных сведений. При выборе любого другого раздела кроме 6 становится доступна другая кнопка «Заполнить», которая собственно и заполняет все разделы РСВ-1.

    Reply ↓
  20. lexlex89

    (21) еще такой момент,в 293 релизе ЗикА не формируется файл pcb, в этом случае откуда заполняется раздел 6 и 2.5?

    Reply ↓
  21. nicotin

    (22) lexlex89, прочтите ещё раз сообщение (12) начиная со слов «Если таковой файл не обнаружен». Вы должны сначала сформировать файлы ПФР с индивидуальными сведениями с помощью отчета «Подготовка сведений для ПФР», затем поместить их в каталог для выгрузки РСВ-1. А вообще 293 релиз — это же весна 2010 года, начало перехода от ЕСН к страховым взносам. Не могу дать никакой гарантии, что отчет будет нормально работать. Разве только если программист делал изменения в конфигурации, не меняя релиза.

    Reply ↓
  22. lexlex89

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

    Reply ↓
  23. nicotin

    (24) lexlex89, как то всё это сомнительно. А кто же раньше и каким образом сдавал отчетность за весь 2014 год ? Ведь на 293 релизе получить файлы для раздела 6 невозможно. Там формируются пачки СЗВ-6.

    Reply ↓
  24. lexlex89

    (25) вот внешняя форма отчета с помощью которой и формировали рсв

    Reply ↓
  25. lexlex89

    рсв1

    Reply ↓
  26. lexlex89

    и ещё, скажите пожалуйста у вас нет случаем 4фсс для ЗиКа за 2015 год?

    Reply ↓
  27. nicotin

    (27) (28) до 4 ФСС руки не дошли. Бухгалтер заполняет вручную на сайте сдачи отчетности Контур Экстерн.

    Выложенный вами файл предназначен только для отчетности за 2013 год и не соответствует требованиям 2014 года. Тем не менее в нем так же, как и в моем отчете используется процедура глСобратьДанныеДляСтраховыхВзносов. Если эти самые ДанныеДляСтраховыхВзносов есть в базе, то хоть что-то да должно заполниться. Вы пишете, что «на основании имеющихся файлов отчет не заполняется». Какие конкретно разделы заполняются, а какие нет ?

    Reply ↓
  28. lexlex89

    (29) не заполняется раздел 2.5 и 6,так же у меня имеется не добитая 4фсс,не заполняются поля с указанием итогов,буду весьма признателен если взглянете,конечно если вас не затруднит

    Reply ↓
  29. nicotin

    (30) Вы уж извините, но разбираться с недоделанной обработкой, которая к тому же написана неизвестно для какой конфигурации — это попусту тратить время. К тому же срок сдачи закончился 25 июля. Лучше выложите те файлы, на основании которых должен заполниться раздел 2.5, но он не заполняется. Кстати, проверяли ли вы эти файлы отдельно с помощью CheckPFR. CheckXML ?

    Reply ↓
  30. lexlex89

    пробовали и эти ,и после обновления,фалы которые выгружаются с релиза 293 естественно не проходят проверку и куча ошибок в них,при обновлении до 352 релиза ошибки лезут по ФОМС т.е излишки какие-то

    Reply ↓
  31. nicotin

    Я вряд ли смогу вам здесь помочь. Может быть попробуете импортировать файлы с ошибками в какую нить независимую программу типа Документы ПУ 5, а затем выгрузить уже с правильной структурой.

    Reply ↓
  32. lexlex89

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

    Reply ↓
  33. nicotin

    (34) lexlex89, не понял, у вас в ЗиК ведется учет по двум организациям или вам нужно делать отбор в комплексной конфигурации? Для комплексной конфигурации сделана отдельная обработка РСВ_1_комплексная. В ней почти всё то же самое, только есть выбор организации, и необходимые для работы параметры берутся не из констант, а из сведений об организации.

    P.S. Ещё можно делать отбор с помощью списка сотрудников на последней вкладке.

    Reply ↓
  34. lexlex89

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

    Reply ↓
  35. nicotin

    (36) lexlex89, вы же скачивали обработку для комплексной конфигурации. Можете посмотреть, как там сделано. Если вкратце, то помещаете на форму реквизит «ВыбраннаяФирма» с типом «Справочник.СвоиЮрЛица». А в запрос по подбору сотрудников в процедуре ПодобратьСотрудников() добавляете

    |Условие (Сотрудник.ЮрЛицо = ВыбраннаяФирма);
    

    Естественно, тип справочника и наименование реквизита в справочнике «Сотрудники» поставьте такие, как в вашей конфигурации.

    Reply ↓
  36. u_n_k_n_o_w_n

    Добрый день!

    Можете подготовить для релиза ЗИК 362.

    В последнем релизе не работает заполнение раздела 2.1.

    Спасибо.

    Reply ↓
  37. nicotin

    (38) Сделал нужные изменения в первом файле. Пользуйтесь, если успеете. Срок сдачи РСВ-1 заканчивается 20.02.17 и больше этот отчет никогда не понадобится. В дальнейшем будем сдавать отчетность в ФНС. По этой причине второй файл даже не стал смотреть.

    Reply ↓
  38. u_n_k_n_o_w_n

    Добрый день!

    Спасибо огромное. Реализовал своими силами. Может ваше исправление кому то еще пригодится.

    Спасибо.

    Reply ↓

Leave a Comment

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