Поиск документов по представлению




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

10 Comments

  1. paulpit

    Если в представлении документа в скобках прописан вид операции, то так понимаю, такой документ не идентифицируется?

    Reply
  2. GOshaSaveiko

    (1) Можете строку с таким документом показать, пожалуйста?

    Может получиться так, что найдется. Если синоним документа присутствует в представлении документа, то он, поочерёдно прикладывая синонимы из метаданных определит вид документа. Правда, могут возникнуть трудности потом с нахожденеим номера. Напишите мне свою электропочту в личку — я скину вам обработку — протестируем.

    Reply
  3. paulpit

    (2)paulpit@yandex.ru пока не могу найти, но помню раньше встречал вид операции в представлении документа.

    Еще не смогли найти Счет-фактура выданный на аванс NNNNN (А) от 31.03.2018 23:59:59

    (А) — мешается.

    Reply
  4. GOshaSaveiko

    (3) есть подозрение, что это номер видоизменяется. То есть в форме номер — синтетический, а-ля «НомерДок». А реальный номер документа NNNNN (А) с видимостью 0

    отправил на почту.

    Reply
  5. paulpit

    (4) Постфикс (А) — это требование законодательства по НДС.

    Reply
  6. GOshaSaveiko

    (5) Или ото https://its.1c.ru/db/v8312doc#bookmark:dev:TI000000279:

    ДокументМенеджер.<Имя документа>.ОбработкаПолученияПредставления (DocumentManager.<Имя документа>.PresentationGetProcessing)

    ДокументМенеджер.<Имя документа> (DocumentManager.<Имя документа>)

    ОбработкаПолученияПредставления (PresentationGetProcessing)

    Синтаксис:

    ОбработкаПолученияПредставления(<Данные>, <Представление>, <СтандартнаяОбработка>)

    Параметры:

    <Данные>

    Тип: Структура.

    Содержит значения полей, из которых формируется представление.

    <Представление>

    Тип: Строка.

    Строка, в которую нужно поместить представление объекта или ссылки.

    <СтандартнаяОбработка>

    Тип: Булево.

    В данный параметр передается признак формирования стандартного представления объекта или ссылки.

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

    Значение по умолчанию: Истина.

    Описание:

    Вызывается при получении представления объекта или ссылки.

    Замечание:

    Безопасный режим на время исполнения данного обработчика будет отключен. Данное замечание не относится к обработчикам событий, расположенным в расширении конфигурации.

    Показать

    Если так — то ещё не понятно, что лучше написать — свой костыль по получению номера для каждого типа документов, где стандартное представление изменено, или заморочиться на универсальность, что, на мой взгляд, не стоит затраченных усилий и результата

    Reply
  7. admrez

    Сформировал отчет дебиторская задолженность по срокам долга. Скормил обработке список из отчета, но документы не определились — пишет «строка не выглядит ка представление документа»

    Идея отчета очень интересная и нужная.

    Может я что-то делаю не так?

    УТ11.4.3.174

    Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07, 19.07.2016 20:33:07

    Реализация товаров и услуг ДНТА-000622 от 28.07.2016 16:00:46, 28.07.2016 16:00:46

    Реализация товаров и услуг ДНТА-000687 от 16.08.2016 20:04:34, 16.08.2016 20:04:34

    Реализация товаров и услуг ДНТА-000741 от 01.09.2016 18:52:31, 01.09.2016 18:52:31

    Реализация товаров и услуг ДНТА-000805 от 15.09.2016 21:28:45, 15.09.2016 21:28:45

    Reply
  8. admrez

    Если подать в виде Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07 — то тогда определяется документ. Но теряется смысл обработки. Как можно обойти все, что после запятой?

    Reply
  9. admrez

    Изменили в отчеты формат вывода — вроде стало получаться. Жизненно необходима фича

    1. Убрать первые символы в строке в количестве N штук

    2. Убрать последние символы в строке в количестве N штук

    Reply
  10. GOshaSaveiko

    (9) добрый день. Таки да. Строка первоначально не выглядела как представление документа. Он бы вам ничего не нашел. Обычно есть способ вывести только регистратор. Если он вывел дополнительно дату через запятую, то в настройках отчёта можно попросить не выводить реквизиты в отдельной колонке. Либо сформировать отчёт без поля дата. Код обработки расписан очень подробно и вашу просьбу вы можете легко дописать самостоятельно в одну строчку кода, либо подготовить данные в excel. Я учту ваши пожелания, если соберусь переписывать обработку для получения документов с кастомным представлением. Спасибо.

    Reply

Leave a Comment

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