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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2018-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 не будет опубликован. Обязательные поля помечены *