1С 8.1: Интерфейс: Работа с формами




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

26 Comments

  1. alexk-is

    Какая короткая статья…

    Reply
  2. Alraune

    (1) 33 страницы — короткая?

    Reply
  3. jan27

    (1) Чего-то не хватает?

    Reply
  4. alexk-is

    (2) Что вижу, то пою. Полстраницы и только ссылки…

    Reply
  5. Alraune

    (4) Так там файл с текстом приложен

    Reply
  6. tango

    полезно, может быть, для 0снегов.

    но за объем +

    Reply
  7. alexk-is

    (5) Вот и я об этом же

    Reply
  8. Alraune

    (7) Да, но посмотрите сам текст и количество картинок. Чем выкладывать все это, при том, что каждую картинку надо заливать отдельно, проще застрелиться… уж если честно))

    Reply
  9. alexk-is

    (8) Не каждую, а по 3 за раз.

    И статью можно было бы не всю (если лень), а хоть какую-то часть.

    Reply
  10. Ish_2

    Я так понимаю — нет опыта оформления.

    Так оформленную статью многие просто проигнорируют.

    И скачивать текст мало кто будет.

    Но за труды +.

    Reply
  11. jan27

    (11) какое должно быть оформление?

    Reply
  12. Alias

    Хорошая работа, с картинками, примерами и подробным объяснением.

    Для начинаюших 1Сников может оказаться весьма полезной.

    Продвинутым, конечно, ничего нового не скажет, кое-чего даже не хватает.

    Например попробуйте решить такую нетривиальную задачу как скрытие панели, рис.40-41, в случае если между панелью и табличной частью находится разделитель. Уверяю Вас, приведённого кода будет недостаточно, а вопрос возникает часто, и даже у опытных программистов зачастую вызывает сложности.

    Плюс ставлю хотя бы за то что такую инструкцию всё же написали. У других и на это не хватает времени/желания.

    Reply
  13. Alias

    (14) не встречался с таким решением. Можно уточнить, как в этом случае помогут две панели?

    Рекомендацией представителей 1С в этом случае было последовательное свёртывание панели, программная перепривязка разделителя и его свёртывание. При показе наоборот.

    Reply
  14. tango

    (14) нет

    Reply
  15. tango

    (15) рекомендации эти… ну, для начинающих 🙂

    Reply
  16. jan27

    (15) для таблиц, на мой скромный взгляд, логичнее использовать только разделитель

    сворачивающаяся панель и разделитель — это перебор. Но если есть желание прятать таблицы — две панели, сворачивающиеся попеременно.

    Reply
  17. Alias

    (17) Можете предложить другие? 🙂 Буду признателен за пример обработки.

    (18) почему перебор. Нормальная ситуация. Например два таблицы на форме (одна основная, вторая содержит какую-то вспомогательную информацию), между ними разделитель, что логично для того чтобы можно было регулировать ширину таблиц. Но при этом иногда нужно иметь возможность вообще свернуть вспомогательную таблицу чтоб не мешала.

    Reply
  18. jan27

    (19) я не навязываю, но моё мнение таково: либо разделитель (для таблиц), либо панель и оно принципиальное с точки зрения дизайна.

    Если посмотреть с другой стороны — принципиально найти оригинальное решение для панели с разделителем, то в (15) вы раскрыли решение

    Кроме того, в этой статье мне хотелось показать, что многие задачи решаются конфигурированием с минимальным использованием программирования

    Reply
  19. jan27

    Если кому интересно:

    «…Если хочется сворачивать так, чтобы при развороте работало с разделителем, нужно соблюсти нужный порядок свертки элементов и восстановления привязок. Я эти танцы с бубном одолел и выкладываю как есть:…» (С)

    http://www.forum.mista.ru/topic.php?id=522998

    Reply
  20. Alias

    Да, универсальная процедура для этих «танцев с бубном» была предложена Алексеем Полубенским ещё в 2005 году на парт.форуме.

    Просто судя по тому что этот вопрос с завидной периодичностью всё же будоражит умы, вопрос не потерял своей актуальности 🙂

    Reply
  21. jan27

    (22) будоражат умы и другие загадочные вещи. Этого можно избежать посмотрев на проблему с другой стороны: а так ли это необходимо и можно ли найти простое решение?

    «Все гениальное просто» (с)

    Reply
  22. tango

    (19)

    Reply
  23. Alias

    (24) Простите, видимо я не совсем понял… или не там смотрю 🙂 мне кажется в приведённом примере как раз и реализовано последовательное программное перепривязывание и панели, и разделителя, с последующей их свёрткой. То есть именно то, о чём я и говорил в 15 сообщении. В чём заключается демонстрация «других рекомендаций»?

    Reply
  24. balabani

    Спасибо

    Reply
  25. serpisal

    Спасибо, помогло!

    Reply
  26. Светлый ум

    Неплохо, для начинающих вполне себе полноценная инструкция по привязкам и переключателям.

    Reply

Leave a Comment

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