ЗУП 2.5 Рулим лицевыми счетами. Пилим "Зарплата к выплате организаций" по банкам. Выгружаем данные в Сбербанк, Альфа-банк, Газпромбанк,Транскредитбанк, Райффайзенбанк.




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

16 Comments

  1. 105raz

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

    Reply
  2. 105raz

    Да, забыла, а заявки на открытие лицевых счетов есть? Для тех же пяти банков в их разных форматах?

    Reply
  3. philya

    (1) 105raz, удаляется. Регистр сведений хранящий лицевые счета непериодический, а в конфигурацию мы изменений не вносим.

    (2) 105raz, у меня нет — с этим как-то справляется отдел кадров в ворде и экселе.

    Reply
  4. logdog

    А есть возможность добавить проверку…

    Если разделить ведомость, сохранить, а потом повторно разделить — создаются дубли ведомостей по банку.

    + есть сотрудники, которые получают деньги через кассу, в этом случае в комментариях всегда ошибка распределения.

    Reply
  5. philya

    (4) logdog, У меня дубли только в комментариях создаются. Документ остается неизменным. Второй не появляется. Если у Вас не так пишите, последовательность и результаты подробней.

    С комментариями, согласен, не аккуратненько получилось. Поправлю.

    Ошибка распределения по банкам, для людей не имеющих лицевого счета — это правильно 🙂 Вас смущает комментарий в документе, в котором они остаются? Давайте вместо «Ошибки распределения по банкам» напишем «Не удалось распределить по банкам»? Или могу вообще не писать никаких комментариев.

    Reply
  6. logdog

    (5) 2.5.68.1

    Зарплата к выплате — заполнить — разделить ведомость — сохранить. В итоге имеем 2 зарплаты к выплате.

    Повторное заполнение зарплаты к выплате — разделение — сохранить. В итоге имеем 3 зарплаты к выплате (два дубля).

    По поводу комментарием, даже не знаю. У Вас, возможно, нет сотрудников, кто получает деньги из кассы, в этом случае коммент нужен, а для тех у кого есть — он излишен.

    Reply
  7. philya

    Ага. Понял. Проверку для такой ситуации воткнуть можно, но что делать с документом, который повторно заполнили и пытаются разделить? Вывести сообщение «вы уже пилили этот документ» и ничего не делать?

    Ну можно ввести еще свойство «получает деньги в кассе», но проще завести «банк» с названием «касса» и проставить всем сотрудникам получающим деньги в кассе лицевой счет «1». После чего в ошибках будут оставаться только те у кого больше одного счета и не выбран основной. А в ведомости на выплату через банк «касса» нужно будет перещелкунть «через банк» на «через кассу».

    Reply
  8. Manoshkin

    Замечательная вещь. Единственно пришлось еще раз руками выбрать что выплата через банк, для отображения поля банка.

    Reply
  9. philya

    (8) Manoshkin, Опишите последовательность действий, после которых нужно еще раз выбирать руками вариант — у меня не получается.

    Reply
  10. Manoshkin

    (9) Версия ЗУП 2.5.69.2 создали документ «Зарплата к выплате» указали «Способ выплаты» «через кассу». Далее «заполнить», «разделить ведомость по банкам». Через кассу никого нет. Ведомость остается открытая. Способ выплаты меняется на «Через банк», в комментарии банк указан, а (по крайней мере в изначальной ведомости) напротив «Способ выплаты»»Через банк» пусто. Руками заходим в поле «Способ оплаты» и еще раз подтверждаем «через банк». Выскакивает надпись «Банк:» и наименование банка. Возможно просто разделяемом уже открытом документе видимости полей не хватает.

    Reply
  11. serge_focus

    Спасибо. ПЛЮС. Идея очень хорошая. Попробую использовать в УТП для Украины.

    Только вот найду время на «напильник».

    Reply
  12. bnk72

    Спасибо автору. Переходим с 1С7.7:ЗИК на 1С8:ЗУП, понадобилось перенести имеющиеся в 7 доработки. Бухи, думаю, еще оценят автоматическое деление ведомостей и выгрузку в зависимости от банка. А от меня спасибо за лаконичный структурированный код и оригинальное (для меня, так как в 8 пока только ученик…) использование внешних обработок.. Жаль, нет заявок на открытие счетов, был бы полный комплект.. Трудолюбивые у вас кадры… У нас единственный бух по ЗП занимается всем этим, причем для десяти организаций, поэтому в 7.7 и реестр на выпуск, и на изменение данных держателей (ГПБ уж сильно много хочет знать), и реестр уволенных формировали программно…

    Reply
  13. philya

    (12) bnk72, Реестры в банки у нас формируют настройкой отчета по сотрудникам: там через ключик гаечный можно добавить и убавить все что угодно.

    Reply
  14. teplova

    ПлАчу….Почему же этот добрый человек не пишет такую красоту для ЗУП 3.1 ?

    Reply
  15. philya

    (14) Ну почему же сразу не пишет? ) Не выкладывает. Не выкладывает потому что смартманей ему больше не нужно, А за рубли, наверняка, никто не купит )

    Reply
  16. teplova

    (15) Может и купили бы, но как-то связка Инфостарт-Работодатель не работает, а программист — не альтруист, у него только смартмани и есть, причем очень немного 🙂 А за сколько рублей продаете? Кстати, благодарность пользователей тоже бывает очень приятна… 😉

    Reply

Leave a Comment

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