<?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='\
А чем отличается от стандартного функционала?
Странно 1С не предусмотрели такой возможности. Надеюсь они все таки добавят подобный функционал.
(1) Какого стандартного функционала? Стандартного функционала (я имею ввиду автоматического создания сразу по всем банкам, источникам финансирования и статьям расходов) в ЗКГУ вообще нет. Все ручками нужно по-отдельности создавать. Здесь же: поставили галочку разбивать по статьям, выбрали способ выплаты например аванс или зарплата за месяц и жмете «Сформировать все ведомости» . Обработка вам сразу к примеру сотню документов создает. Когда у вас например 3 зарплатных проекта, 8 статей финансирования, 8 статей расходов итого 192 документа выплат трудно руками не ошибившись и не пропустив кого нибудь создавать.
Не надо так усложнять.Далеко не все надо делать ручками, если знать программу. Из документа «Начисление зарплаты» отлично автоматически сформируется сразу по всем статьям финансирования и статьям расходов. А также это работает из отпуска и больничного.
(4) боюсь что вы не понимаете проблемы. Я прекрасно знаю, что если не указывать конкретно статьи финансирования и расходов, то все формируется в один документ сразу по всем статьям. А вот вы попробуйте потом из него банковские файлы сформировать, когда финансистам необходимо на каждую платёжку отдельный файл. Платежи идут в разрезе банки-финансирование-расходы.
Не все же такие счастливые и работают с одним заплатным проектом. У нас развели демократию и 3 банка с разными требованиями к файлам. А тут ещё правительство с своей отменой банковского рабства.
Я отлично знаю эту проблему. И у нас много статей, но ведомости отлично формируются. И ведомости автоматически формируются по всем присутствующим в документах комбинациям «статья финансирования+статья расхода». У нас просто не бывает ведомостей выплаты с незаполненными реквизитами. И все эти ведомости отлично выгружаются в банки
Написав в (4)
я не имела в виду — в одну ведомость, а подразумевала — сразу все возможные варианты.
(6) Ну значит банковские обработки у вас по другому устроены. Я бы тоже лучше бы не множил документы, но расчетчикам привычно, когда каждому файлу соответствует определеный документ.
(6) а если документов начисление у вас не один а как у нас четыре, по числу расчетчиков (каждый работает с своими сотрудниками), но выплаты нужны общие.
(7) У нас стандартные банковские обработки. И естественно, каждому документу «ведомость в банк» соответствует свой выгруженный файл. Но разговор же не о выгрузке, а о создании самих ведомостей.
Я просто написала, что в программе есть возможности очень комфортно это делать. Но если кому-то ваше обработка облегчит жизнь — это здорово.
У нас начислений даже больше, но общих выплат по разным участкам у нас не бывает. Они не ждут друг друга. Каждый работает со своим участком
(9) ну если вернутся к вашему вопросу про отличие от стандартного функционала, то оно как раз в гибкости настроек, все таки в документе начисление всего одна кнопка. И она не решает проблему когда у вас несколько таких документов за месяц, а файлы нужны общие.
(10) у нас выплату делает один человек, старший расчетчик, она же следит за источниками. Интересно какая у вас численность и профиль организации.
Платёжки тоже кстати один всего человек делает и она не расчетчик, представляете если бы эти 192 документов еще на 4 расчетчика помножить. А ещё же есть межрасчет и аванс.
(3) из документа начисление зарплаты не считается. Там создаваемые выплаты касаются только этого документа. И не затрагивают другие.