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




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

24 Comments

  1. Alex_E
  2. webester
  3. DenisCh

    А зачем изобретать велосипед опять?

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

    Reply
  4. webester

    (3)У меня обработка «данные объекта» валяется уже не знаю, лет 10, она еще для 8.1 но тем не менее вот такого плана вещи вижу постоянно. Поискать по ИС, перед тем как пилить, как то не судьба что ли…

    Reply
  5. Поручик

    А ничего, по скринам годная вещь. Но я по привычке и солидарности использую девайс от Трактора, модифицированный им же, времён 8.0. Классика ведь.

    Reply
  6. Sardukar

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

    Reply
  7. mikl79

    Добрый день.

    Не работает, пишет

    {ВнешняяОбработка.УниверсальныйРедакторРеквизитов.МодульОбъекта(159)}: Поле объекта не обнаружено (ОбластьДанныхОсновныеДанные)

    НоваяСтрока.ТекущееЗначение = Объект[Значение.Имя];

    Reply
  8. uri1978

    (7) Какая конфигурация, платформа? В какой момент выдается сообщение? Используются ли расширения?

    Reply
  9. uri1978

    (7) Данная ошибка исправлена. Возникала на конфигурациях с разделением данных.

    Reply
  10. mikl79

    (9), добрый день.

    хорошо, что исправили, можете мне скинуть обработку, чтобы мне не тратить стартмани — я ведь уже заплатил один раз

    Reply
  11. uri1978

    (10) Не вопрос, скину, дайте контакт (на инфостарте не нашел).

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

    Reply
  12. mikl79

    Добрый день, в профиле указана почта mikl79@list.ru

    Сейчас когда нажал Скачать, он не стал спрашивать о снятии стартмани и действительно не снял!

    Спасибо скачал, начал тестировать.

    Выявил ошибку:

    конфигурация — Зарплата и управление персоналом, редакция 3.1 (3.1.4.169)

    платформа — 8.3.10.2561

    При открытии документа Больничный лист и нажатии флага «Движения» вышла ошибка — Недопустимое значение

    и не отобразилось ни одного движения ни по одному регистру

    И еще не хватает флага «Отображать только заполненные движения», а то слишком много регистров

    Reply
  13. uri1978

    (12) «Отображать только заполненные движения» — такой флаг есть с самого начала, он вынесен на главное окно — «Только заполненные таблицы». Будут выводиться табличные части и движения у которых есть строки.

    Такой конфигурации у меня нет, сложно протестировать… Попробую что-то решить.

    Reply
  14. mikl79

    (13), у меня этот флаг не сработал, может быть из-за ошибки

    Reply
  15. uri1978

    (14) Скорее всего. Попробуйте на другой конфигурации.

    Reply
  16. mikl79

    (15), а почему на этой не работает — конфа типовая

    у вас этой конфы нет, хорошо протестирую на типовой БП 3

    Reply
  17. mikl79

    (16), на БП 3 вроде работает, но там мало движений

    Reply
  18. uri1978

    Ошибку по движениям исправил (еще не обновил на инфостарте) — возникала из-за того, что в документе «Больничный лист» есть табличная часть «Начисления» и движения по регистру «Начисления». Не верно формировалась панель для вывода.

    В процессе тестирования, столкнулся еще с ошибкой — нельзя использовать режим модальности, а у меня задаются вопросы пользователю в модальном режиме. Нужно исправлять…

    Reply
  19. uri1978

    Обработка обновлена.

    Reply
  20. mikl79

    Спасибо за обновление, теперь буду использовать в ЗУП 3, там как раз запрет модальных окон.

    Протестил в ЗУП 3 — работает.

    Вообще классная вещь, спасибо автору!

    Reply
  21. uri1978

    (20) Спасибо

    Reply
  22. sps02

    Добрый день. Движение документов в 1С рознице 2.1 возможно?

    Спасибо

    Reply
  23. uri1978

    (22) Здравствуйте. Предполагается что обработка работает в любой конфигурации (хоть в самописной).

    Reply
  24. VitHammer

    (3)

    портативные инструменты разработчика

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

    Не аргумент? Вот я запустил ЗУП 3.1.10.156 в режиме обычного приложения. Получил ошибку (см. скрин). А обычно ЗУП этот работает как часы. Никогда не вылетает. Кроме как в случае запуска в неуправляемом режиме.

    Тогда я открыл данную обработку и и отредактировал всё, что нужно. Быстро и без проблем.

    Так что это ни разу не велосипед, а очень даже полезный инструмент.

    Reply

Leave a Comment

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