Отчет "Доходы, вычеты, налоги сотрудников"




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

41 Comments

  1. buh

    В бухгалтерии 7.7. вывавливается ошибка:

    Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

    ДОХОДЫВЫЧЕТЫНАЛОГИСОТРУДНИКОВ.ERT(102)}: <<?>> с ДатаАктуальности по ДатаАктуальности;

    Запрос[2] : Неизвестный язык ‘с’

    Не удалось обработать справочник Сотрудники

    Reply ↓
  2. bb1962

    (1) Любопытно. Какая у Вас платформа: файловый вариант или для SQL, и какой релиз платформы?

    Я несколько изменил текст запроса по справочнику сотрудников, можете попробовать.

    Мне не удалось воспроизвести ошибку.

    Reply ↓
  3. buh

    Платформа 27, обычная семерочная база без всякого SQL. Просто у Вас в запросе было пропущено слово «Период», т.е. должно быть: «Период с ДатаАктуальности по ДатаАктуальности», в этом случае все проходит нормально.

    Reply ↓
  4. buh

    Вообще отчет понравился, спасибо большое, только вот в параметрах у вас есть полезный флажок «Не выводить в отчет пустые строки», но почему-то неактивный… Очень жаль. А то формирует по всем сотрудникам, даже по тем, которые уже давно уволены

    Reply ↓
  5. bb1962

    (3) В том то и дело, что работает и без «период», и на 27 релизе в том числе.

    Такой же запрос используется в типовых конфигурациях.

    Мне не удалось воспроизвести ошибку.

    Reply ↓
  6. buh

    (5) Ну у меня не сработало. Данные базы: 7.70.027, релиз 7.70.514.

    Попробовал в ЗиК — там действительно отрабатывает и без «периода». Не знаю, с чем это связано.

    Кстати, по-поводу типовых конфигураций… Я посмотрел, вроде везде слово «Период» присутствует в запросах..

    По-поводу вывода в отчет пустых строк прокомментируете?

    Reply ↓
  7. bb1962

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

    Reply ↓
  8. bb1962

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

    Reply ↓
  9. Ipse

    Любопытный отчет. Жаль, не учитывает иностранцев.

    Reply ↓
  10. psp95

    Конфигурация Бухгалтерский учет, ред. 4.5 7.70.509: Если глСобратьДанныеДляСтраховыхВзносов<<?>>(ДоходыВычетыНалогиСотрудников, СписокСотрудников, ДатаАктуальности, , , 0, СобиратьРасшифровку) = 1 Тогда

    {F:…EXTFORMSДОХОДЫВЫЧЕТЫНАЛОГИСОТРУДНИКОВ.ERT(254)}: Функция не обнаружена (глСобратьДанныеДляСтраховыхВзносов)

    Reply ↓
  11. bb1962

    (10) Релиз старый, нет там глСобратьДанныеДляСтраховыхВзносов, но и возможности для правильного расчета взносов тоже соответственно нет, обновитесь.

    Reply ↓
  12. findirDS

    Спасибо, всё получилось

    Reply ↓
  13. buh

    А что за колонка «Ограниченная база»? Вроде помесячно ничего у сотрудника по ней нет, а итог по этой колнке выводится…?

    Reply ↓
  14. buh

    Посмотрел внимательнее. вообщем «поплыли» все итоги по колонкам, т.е. в итог колонки «Ограниченная база» попадает итог колонки «Исчислено ФСС» и так далее, а итога последней колонки вообще нет.

    Reply ↓
  15. bb1962

    (14) Исправил

    Reply ↓
  16. bb1962

    (13) «Ограниченная база» это таблица значений, увидеть ее можно по двойному щелчку мышью.

    Может содержать несколько строк по нескольким тарифам, которые использовались в организации,

    но чаще одна строка.

    Reply ↓
  17. bb1962

    (9) Это не отчет не учитывает, а типовая конфигурация (глСобратьДанныеДляСтраховыхВзносов).

    Используйте ЗиК 296.

    Reply ↓
  18. buh

    (16) Ну все равно не пойму, зачем нужна эта колонка? У меня она пустая. По щелчку мыши я ее могу видеть, но зачем она мне? Базы по налогам расположены в соседних колонках. Да и название какое-то странное… По-моему только с толку сбивает…

    Reply ↓
  19. bb1962

    (18) > Да и название какое-то странное…

    ограниченная предельной величиной базы страховых взносов

    Reply ↓
  20. Adoms

    Ух ты!!! Ну вы ребята даете!!! Какие же молодцы!!! Спасибо Вам огромное, очень полезный отчет, особенно при совмещении двух режимов налогообложенияю Безусловно большой ПЛЮС разработке!

    Reply ↓
  21. tene

    Просмотрела поверхостно, на примере одного сотрудника. Но могу сказать, что отчет очень порадовал! 🙂 Спасибо и желаю успехов в дальнейшем!

    Reply ↓
  22. buh

    (19) Может тогда так прямо и назвать эту колонку во избежание путаницы, а лучше вообще вынести ее в другое место…

    Reply ↓
  23. bb1962

    Начиная с версии «1.2» отчет применим и в комплексной конфигурации «1С:Предприятие 7.7».

    Reply ↓
  24. fotinia59

    Огромное спасибо.Очень понравилось.

    Reply ↓
  25. Дэн

    Плюс однозначно, сам хотел сделать похожий, но руки не дошли) спасибо, успехов

    Reply ↓
  26. kalitwa

    не работает 🙁

    Reply ↓
  27. bb1962

    (26) А подробнее?

    Reply ↓
  28. kalitwa

    (27) Открывается, ставлю дату актуальности, нажимаю сформировать и ….. тишина :-). никакого отчета не выходит. программа 1С: УСНО релиз 175

    Reply ↓
  29. bb1962

    (28) У меня у самого УСНО и именно 175, все работает.

    Что вообще ничего не появляется?

    Д.б. по крайней мере заголовок.

    Попробуйте в параметрах установить явно «выводить суммы …»

    Reply ↓
  30. rimma_n

    Отчет очень полезный. Единственная просьба — помещать описание отчета в форму, чтобы мог просмотреть любой пользователь 🙂

    Reply ↓
  31. kalitwa

    (29) Каюсь. у меня несколько фирм и почему-то в одной базе не работает. зато в другой все прекрасно, только много пустых колонок 🙂 спасибо за обработку

    Reply ↓
  32. bb1962

    (31) Пустые колонки можно убрать в параметрах отчета.

    Reply ↓
  33. kalitwa

    (32) Спасибо. Пустые колонки убираются. 🙂

    Reply ↓
  34. gucci76

    С отчетом еще не разобрался, но установщик хороший.

    Что за прога делает такие установщики?

    Reply ↓
  35. bb1962
  36. karbofos

    Скачал, установил, оценил. Автор очень старался. Молодца. Обработка пригодилась. Так что Респект.

    Reply ↓
  37. b-dm

    Спасибо огромное, отличная разработка. вот бы ещё она позволяла отсекать только Начисления,

    не выводя колонки Базы налогов.

    Reply ↓
  38. slashmax

    Спасибо, отличная вещь.

    Reply ↓
  39. Gushyan

    Ошибка:

    Сумма = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы + Индекс, ИндексКолонки) — СуммаПоПредыдущийМесяц;

    {PRDEMOEXTFORMSДОХОДЫВЫЧЕТЫНАЛОГИСОТРУДНИКОВ.ERT(335)}: Операция вычитания не определена для строковых величин

    —————————

    Reply ↓
  40. bb1962

    (42) В последних релизах такая ошибка есть, исправил.

    Reply ↓
  41. aimerlive

    Хорошая обработка.

    Reply ↓

Leave a Comment

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