Список граждан для сверки с военкоматом (с детализацией по семейному положению и образованию) для ЗУП 3.1




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

7 Comments

  1. invistik

    Доброе время суток, у меня вопрос, адрес проживания в отчете берется по прописке или место проживания, если мне нужно, что бы в отчет попадал место по прописке как это реализовать?

    Reply
  2. erutan

    (1) Здравствуйте!

    Тупой и быстрый метод «В лоб» — как последний абзац, перезаполнить ячейку, вызвав свою функцию, которая по ссылке на физлицо вернет нужный нам адрес из запроса.

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

    Задачи такой не стояло, так что не окунался.

    Reply
  3. erutan

    (1) Да, по умолчанию берутся данные Проживания, а не прописки.

    Под прописку можно сделать так

    &Вместо(«ВывестиМакетСписокДляСверкиСВоенкоматом»)
    Процедура Расш_ВывестиМакетСписокДляСверкиСВоенкоматом(ДокументРезультат, РезультатКомпоновки, ДатаОтчета)
    …….
    ЗарплатаКадрыОтчеты.ЗаполнитьПараметрыОбластиМакета(СтрокаТаблицы, ТекСтрока, ДанныеПользовательскихПолейСсылки);
    //доработанный блок ++
    ФЛСтроки = ТекСтрока.физическоелицо;
    //ДанныеОбОбразовании = ПолучитьДанныеОбОбразованииФЛ(ФЛСтроки);
    //СтрокаТаблицы.Параметры.ВидОбразования  = ДанныеОбОбразовании;
    АдресПрописки = ПолучитьАдресПоФЛ(ФЛСтроки);
    если не АдресПрописки=»» тогда
    СтрокаТаблицы.Параметры.АдресМестаПроживанияПредставление  = АдресПрописки;
    конецесли;
    //доработанный блок —
    СтрокаТаблицы.Параметры.ДатаРождения = Формат(ТекСтрока.ДатаРождения, «ДЛФ=Д»);
    
    …..
    КонецПроцедуры
    
    
    функция ПолучитьАдресПоФЛ(фл)
    адрес = «»;
    запрос = новый запрос;
    запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
    |Сотрудники.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |Сотрудники.ФизическоеЛицо = &ФизическоеЛицо»;
    запрос.УстановитьПараметр(«ФизическоеЛицо», фл);
    выборка = запрос.Выполнить().Выбрать();
    если выборка.Следующий() тогда
    
    КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина,
    выборка.Ссылка, «АдресПоПропискеПредставление», ТекущаяДата());
    адрес = КадровыеДанныеСотрудников[0].АдресПоПропискеПредставление
    конецесли;
    
    возврат адрес
    КонецФункции

    Показать

    Reply
  4. invistik

    (3)

    (1) Да, по умолчанию берутся данные Проживания, а не прописки.

    Под прописку можно сделать так

    Спасибо, попробую добавить в форму, запрос…

    или в модуль объекта…

    Еще рас спасибо за помощь!!!

    Reply
  5. user1282364

    Добрый день. Стоит актуализировать расширение, так как процедура ПервоначальноеЗаполнение…. была убрана из регистра вместо нее теперь ОбновитьСтроковыеСведенияФизическогоЛица.

    Reply
  6. erutan

    (5) здравствуйте!

    Спасибо за отзыв.

    Однако на 3.1 (3.1.10.174) процедура на месте/

    Вы уже перешли на ветку 3.1.11 ?

    Reply
  7. user1282364

    (6)3.1.11.108

    Reply

Leave a Comment

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