Форма статистической отчетности 57-т (2024 год)




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

38 Comments

  1. mvm.mgp

    Подскажите есть ли возможность формировать по подразделениям?

    Reply
  2. mvm.mgp

    Очень нужна такая форма по подразделениям для зуп 2.5 или с возможность выбора по КПП или группы нескольких подразделений

    Reply
  3. Roman_Go

    (2) Если найдете, поделитесь.

    Reply
  4. Roman_Go

    а что в этом отчете поменялось по сравнению с 2015 годом?

    Reply
  5. leon111

    Есть возможность отобрать по обособленному подразделению.

    (1)

    Reply
  6. leon111

    Новый макет отчета

    (4)

    Reply
  7. mvm.mgp

    Выдаётся ошибка:

    Ошибка инициализации модуля: ВнешнийОтчет.РегламентированныйОтчетСтатистикаФорма57Т.МодульОбъекта

    по причине:

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

    Reply
  8. mvm.mgp

    у меня ЗУП КОРП, редакция 2.5 (2.5.118.1)

    Reply
  9. sergey200910

    Добрый день!

    ЗУП 3.1.2.397, выдает ошибку:

    Ошибка инициализации модуля: ВнешнийОтчет.РегламентированныйОтчетСтатистикаФорма57Т.МодульОбъекта

    по причине:

    {ВнешнийОтчет.РегламентированныйОтчетСтатистикаФорма57Т.МодульОбъекта(72)}: Метод объекта не обнаружен (НовоеДеревоФормИФорматов)

    мФормыИФорматы = РегламентированнаяОтчетность.НовоеДеревоФормИФорматов();

    Reply
  10. Roman_Go

    (9) на 3.1 этот отчет точно работать не будет, он как минимум на неуправляемых формах, это уже из скринов видно.

    Reply
  11. Bukaska

    (9)Там же написано, что тестилось на УПП1.3, значит он максимум будет работать на ЗУП2.5.

    Вот если бы тестили на ЕРП2.Х релиза, тогда бы может и на ЗУП 3.Х он бы пошел).

    Смотрите перед скачиванием номера релизов)

    Reply
  12. mvm.mgp

    Заменила ОбщегоНазначения на ОбщегоНазначенияЗК, открылся, выбираю подразделение «обновить выдаёт ошибку :{Форма.ФормаОтчета2017Кв1.Форма(2296)}: Индекс находится за границами массива

    Области[«П0202_»+Инд].Значение = РезультатСотр[СтрНом].Должность;

    Reply
  13. mvm.mgp

    кто-нибудь знает как исправить? очень нужно. В целом по предприятию формируется, по подразделению нет

    Reply
  14. ALISA_M

    А есть эл.выгрузка?

    Reply
  15. mvm.mgp

    Если исправите ошибку пришлите пожалуйста на mvm.mgp@mail.ru или напишите как исправить самостоятельно

    Reply
  16. leon111

    (11) Все верно, на ЗУП КОРП не тестировалось.

    Reply
  17. leon111

    (14) Выгрузка есть как в типовой форме.

    Reply
  18. novotekh

    Замените ОбщегоНазначения на ОбщегоНазначенияЗК

    Reply
  19. mvm.mgp

    см. выше :» Заменила ОбщегоНазначения на ОбщегоНазначенияЗК, открылся, выбираю подразделение «обновить выдаёт ошибку :{Форма.ФормаОтчета2017Кв1.Форма(2296)}: Индекс находится за границами массива

    Области[«П0202_»+Инд].Значение = РезультатСотр[СтрНом].Должность;»

    Мне эту ошибку нужно исправить

    Reply
  20. Roman_Go

    (19) судя по всему у Вас нету людей для раздела, там отбор идет по подразделению. Если у Вас так как у нас. То нужно делать отбор по КПП.

    как у нас: несколько подразделений содним кпп, которые образуют одно обособленное.

    что сделал я.

    | КОГДА &ИсключитьДанныеОбособленныхПодразделений
    | ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.КодПоОКАТО = «»»»
    | ИНАЧЕ ВЫБОР
    |  КОГДА &ОбособленноеПодразделение <> &ПодразделенияОрганизацийПустаяСсылка
    |  ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.КПП = &ОбособленноеПодразделениеКПП
    |                    ИНАЧЕ ИСТИНА
    |      КОНЕЦ
    |    КОНЕЦ

    Показать

    где .КПП, было ссылка, где &ОбособленноеПодразделениеКПП было &ОбособленноеПодразделение

    ну и ЗапросЧисл.УстановитьПараметр(«ОбособленноеПодразделениеКПП»,ОбособленноеПодразделение.КПП);

    там есть несколько запросов во всех запросах нужно повторить.

    Reply
  21. Roman_Go

    (19) попалась кпп где народу мало, чтобы ошибка не выходила поменял

    //Для Инд = 1 По КолРаздел2 Цикл
    Для Инд = 1 По Мин(КолРаздел2, КолСотр) Цикл
    Reply
  22. Roman_Go

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

    и вообще почему-то формат стоит стажа два символа, т.е. максимум отчет выдаст 9.9 лет, три хотя бы надо, чтобы более 10 лет мог показать отчет цифры

    Reply
  23. novotekh

    {Форма.ФормаОтчета2017Кв1.Форма(2296)}: Индекс находится за границами массива

    Области[«П0202_»+Инд].Значение = РезультатСотр[СтрНом].Должность;

    Не отрабатывает запрос.

    Reply
  24. Roman_Go

    всем у кого есть северные, нужно дорабатывать запрос

    Процедура КоманднаяПанельФормыЗаполнить(Кнопка)
    
    //Список сотрудников, полностью отработавших отчетный период
    ЗапросСотр = Новый Запрос;
    

    везде, где есть ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисленияОрганизаций.РайонныйКоэффициент), нужно еще добавить ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисленияОрганизаций.СевернаяНадбавка)

    Reply
  25. mmmstr

    у обычного пользователя Нарушение прав доступа! под админом открывается. что сделать?

    Reply
  26. leon111

    (25)

    Дать права обычному пользователю.

    Reply
  27. mmmstr

    (26) Вы правы! а то я через ЖР полезла.

    Reply
  28. yandukov

    в зарплате 8.3 работает?

    Reply
  29. mmmstr

    как заполнить отчет, если нет кнопки ЗАПОЛНИТЬ?

    Reply
  30. leon111

    (29)

    Отчет заполняется по кнопке Обновить.

    Reply
  31. leon111

    (28)

    В ЗУПе не тестировал.

    Reply
  32. dbaser

    УПП 1.3.96.1.

    Расчетчик наш запрыгала от счастья =)

    спасибо

    Reply
  33. Sophus

    ФЗП должен быть в тысячных, а тут полностью. И почему не все начисления попадают в отчет?

    Reply
  34. leon111

    (33)

    Исправил ФЗП в тысячных. При открытии отчета есть настройка выплат, входящие в ФЗП.

    Reply
  35. Brawler

    Шляпа… Выгрузка не работает, если открывать как Файл / Открыть… но хоть будучи открытым из общего списка рег. отчетов там может сохранять

    Reply
  36. ело

    Отчет сформировался, но на печать выводятся только 4 страницы, что делать если их больше?

    Reply
  37. leon111

    (35)

    Выгрузка типовая, смотрите ошибки.

    Reply
  38. leon111

    (36)

    Требуется доработка.

    Reply

Leave a Comment

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