Подготовка сведений для ПФР с учетом задолженности по страховым взносам в разрезе сотрудников для "Бухгалтерия 7.7", "УСН 7.7" и "Предприниматель 7.7"




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

    При выгрузке из Бухгалтерии индивидуальных сведений (форм СЗВ-6-1 и СЗВ-6-2) суммы уплаты заполняются расчетным методом и не всегда встают верно, т.к. фактические данные распределения уплат предыдущих периодов не учитываются.

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

    Есть возможность не использовать этот специальный документ и восстановить распределение задолженности за предыдущие (ранее сданные) периоды на основе данных файлов XML, сформированных в прошлых отчетных периодах (1 полугодие 2010 года и последующие).

    Перейти к публикации

    Reply
  2. Хряк

    Спасибо за заботу и поддержку общих проблем пользователей.

    Reply
  3. Доня

    Спасибо, очень пригодится, пока не анализировала, но уже сделала вывод, что очень нужная обработка

    Конечно +

    Reply
  4. TrinitronOTV

    спасибо, это всегда может пригодиться

    Reply
  5. nikpan@bmail.ru

    Это единственный реальный выход для отслеживания задолженности по страховым взносам в разрезе сотрудников, так как типовая этого не позволяет.

    Reply
  6. Kochevnic

    Спасибо! Очень замечательно все расписано. Будем пользоваться

    Reply
  7. ninaK

    Воспользовались Вашей обработкой для ЗИК — нормально прошло. Спасибо за эти!!! Для 1С-Предпринимателя бы еще написали — тоже считают з/плату в этой программе и сдают оттуда ПФР-ку.

    Reply
  8. victuan

    (6)Предпринимателя 7.7?

    Попробую.

    Reply
  9. ninaK

    Да,Учет и отчетность Предпринимателя 7.7. Сидит бухгалтер и вручную ведет накопительную ведомость по уплате.

    Reply
  10. victuan

    (8)Ну если «плюсанете» мои обработки, которые вам пригодились — сделаю 😉

    Reply
  11. ninaK

    Да с радостью!!

    Reply
  12. irishka77

    [U]U[/]Спасибо! Попробую вернуть одного клиента на штатый механизм с помощью Вашей обработки.

    Reply
  13. alika

    Большое спасибо за обе обработки! Очень нужные и своевременные!

    Reply
  14. Big_Pavel

    Строка 9148 …

    Этот код отработает только первого сотрудника …….

    Пока ТабСоставПачки.ПолучитьСтроку()=1 Цикл

    стр = 0;

    Если (ТСотр.Флаг=0) и (ТСотр.НайтиЗначение(ТабСоставПачки.Сотрудник, стр, «Сотрудник») = 1) тогда

    ТСотр.ПолучитьСтрокуПоНомеру(стр);

    ТСотр.Флаг=1; // сотрудник в пачку включен

    А вот так вроде обходит ВСЕХ

    Если (ТСотр.НайтиЗначение(ТабСоставПачки.Сотрудник, стр, «Сотрудник») = 1) тогда

    ТСотр.ПолучитьСтрокуПоНомеру(стр);

    Если (ТСотр.Флаг=0) тогда

    ТСотр.Флаг=1; // сотрудник в пачку включен

    //Сообщить(«Обрабатываем:= «+ТабСоставПачки.Сотрудник);

    ТабСоставПачки.УплаченоСтраховая=ТСотр.УплаченоСтраховая3+ТСотр.УплаченоСтраховая4;

    ТабСоставПачки.УплаченоНакопительная=ТСотр.УплаченоНакопительная3+ТСотр.УплаченоНакопительная4;

    КонецЕсли;

    Иначе

    ТабСоставПачки.УплаченоСтраховая=0;

    ТабСоставПачки.УплаченоНакопительная=0;

    КонецЕсли;

    Еще на кнопку ЗАПОЛНИТЬ СУММЫ ВЗНОСОВ может не надо вешать по умолчанию документ задолжности по оплате …

    Ведь для этого есть кнопка Записать сальдо

    Reply
  15. victuan

    (13)Это ошибка версий 1.0 и 1.1. В версии 1.2 я это уже исправил.

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

    Это гарантирует законченность действий для невнимательных пользователей.

    Reply
  16. Big_Pavel

    Иногда с первого раза не получается все сделать правильно …

    т.е. То номер забыл расчетчик то суммы не выверил то просто не стой ноги встали

    то файлы собрали не все xml. а я не знал как она работает

    и ведь отказаться нельзя от сохранения …. она его сразу записывает даже не спрося ….

    Пришлось в монопольном убирать каждый раз сальдо … после каждого не правильного прохода

    Обработка очень пригодилась.. оказалось не все оплаты разнесли еще в 2010 году

    копейки подчистили при переходе на 1С 8 я думаю очень пригодится порядок …

    Да и зачем тогда кнопка ЗАПИСАТЬ САЛЬДО …. 🙂

    Reply
  17. victuan

    (15)Ничего страшного от того, что сальдо запишется первый раз неверно, при повторном заполнении суммы взносов оно перезапишется (документ перезаполнится новыми данными).

    И не нужно его убирать монопольно. Достаточно его сделать не проведенным и он не будет учитываться при анализе сальдо.

    Кнопка «Записать сальдо» нужна если вручную поменяли в пачках начислено/уплачено. После этого нужно нажать эту кнопку, чтобы изменения учлись в сальдо.

    Reply
  18. Big_Pavel

    Из за того что не шли обороты ( уплат ) за период с 01.01.10

    Я решил // проверить их откатываясь в прошлые периоды … и обработка начала писать документы в этих периодах,

    а зачем у меня же есть xml … мысль понятна (нельзя не доотценивать предсказуемость человеческой забывчивости ..)

    Reply
  19. victuan

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

    Reply
  20. victuan

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

    Reply
  21. harutyunb

    Сам использовал, данную обработку, за 2011 год все кварталы отчитались и все нормально. Все поправляет при необходимости. Доволен и спасибо автору за труды.

    Reply
  22. ninaK

    То что исправили ошибку, приводящую к задвоению сотрудников в пачках при распределении уплаты — хорошо. Было такое в УСН. Попробую сейчас на Предпринимателе. В УСН здорово помогло!!! Спасибо. Могу еще тысячу плюсов поставить!

    Reply
  23. Enerjaizer

    Спасибо за нужную обработку!

    Пришлось только удалять ручками кучу «нулевых» сотрудников (нет начислений у сотрудника, но он и не уволен), но это клиент такой попался)))

    Очень пригодилась!

    Reply
  24. xaker1C

    Очень пригодилась

    Reply
  25. victuan

    Обновление от 27.01.12 (версия 1.3):

    5) Обработка обновлена до последней версии типовой конфигурации Бухгалтерия 535 (совместима с последними релизами конфигураций УСН и Предприниматель).

    6) Для опции штатного механизма «Распределение сумм уплаченных взносов производить с учетом ранее переданных данных» устранены недоработки: 1) при проверке наличия переданных данных сообщается период, с которого должны быть загружены эти данные; 2) в случае обнаружения переплат в переданных данных выводится список сотрудников с переплатами и суммами переплат (почему само ЗАО «1С» этого не сделало остается загадкой).

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

    8) При загрузке файлов XML появилась возможность собирать файлы и из вложенных подкаталогов (флажок «включая подкаталоги»). Бывает полезно, если файлы сгруппированы по каталогам в зависимости от отчетного периода (квартала). Изменение предложил Gagarkin Valery.

    9) кнопка «Записать сальдо» ушла на закладку «Настройки», т.к. на прежней закладки ей не хватило места. Появился флажок «не записывать автоматически». Установка флажка позволяет не сохранять сальдо в документе «Задолженность по страховым взносам» после распределения уплаты нажатием кнопки «Заполнить суммы взносов». В этом случае сальдо нужно записать принудительно, нажав кнопку «Записать сальдо».

    Reply
  26. victuan

    Обновление от 28.01.12 (версия 1.3+):

    10) исправлена ошибка в процедуре ЗаполнитьСуммыВзносов, приводящая к невозможности расчета при альтернативном распределении уплаченных взносов.

    Это обновление можно не скачивать, а самостоятельно внести исправления в обработку версии 1.3.

    Надо фрагмент кода:

          Если флРаспределениеПоИстории = 0 тогда //тщи
    ТабУплатыВзносов = ПолучитьТаблицуУплатыВзносов();
    Иначе                              //начало тщи
    ТабУплачаноВзносов = СоздатьОбъект(«ТаблицаЗначений»);
    ТабУплачаноВзносов.НоваяКолонка(«ОтчетныйПериод»,»Дата»); // отчетный период за который была уплата в периоде формирования отчета, с учетом переплаты прошлого периода
    ТабУплачаноВзносов.НоваяКолонка(«УплаченоСтраховая»,»Число»,15,2);
    ТабУплачаноВзносов.НоваяКолонка(«УплаченоНакопительная»,»Число»,15,2);
    ТабУплачаноВзносов.НоваяКолонка(«КоэффициентСтраховая»,»Число»,12,10);
    ТабУплачаноВзносов.НоваяКолонка(«КоэффициентНакопительная»,»Число»,12,10);
    КонецЕсли;                         //конец тщи
    

    Показать

    заменить на этот:

          Если флРаспределениеПоИстории = 0 тогда //тщи
    ТабУплатыВзносов = ПолучитьТаблицуУплатыВзносов();
    Иначе                              //начало тщи
    ТабУплатыВзносов = СоздатьОбъект(«ТаблицаЗначений»);
    ТабУплатыВзносов.НоваяКолонка(«ОтчетныйПериод»,»Дата»); // отчетный период за который была уплата в периоде формирования отчета, с учетом переплаты прошлого периода
    ТабУплатыВзносов.НоваяКолонка(«УплаченоСтраховая»,»Число»,15,2);
    ТабУплатыВзносов.НоваяКолонка(«УплаченоНакопительная»,»Число»,15,2);
    ТабУплатыВзносов.НоваяКолонка(«КоэффициентСтраховая»,»Число»,12,10);
    ТабУплатыВзносов.НоваяКолонка(«КоэффициентНакопительная»,»Число»,12,10);
    КонецЕсли;                         //конец тщи
    

    Показать

    Reply
  27. suvorovalena

    Огромное спасибо за продолжение поддержки отчета. Многие перешли на 1С 8# и проблемы «семерочников» их не волнуют… а пользователей осталось еще очень много

    Reply
  28. flash82

    интересный отчет, хотя мы уже сдали ПФР скачаю на заметку…

    Reply
  29. 2011b11

    Спасибо автору за работу , очень интересная доработка для сдачи индивидуальных сведений в ПФР.

    Reply
  30. westinka

    Спасибо автору, использовали данную обработку за 2011 год. Бухгалтерия в восторге, так же огромное спасибо за продолжение поддержки.

    Reply
  31. ondul

    (26) Приветствую! — Проект незаслуженно законсервирован.

    Виктор, было бы неплохо его продолжить в 2013г.

    — Для бухгалтерии 7.7 — это то, что нужно!

    p.s.

    По-видимому, victuan не заглядывает сюда, тогда спрошу у заглядывающих:

    Подготовил отчет ПодготовкаСведенийДляПФР2010_v (по исходнику от victuan-а 2012г) для продолжения в 2013г, с разделением по договорам на основе разработки victuan для ЗиК 2013г. (адаптировал для Бухгалтерии-7.7 (УСН и ОСН).

    Хочу договориться с victuan выложить его для общего пользования.

    Отметьтесь — есть желающие? — Иначе нет смысла выкладывать его здесь. 🙂

    Reply

Leave a Comment

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