Удаление ненужных строк в ведомостях на выплату заработной платы ЗУП 3.0 / ЗУП 3.1 / КА 2.2 / ERP 2.2




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

14 Comments

  1. milov.aleksey

    Приветствую, Brawler! Спасибо за обработку. Подключил в ЗУП 3.0.25.118 КОРП:)

    Стоят задачи заполнять

    — Ведомость на выплату в банк с отборами по сотрудникам:

    1) По группам подразделений: Москва или Питер,

    можно было бы по группе подразделений, но установили флаг причём Настройки—>Расчет зарплаты—> установлен флаг «Расчет и выплата зарплаты по организации в целом».

    2) резиденты/ не резиденты(вид на жительство),

    — Ведомость на выплату в кассу

    штатники все / договорники территориальными группами по филиалам.

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

    Поэтому решил, что буду удалять не нужное из общего заполнения ведомостей.

    Reply
  2. Brawler

    (1) milov.aleksey, Да не за что.

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

    Reply
  3. new123

    Добрый вечер,

    ЗУП 3.1.2.238, при открытии обработки выдается сообщение: Итератор для значения не определен. Как можно решить эту ошибку, очень нужна помощь Вашей обработки.

    Спасибо.

    Reply
  4. Brawler

    (3) Данную обработку не нужно открывать через меню.

    Добавьте обработку как внешнюю в базу данных.

    Администрирование/Печатные формы, отчеты и обработки/Дополнительные отчеты и обработки

    Откроется окно в котором нужно загрузить мою обработку.

    После этого у вас в документе Ведомость появится кнопка Заполнить с операциями поддерживаемыми этой обработкой.

    Reply
  5. new123

    Большое спасибо, попробую.

    Reply
  6. quadrodecor

    Очень полезная обработка, расчетчик от Вас в восторге! Еще бы добавить опцию «УдалитьСтрокиСИностранцами» где НомерЛС = СтрокаЗарплаты.НомерЛицевогоСчета начинается с 4082

    Лицевые счета начинающиеся с:

    4082 принадлежат нерезидентам,

    4081 резидентам.

    Спасибо.

    Reply
  7. Brawler

    (6) Нужно подумать как лучше сделать такое, в лоб по 4082, 4081 (проще всего) или же как-то иначе проверять статус резидент или нет.

    Вечером посмотрю.

    Reply
  8. Brawler

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

    Reply
  9. MUTEGNIK

    Добрый день! На ЗУП 3.1 (3.1.5.129) будет работать?

    Reply
  10. Brawler

    (9) Добрый день. Должно. Если не взлетит, то пишите, поправлю ошибки и вышлю новую версию на почту.

    Reply
  11. user705522_constantin_h

    Так как у вас работает обработка, это правильно?

    У меня в ведомости Зарплата за февраль 2019 г. у сотрудника НДФЛ заполнился с периодами:

    — 31.07.2018, Доход в натуральной форме 00ЗП-000001 от 31.07.2018;

    — 01.03.2019, Отпуск 00000000583 от 07.08.2018;

    — 01.03.2019, Премия 00ЗП-000029 от 25.12.2018;

    — 31.01.2019, Доход в натуральной форме 00ЗП-000001 от 31.01.2019

    — 28.02.2019, Начисление зарплаты и взносов 00ЗП-000002 от 28.02.2019;

    — 28.02.2019, Доход в натуральной форме 00ЗП-000004 от 28.02.2019

    После выполнения команды Удалить суммы не относящиеся к месяцу выплаты остаются только 2 строки НДФЛ от 28.02.2019 г. Сумма НДФЛ уменьшается. Если на этой строке нажать кнопку Обновить налог, добавляются еще 2 строки НДФЛ:

    — 31.07.2018, Доход в натуральной форме 00ЗП-000001 от 31.07.2018;

    — 31.01.2019, Доход в натуральной форме 00ЗП-000001 от 31.01.2019.

    Строки от 01.03.2019 г., которые были изначально не добавляются.

    Правильно, что остаются только строки от 28.02.2019 г?

    Reply
  12. Brawler

    (11) Добрый день.

    Да, правильно, так и задумано изначально.

    2. Удалить суммы, не относящиеся к месяцу выплаты — Обработка пробежит по всем строкам и удалит выплаты и НДФЛ, не относящиеся к месяцу, указанному в шапке документа.
    Reply
  13. user705522_constantin_h

    (12)То, что обработка так задумана, я понял. А с точки зрения правильности расчета НДФЛ это правильно?

    Reply
  14. Brawler

    (13) Это сделано с точки зрения «Я так хочу», имею ввиду расчетчицу.

    Не хочу мол смешивать все в одном доке.

    Использовать вам этом метод или нет вам решать

    Reply

Leave a Comment

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