Копирование строк табеля между документами




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

22 Comments

  1. gench

    На 3.1.3 не работает

    Reply
  2. evgen83

    (1) 3.1.3.158 все нормально работает.

    В чем неработоспособность заключается?

    Reply
  3. Dim4ik

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

    Возможно скопировать часы одного сотрудника другому?

    Reply
  4. evgen83

    (3) Копируется полностью вся строка и вставляется новая.

    Reply
  5. Dim4ik

    (4) Копируется вместе с сотрудником? Если другого сотрудника выбрать, то строка перезаполнится по его графику. Можно примеры?

    Reply
  6. evgen83

    (5)Да, копируется вместе с сотрудником, если выбрать другого, то произойдет перезаполнение строки по графику данного сотрудника

    Reply
  7. laf

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

    У меня вопрос тот же, что у 3. Dim4ik. Хочется часы одного сотрудника скопировать другому.

    Да, и на 3.1.5 можно, чтобы работала? Жалуется «Поле объекта не обнаружено «ДанныеОВремени»

    Reply
  8. evgen83

    (7) В заполненной строке другой сотрудник выбирается без проблем, но при этом программа заполнит данные о времени согласно его графику работы.

    При выборе какого действия появляется данная ошибка?

    Сейчас проверил на 3.1.5.272 при копировании/вставке данной ошибки нет.

    Reply
  9. evgen83

    (7) В процедуре ОпределитьСписокСвойствДляВставкиИзБуфера

    Убираете СписокСвойств.Добавить(«Сотрудник»);

    В процедуре ОбработкаВыбораПодборВставкаИзБуфера

    вместо СтрокаТабличнойЧасти = Объект[ИмяТаблицы].Добавить();

    указываете нужную вам строку табличной части.

    Reply
  10. laf

    У меня ЗУП 3.1.7.61, а не 3.1.5, прошу прощения.

    Нажимаю кнопку, выбираю «Копировать», — выдает «Поле объекта не обнаружено «ДанныеОВремени»,

    так что не могу проверить «Вставку».

    Reply
  11. laf

    {ВнешняяОбработка.ДополненияДляТабеля.МодульОбъекта(80)}: Поле объекта не обнаружено (ДанныеОВремени)

    КоличествоСтрок = Форма.Элементы[«ДанныеОВремени»].ВыделенныеСтроки.Количество();

    Reply
  12. evgen83

    (11) Проверил на 3.1.7.87.

    Все работает.

    А случаем не используется альтернативная форма табеля, где вместо табличной части табличный документ?

    Reply
  13. laf

    А как узнать какая форма используется? В конфигурации есть альтернативная, но я не в курсе — какая используется. От чего это зависит?

    Reply
  14. evgen83

    (13) Насколько мне не изменяет память, альтернативная форма становится доступна при использовании территорий.

    При обычной работе используется стандартная форма табеля.

    Reply
  15. laf

    Спасибо. Я пробовала территории, включала, потом отменила, ВРОДЕ. Сейчас посмотрю, если смогу определиться.

    Reply
  16. laf

    В учетной политике галочки нет

    Reply
  17. laf

    зато есть ОсобыеУсловияТруда

    Reply
  18. laf

    Спасибо, отключила Особые — изменилось «поведение» Табеля. Буду проверять в этом режиме.

    Reply
  19. laf

    Да, так работает, только, если выделить полностью 2 строки по сотруднику. Но все-таки, хотелось бы как предлагает 3. Dim4ik 16.01.18 20:49

    «… скопировать часы одного сотрудника другому?»

    Спасибо, еще раз, но немножко не то,что мне нужно. Да и табель заполнять неудобно, и без «ОсобыхУсловий» нельзя…..

    Reply
  20. evgen83

    (19) А в обычной форме табеля на сотрудника минимум 2 строки со временем, поэтому и копируется 2 строки.

    Как поменять обработку для для копирования часов от одному другому я писал выше.

    А вот под альтернативную форму табеля обработку нужно переделывать, т.к она работает с табличной частью, а не с табличным документом.

    Reply
  21. zhannasimakova@mail.ru

    Добрый день. А Вы не могли бы переделать обработку под альтернативную форму табеля и что бы при копировании заполненные часы не менялись при смене фамилии работника.

    Reply
  22. evgen83

    (21) Данная обработка использует типовые механизмы БСП для работы с табличной частью документа.

    В альтернативной форме документа используется таблица, что не дает использовать возможности БСП.

    Перезаполнение часов при смене фамилии это стандартное поведение программы и внешней обработкой его не изменить.

    Reply

Leave a Comment

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