Форма П-4 "Сведения о численности, заработной плате и движении работников" приказ 01.09.2024 № 566




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

28 Comments

  1. b-dm

    Для ЗУП Корп.работать будет ?

    Reply
  2. alex649

    Метод объекта не обнаружен (ПолучитьОписаниеТиповСтроки)

    ОписаниеТиповСтрока = ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(0); Может ОбщегоНазначенияЗК?

    Reply
  3. vesh

    (2) alex649,

    Ошибка исправлена.

    Reply
  4. alex649

    (3) ну и так со всеми ОбщегоНазначения. Сам исправил уже — работает. Ставим плюс.

    Reply
  5. vesh

    (4) alex649, Исправлено

    Reply
  6. dimitrius

    Есть информация что Росстат не принимает электронную выгрузку из данной обработки. Из росстата пришел ответ «Отчет заполнен с использованием старой версией шаблона». Кто то уже отправлял этот отчет в Росстата. Планируется доработка формата выгрузки?

    СхемаВыгрузкиXML2014Кв1 не соответствует требуемой Росстатом

    Reply
  7. vesh

    (6) dimitrius,

    С форматом выгрузки все хорошо.

    Вам необходимо изменить настройки программы

    В журнале регл. отчетности открыть настройки и изменить формат выгрузки отчетов статистики на 2.4.4

    Подробное описание найдете здесь:

    http://infostart.ru/public/329571/

    Reply
  8. alexxff

    А почему ЗП не заполняется?

    Reply
  9. vesh

    (8) alexxff,

    Опишите конкретнее проблему, которая у вас возникла.

    Reply
  10. alexxff

    Автоматически не заполняются разделы:

    «Количество отработанных чело-

    веко-часов с начала года (за I квартал,

    I полугодие, 9 месяцев, год),

    человеко-часов»

    «Фонд начисленной заработной платы работников за отчетный месяц (при числе работников до 15 человек — за период с начала года), тыс руб с одним десятичным знаком»

    Reply
  11. toran

    А что в регламентных эта форма не заполняется?

    Reply
  12. alexxff

    т.е. вы предлагаете заполнить в старой форме, потом вставить внешнюю новую и открыть?)

    Reply
  13. dimitrius

    (7)

    Представленная ссылка не работает!! Изменили настройки, сделали выгрузку, все равно Росстат не принимает. выгруженный файл xml НИ ЧЕМ не отличается от файла, выгруженного по старой схеме, состав Атрибутов тега TITLE аналогичный, не хватает атрибутов «name», «obj», «OKUD» и др. В данном отчете в макете атрибутов выгрузки «АтрибВыгрузкиXML2014Кв1» данные теги присутствуют, а в макете схемы «СхемаВыгрузкиXML2014Кв1» в области «Report» данных тегов нету… Выгрузка должна соответствовать новой схеме XML шаблона ( http://www.gks.ru/metod/XML/XML_plan_2015.htm — пункт 153).

    Reply
  14. dimitrius

    (7) Необходимо Корректировать схему выгрузки «СхемаВыгрузкиXML2014Кв1» под новый стандарт… В макете Атрибутов «АтрибВыгрузкиXML2014Кв1» теги для новой схемы есть, но они не попадают в выгрузку….. Что необходимо сделать, что бы отчет выгрузился по новой схеме? отчетность необходимо сдать до 15 числа…..

    Reply
  15. vesh

    Ссылка обновлена

    http://infostart.ru/public/329571/

    Изменения по формату выгрузки в даннйо обработке доработаны не будут

    Reply
  16. vesh

    (14) dimitrius,

    Изменения по формату выгрузки в данной обработке доработаны не будут

    Reply
  17. dimitrius

    Там не только Атрибуты, но и название и состав узлов XML Файла изменился… Вы пробовали отослать данный отчет в Росстат? Он его принимает? И что за новую версию еще 1S платить? таковы правила сайта?

    Reply
  18. vesh

    (17) dimitrius, //сейчас проверим

    Reply
  19. vesh

    (18) Формат выгрузки доработан не будет. Приказа по изменению формата не найдено. В старом формате отчетность отправлен и принят.

    Reply
  20. dimitrius

    (19)vesh,

    Вчера была версия файла 02, с измененным структурой выгрузки, сегодня ее нету, где она? И с помощью какой программы вы отправляете данный отчет в Росстат?

    Reply
  21. vesh

    (20) dimitrius,

    Данные отправлены из обработки Статистика П_4_1C_8_2_v_01_1. и приняты.

    Reply
  22. b-dm

    А справа что за настройка для видов расчета можете подробнее описать , что с этим делать?

    Reply
  23. malinaa

    (20) dimitrius, Добрый день!

    Приняли у вас по старому формату отчет?

    Нам пришлось подгрузить через Прочие отчеты в Бухгалтерии, заполнять там и оттуда уже выгружать.

    Reply
  24. vesh

    Отчет сдан по 3 организациям из данной формы.

    Reply
  25. ut2k5

    скачал, но прога все равно пишет, что старая версия, че за дела?

    Форма в редакции:

    Приказ Росстата от 24.07.2012 № 407

    за период составления отчета более не применяется.

    Используйте форму в редакции:

    Приказ Росстата от 24.09.2014 N 580.

    Reply
  26. Njutik1510

    При заполнении выдает ошибку:

    {ВнешнийОтчет.РегламентированныйОтчетСтатистикаФормаП4.МодульОбъекта(323)}: Поле объекта не обнаружено (П030001801)

    мФормаОтчета.Области.П030001801.Значение = Выборка.ПриемНаРаботу;

    при этом итоговые данные граф не заполняет («всего сумма граф» по обеим таблицам)

    Reply
  27. aret99

    Не правильно выводится средняя списочная по обособленному подразделению. Вместо цифры по подразделению выводится цифра в целом по организации.

    Reply
  28. Eleet

    При выборе заполнения «Ежеквартально» при заполнении будет выдавать ошибку :При заполнении выдает ошибку:

    {ВнешнийОтчет.РегламентированныйОтчетСтатистикаФормаП4.МодульОбъекта(323)}: Поле объекта не обнаружено (П030001801)

    мФормаОтчета.Области.П030001801.Значение = Выборка.ПриемНаРаботу; »

    Решается комментарием вызова процедуры: ЗаполнитьРаздел3

    Если НЕ (Найти(мВыбраннаяФорма, «2013») > 0 )Тогда
    
    //ЗаполнитьРаздел3(мФормаОтчета, ЧисленостьРаботников);
    
    КонецЕсли;
    
    Reply

Leave a Comment

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