Форма статистической отчетности 57-т (2013 + 2026 + отбор по подразделениям)




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

60 Comments

  1. M@sha

    на конфигурации ЗиКБУ не пробовали?

    Reply ↓
  2. Jokstr

    Отчет писался и тестировался в конфигурации «Зарплата и Управление Персоналом», редакция 2.5 (2.5.73.1) на обычных (не управляемых) формах. В других конфигурациях запускать не пробовал.

    Reply ↓
  3. margo_m09

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

    Reply ↓
  4. margo_m09

    (2) начислено сумм зп не сходить с п4(

    Reply ↓
  5. Jokstr

    С отчетом по форме П-4 не сравнивал, делал по указаниям по заполнению 57-т. Попробую сегодня посмотреть в чем отличие.

    Reply ↓
  6. Jokstr

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

    Reply ↓
  7. ustemen85

    Огромное спасибо. 1с 8.2 упп редакция 1.3 полет нормальный единственное не встает код профессии, и начисления берет не все, но думаю это решаемо.

    Reply ↓
  8. Mag_LI

    Спасибо! Пригодилось очень вовремя. Немножко только пришлось доработать,но это мелочи. Наши экономисты сегодня очень рады.

    Reply ↓
  9. Mag_LI

    А где плюсовать-то?

    Reply ↓
  10. trans63

    Уважаемый автор! Как обстоят дела в этом отчете с обособленными подразделениями7 А то назрела необходимость в этом отчете, но не уверен, что обособленные подразделения НЕ попадают в него. Уточните пожалуйста этот момент! А то 20го уже сдаваться…

    Reply ↓
  11. SunShinne

    дьякую

    Reply ↓
  12. Jokstr

    К сожалению давно не смотрел этот отчет, так как он сдается нашей организацией раз в несколько лет. Но постараюсь 19 числа посмотреть, вспомнить, что и как там считается и ответить на ваш вопрос.(11) trans63,

    Reply ↓
  13. Jokstr

    В отчете выбираются все отработавшие в выбранной организации полный месяц сотрудники, включая обособленные подразделения, если надо поправлю, без обособленных. Кстати если форма или критерии отбора изменились по сравнению с 2013 г., выложите ссылку на новую форму, на досуге посмотрю, если конечно это до сих пор актуально.

    Reply ↓
  14. Roman_Go

    дорабатывать под новую форму не планируете, от 2017 года?

    Reply ↓
  15. Jokstr

    (15) Сейчас я работаю на предприятии, где не требуется предоставлять этот отчет. Но помню сколько труда вложил в него, поэтому, чтобы усилия не пропали даром решил доработать… и доработал. Правила заполнения не менял — если что-то изменилось в заполнении — напишите, поменял только макеты, и добавил макет «Вкладыш», ну и еще по мелочи (совершенству нет предела).

    Reply ↓
  16. belyy

    Класс! А возможно ли сделать выборку по подразделениям. А не по всей организации?

    Reply ↓
  17. Dim4ik

    На бюджетной зарплате будет работать?

    Reply ↓
  18. VsevolodDragunsky

    Есть проблема! Если должностей более 16, то выводятся не все должности, а только 16 строк. При нажатии на кнопку Сформировать табличная часть РазделII отчета перезаполняется данными по должностям, не вошедшим в отчет. Так же есть проблема с выводом сумм «тарифного заработка» и «выплаты по район- ному регулиро- ванию», по одной и тойже должности они показываются в разных строках.

    Буду благодарен за оперативную корректировку отчета!

    Reply ↓
  19. flyDrag

    Добрый день,

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

    Reply ↓
  20. Jedi_u2

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

    Reply ↓
  21. Jokstr

    (20):

    Да уж муетодолологи из статистики постарались придумать алгоритм. пришлось лезть в код и смотреть…

    В принципе так как написано и составляется, правда если у должности работника не проставлена категория статистического учета — то такой работник попадает в самый верх списка.

    Reply ↓
  22. Jokstr

    (21):

    Вы предоставляете его по каждому подразделению отдельно? Или вы имеете в виду обособленные подразделения?

    Reply ↓
  23. Jokstr

    (19):

    Если должностей более 16, то выводятся не все должности, а только 16 строк

    16 строк выводятся если численность работников списочного состава полностью отработавших октябрь от 100 до 249 человек, у меня например численность больше 400 (судя по таблице 2 раздела 1) и выводятся 20 строк.

    При нажатии на кнопку Сформировать табличная часть РазделII отчета перезаполняется данными по должностям, не вошедшим в отчет.

    Если вы имеете в вид, что каждый раз заполнение таблицы меняется, то это согласно инструкции по заполнению — первый сотрудник списка заполняется случайным образом, а остальные подбираются через равные промежутки от него (для вас как я понимаю это -16 строк).

    Так же есть проблема с выводом сумм «тарифного заработка» и «выплаты по район- ному регулиро- ванию», по одной и тойже должности они показываются в разных строках.

    Если можно напишите подробней — что за проблемы.

    Reply ↓
  24. Jokstr

    (20)

    (22): Поправил, теперь сотрудники с не заполненной категорией статистического учета имеют код = 3 (другие служащие)

    Reply ↓
  25. flyDrag

    (25) можно скачивать и пользоваться отчет 2017?, пугает надпись, что обновление публикации было 09.11.17 17:23, а Вы подправили только сегодня.

    Reply ↓
  26. Jokstr

    (23) Добавил возможность отбора по подразделениям — в отчете будут выводится данные всех сотрудников работающих в иерархии выбранных подразделений. Если надо сформировать отчет по всем сотрудникам — список подразделений следует очистить.

    Reply ↓
  27. Jokstr

    (26) Попробовал выгрузить отчет — выгрузился последний, со всеми исправлениями — можете качать.

    Reply ↓
  28. yandukov

    Обработка только для 8.2 работает?

    Есть ли где-то для 8.3?

    Reply ↓
  29. mvm.mgp

    нет кнопки сохранить отчёт и выгрузить тоже. у меня зуп корп 2.5

    Reply ↓
  30. bnk72

    Добрый день! Все замечательно, проголосовала, хотела скачать, да смутил комментарий выше. Владимир, подскажите пжл, есть ли возможность выгрузки в xml ?

    Reply ↓
  31. Jokstr

    (31): нет выгрузки в xml нет, отчет писался в 2013 г., сейчас переделал его по новой форме (заменил макеты).

    Reply ↓
  32. Gerts

    Добрый день. В описании не увидел на какой конфигурации работает. Комментарии пролистал — тоже не увидел.

    У меня ЗуП 3.1.3 (стандартная, на УФ, платформа 8.3) — не работает. Пишет: «Не установлена схема компоновки данных»

    Reply ↓
  33. mvm.mgp

    (32)а функция сохранения? у меня просто 140 подразделений, хотелось бы что бы они хотябы сохранялись, если вдруг поправите, пришлите пожалуйста на почту mvm.mgp@mail.ru

    Reply ↓
  34. Jokstr

    (33) Отчет писался для конфигурации ЗУП 2.5 и тестировался на ней же. На управляемых формах работать не будет. В настройках отчета поддерживаемая конфигурация указана, добавил в описание.

    Reply ↓
  35. m0zg153

    Прикрутил отбор по подразделениям и выгрузку в xml

    Reply ↓
  36. Jokstr

    (38):

    Спасибо, что доработали функционал, до которого у самого руки не доходили — лень было разбираться с формировании xml для статистики. Могу я вставить код по выгрузке из вашего отчета в свой? В свою очередь возражать не буду, если опубликуете выложенный вами отчет в своей публикации.

    Что касается отбора по подразделениям — несколько не согласен, что надо отбирать по списку сотрудников на конец месяца — в случае, если сотрудник перевелся в обособленное подразделение в конце октября, то подтянутся все его начисления как по обособленному, так и по другим подразделениям.

    PS: А чей это телефон — 260-09-21?

    Reply ↓
  37. m0zg153

    «Могу я вставить код по выгрузке из вашего отчета в свой?» — ДА, конечно. Отбор по подразделеениям ещё тестируется моей бухгалтерией, там возможно надо доводить до ума. И ещё по начислениям тоже будут проблемы(по-моему надо переделывать на период регистрации). Телефон — это «ой» забил жестко телефон нашей организации и забыл об этом.

    Reply ↓
  38. VsevolodDragunsky

    Коллеги, помогите разобраться, не могу понять. Почему то начисления районного коэффициента показываются без основного начисления отдельной строкой. Что не так? Районный коэффициент начисляется стандартным зависимым типовым начислением.

    Reply ↓
  39. bnk72

    (41) У нас так же: есть или тарифный заработок, или РК

    Reply ↓
  40. bnk72

    (это по II разделу). А выполняю запрос в Консоли запросов — на самом деле 2 строки по каждому сотруднику (различия в данных только по столбцам Районные выплаты и Другие выплаты). Поэтому и данные в табл. 2 раздела I задвоены.

    Для отбора по подразделениям изменила условие с «ПодразделениеОрганизации В (&СписокПодразделений)» на «ПодразделениеОрганизации В ИЕРАРХИИ (&СписокПодразделений)».

    Некоторые не понимают зачем этот отбор, поясню: у нас есть обособленные подразделения без выделенного баланса. Их вносим не в справочнике Организации, а в справочнике подразделений. У нас это выглядит следующим образом: обособленное подразделение (ОП) с галкой «подразделение зарегистрировано в ИФНС как обособленное … » и указанием кодов ОКАТО,ОКТМО, КПП, а в подчинении список отделов, относящихся к этому ОП (опять же с указанием кодов ОП).

    Reply ↓
  41. bnk72

    Извиняюсь что сама с собой… Получилось от задвоенности исходных данных при районном коэф-те избавиться: в конструкторе запроса Запрос пакета 3 на вкладке Группировка надо перетащить последнее поле (РК) из списка Групповых полей в список Суммируемых полей. Вот теперь отчет вроде корректно отрабатывает!

    Осталось заполнить верно коды ОКПДТР (учила-учила кадры правильно заполнять справочник должностей «подбором из справочника», сами то они не догадывались для чего эта кнопка на форме). А при тестовой выгрузке — загрузке 57-т оказалось, что справочник ОКПДТР в ЗУП2.5 у меня устаревший (коды 6-ти значные, а с 12 года они 5-ти значные). Помнится качала его с ИТС, наверное там же обновление стоит поискать… Пишу для тех, кто пока занимается отладкой-проверкой отчета, параллельно дали бы задание соответствующим службам уточнить актуальность кодов ОКПДТР в вашей базе.

    Reply ↓
  42. Jokstr

    (43): Текст запросов с 2013 г. не менялся, сейчас посмотрел, да, в первом запросе неверно сделано соединение, надо переписать. Насчет районного коэффициента — не тестировал, у меня он не используется. Завтра постараюсь выделить время на доработку отчета.

    Для отбора по подразделениям изменила условие с «ПодразделениеОрганизации В (&СписокПодразделений)» на «ПодразделениеОрганизации В ИЕРАРХИИ (&СписокПодразделений)».

    Странно, вроде бы когда делал отбор по подразделениям, везде условие ставил В ИЕРАРХИИ,

    Reply ↓
  43. user860098

    (38) Спасибо огромное! Все работает ) к тому же скачал бесплатно )

    Reply ↓
  44. Dim4ik

    Выявилась ошибка при выводе количества сотрудников в первом разделе. Вместо 820 сотрудников выводилось 269. В коде количество занимаемых ставок берется из справочника сотрудники. Почему оттуда? Лучше из регистра кадровых данных. Так правильнее.

    Из-за перехода из другой программы у старых сотрудников не стояли занимаемые ставки и они не попадали в отчет, а попадали только новенькие сотрудники, соответственно и в разделе 2 меньше было строк.

    Поправили, теперь верно считает. Могу скинуть доработанную версию.

    Reply ↓
  45. user_2010

    На какой версии ЗУП работает отчет?

    Reply ↓
  46. Barney06

    (48) 2.5

    Reply ↓
  47. user_2010

    (49) понятно! Спасибо!

    Reply ↓
  48. Jokstr

    (47)

    Лучше из регистра кадровых данных. Так правильнее.

    Да, так правильнее, запрос в отчете поправил.

    Поправили, теперь верно считает. Могу скинуть доработанную версию.

    Не стоит, если других доработок нет. Поправить ставки в запросе — минутное дело.

    Reply ↓
  49. Drizer2000

    Неверно подставляется коды по образованию. Прикрепил скрин кодов. С чего вы решили,если код в 1с равен 7,то это код 4 (среднее общее), хотя это высшее и должна быть цифра 1.

    Reply ↓
  50. bnk72

    (51) Не берусь утверждать (так как у меня старая версия отчета), но проверьте еще в запросе КодПоОКПДТР (у нас вставал код первоначальной должности сотрудника в Организации при приеме, а не код ОКПДТР текущей должности, надо РаботникиОрганизацийСрезПоследних.Должность.КодПоОКПДТР КАК КодПоОКПДТР).

    И образование (графа 6 раздел II) кодировка противоположная в 2017 году: 1- высшее (06,07,08), …, 6 — не имеет основное общее образование (01,02).

    А так вроде все. Большое спасибо! Очень помогло…

    Reply ↓
  51. bnk72

    Ну вот, ни одни мы заметили…

    (52). Страничку не обновляла, поэтому увидела ваше сообщение только после того как свое отправила…

    Reply ↓
  52. Drizer2000

    (54) видимо кусок кода по получению кодов образования неглядя вытащили из какой-то другой программы. вот этот кусок:

    МИНИМУМ(ВЫБОР
    |     КОГДА ВидыОбразованияФизЛиц.Код В («»18 «», «»1 «», «»2 «»)
    |      ТОГДА 1
    |     ИНАЧЕ ВЫБОР
    |       КОГДА ВидыОбразованияФизЛиц.Код = «»11 «»
    |        ТОГДА 2
    |       ИНАЧЕ ВЫБОР
    |         КОГДА ВидыОбразованияФизЛиц.Код = «»10 «»
    |          ТОГДА 3
    |         ИНАЧЕ ВЫБОР
    |           КОГДА ВидыОбразованияФизЛиц.Код = «»07 «»
    |            ТОГДА 4
    |           ИНАЧЕ ВЫБОР
    |             КОГДА ВидыОбразованияФизЛиц.Код = «»03 «»
    |              ТОГДА 5
    |             ИНАЧЕ NULL
    |            КОНЕЦ
    |          КОНЕЦ
    |        КОНЕЦ
    |      КОНЕЦ
    |    КОНЕЦ) КАК Образование
    

    Показать

    В типовой 2.5 таких кодов то нет, которые здесь анализируются

    Reply ↓
  53. Drizer2000

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

    Reply ↓
  54. Drizer2000

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

    Reply ↓
  55. Jokstr

    (55):

    Отчет писался в 2013 г. для базы определенного предприятия (как и многие выложенные здесь за стартмани). Соответственно специалитета и магистратуры, как я подозреваю в 2013 году в справочнике «Виды образования физических лиц» не было. Код на тот момент не откуда не вытягивал «неглядя», а писал сам на основании данных вышеупомянутого справочника. К сожалению не имею времени, чтобы выявлять все подобные баги, но раз вы его заметили — исправлю.

    Reply ↓
  56. Jokstr

    (56):

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

    Reply ↓
  57. Jokstr

    (57):

    Код по выгрузке xml скопирован (не то чтобы «неглядя», но с некоторыми доработками) из отчета Андрея Бочкарева. Откуда информация о количестве знаков после запятой в xml?

    Reply ↓
  58. Jokstr

    (53) Исправил.

    Reply ↓
  59. Drizer2000

    (60) в самой форме в названиях колонки пишется инфа о количестве знаков после запятой. А увидел,что так неправильно, когда подгрузил хмл файл в программу по передаче электронной отчетности контур-экстерн, данные подгрузились нормально,но подсветились красным, как ошибочные, убрал лишние цифры после запятой в контуре и нормально отчет ушел.

    Reply ↓
  60. Jokstr

    (62) :

    Вчера скачал шаблон xml с сайта росстата, там так и есть, разрядность выгрузки в xml в обработке поправил.

    Reply ↓

Leave a Comment

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