Просмотр движений документа (управляемые формы)




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

15 Comments

  1. Kamikadze

    Неплохо, но таких обработок туча.

    Reply
  2. SoulCast

    Спасибо, пригодилось

    Reply
  3. gull22

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

    Нет планов допилить для движений регистров бухгалтерии?

    Reply
  4. fjay69

    (3) gull22, регистры бухгалтерии для меня — тёмный лес, поэтому я не стал их делать. Можно сделать поддержку частного случая — регистр бухгалтерии из типовой конфигурации 1С, однако в БП уже есть обработка просмотра движений, так что не вижу необходимости в доработке.

    Reply
  5. olbu

    Неплохо! Тож понравилось отображение в таком виде, а то в стандартном функционале все время приходится сворачивать группы, а потом пробегаться по записям, что не удобно, особенно когда используешь поиск…

    Reply
  6. Swetlana

    (5) olbu, а как это можно увидеть в стандартном функционале?

    Reply
  7. alexdm

    Очень удобно. Начал работать с ЗУП 3.0, практическое отсутствие нормального стандартного функционала просмотра движений уже просто достало (вариант с настройкой формы для показа движений в интерфейсе «такси» это еще то извращение), тыкаешься, как слепой котенок. Была мысль написать свое, но времени катастрофически не хватает, и так потратил полдня на допиливание под себя стандартной консоли запросов под управляемые формы, так что спасибо автору за проделанную работу.

    Reply
  8. Swetlana

    (7) alexdm, я не нашла как в такси увидеть форму движений документа. Подскажите как это сделать!

    Reply
  9. alexdm

    (8) Swetlana, На примере ЗУП 3.0 (В БП 3.0 примерно то же самое, просто сейчас лениво ее открывать) — Заходим в Администрирование — Печатные формы, отчеты и обработки — ставим галку «Дополнительные отчеты и обработки». Дальше жмем справа гиперссылку «Дополнительные отчеты и обработки». В форме давим «Создать», дальше «Загрузить из файла». Жмем гиперссылку «Назначение», отмечаем галками те документы, движения которых хотим видеть. Все. Дальше в меню кнопки «Печать» появляется «просмотр движений документа». Хотя можно просто открыть обработку, выбрать документ и посмотреть, но это уже для любителей извращений. Автору еще раз респект.

    Reply
  10. Swetlana

    (9) alexdm, спасибо за ответ, про обработку я поняла

    А можно ли это сделать типовым способом. Как я поняла в режиме УФ это можно сделать но не нашла как это сделать в режиме такси, видимо невозможно?

    Reply
  11. alexdm

    (10) Swetlana, Не знаю, что Вы делаете и как, но у меня в «Такси» все работает в ЗУП 3.0, по крайней мере там, где мне это было надо. Опишите подробнее, где и что у Вас не получается — конфигурация, платформа, документ…

    Reply
  12. Swetlana

    (11) alexdm, нашла как

    кнопка меню (которая сверху слева со стрелкой вниз) — вид — настройка панели навигации формы

    Reply
  13. olbu

    (6) Swetlana, Вот скрин из типовой Розницы 2.0 — Управляемые формы…

    Reply
  14. Denis211990

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

    Чтобы было удобно заполнять, вместо выбора сначала типа документа а потом еще и его самого

    Reply
  15. idw

    .

    Reply

Leave a Comment

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