Вариант динамического интерфейса




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

28 Comments

  1. хорошая идея, но не новая

    Reply
  2. Ivon

    (1). На новизну не претендую. Пример показывает саму возможность и как это реализовывается.

    Reply
  3. sound

    Я кстати тоже когда стало надо такую штуку сначала хотел сделать панелькой с вкладками, но потом решил на хтмл-е сделать.

    Глянь, может для себя что-нибудь за идею возьмешь

    http://infostart.ru/projects/4559/

    Не подумай, что пиарю 🙂

    Reply
  4. Ivon

    (3). Как раз твой пример и натолкнул, но реализация в HTML мне не понравилась. Вообще ищу возможность добавлять стандартные контролы системы, вот тогда можно было бы развернуться. Пока не нашел.

    Reply
  5. sound

    Ну это нормальная ситуация, не нравится чужое, пиши свое 🙂

    Ну это уж как говорится на вкус и цвет 🙂

    Reply
  6. sound

    (4) Мне кстати и самому (да и юзерам моим) сначала казалось, что как-то неудобно и непривычно, а щас ничо, говорят: «придешь, запустишь и прям работать охота» 🙂

    Reply
  7. ut2k5

    по поводу контролов, я вот сейчас пытаюсь разработать с помощью Flash ActiveX, может кто знает, что это такое, так вот флеш мне дает графическое расширение, которое в 1с естс не развито (хотя это и не надо)…, идея такая существует доп. справочник контролов, который может генерить даже пользователь (естс ответственнй пользователь), при активации панели с использованием flash компоненты при помощи протокола xml предаются данные, ну а по ним строится интерфейсная модель, идея доходит до того, что можно подгружать интерактивную карту, на которой размещены области и объекты (города, контрагенты), таким образом путем активации объекта (тупо клик) можно выписать счет или оформить доставку, что то я нафлудил….

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

    Reply
  8. sound

    Сейчас многие вещи частично или полностью делают с поддержкой веб интерфейса, ну и Flash там же. И вроде у 8.2 там тоже уже такой «вебный» интерфейс. Злые языки вообще поговаривают, что будущее за вебом 🙂

    Reply
  9. Ivon

    (7). С флешом тоже идея хорошая. Надо будет подумать

    Reply
  10. nvoynov

    Очень полезная вещь, спасибо — сдеру завтра. Типовые интерфейсы конфигураций крайне перегружены, тогда как простым смертным пользователям 90% функций просто не нужны.

    Reply
  11. LavS

    Эх, не забыть бы после завтра закачать… А то закачки на сегодня и завтра у меня уже запланированы, а как известно можно только 1 в день закачать, если рейтинг меньше 30…

    Reply
  12. Ivon

    Интерфейс развился и теперь есть 2 варианта: изначальный и узкий, в котором вкладки заменены на обычное подменю. Это продиктовано просьбами пользователей с широкоэкранными ноутами, а у них, как правило, ширина экрана делается в ущерб высоте. Этот вариант выложу немного позже, так как его надо выдрать из конфы.

    Теперь немного о самой реализации построения. Был создан справочник «Интерфейсы», состоящий изназвания и табличной части с колонками Страница, Линия1, Линия2, Линия3, Действие. Соответственно последняя линия являлась кнопкой с действием, а предыдущие линии (если они есть) — подменю. Действие = имя процедуры в модуле формы. В справочние «Пользователи» так же была добавлена табличная часть «Интерфейсы» с колонками «Интерфейс» и «Активность». Таким образом пользователю можно сделать сборный интерфейс, состоящий из нескольких. Так же у пользователя был добавлен флаг «Узкий интерфейс».

    Reply
  13. Ivon

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

    Reply
  14. Ivon

    Может кто знает, как можно основную менюху програмно прятать и показывать?

    Reply
  15. airyashov

    можно создать пустой интерфейс и переключатся на него

    Reply
  16. Ivon

    Да я и так пустой интерфейс подставляю. Хочется просто программно прятать основное меню там где «Файл» и т.д. и обратно отображать.

    Reply
  17. Ivon

    Добавлен вертикальный вид интерфейса.

    Reply
  18. betepon

    (18) основываясь на вашем опыте и примере сделал собственную обработку и выложил ее сюда.

    http://infostart.ru/projects/5781/

    100 % совместима с Вашими обработками.

    Reply
  19. betepon

    В вашей обработке добавил возможность хранения процедур в общем модуле.

    Для этого использовал подсказку.

    Изменения в коде следующие:

    1. В процедуре «ПередОткрытием» заменяем

    Новый Действие (Эл.Действие) на Новый Действие («КнопкаНажата»)

    Процедура КнопкаНажата (Элемент)

    Попытка

    Выполнить (Элемент.Подсказка);

    Исключение

    КонецПопытки;

    КонецПроцедуры;

    Процедура ПередОткрытием (Отказ, СтандартнаяОбработка)

    ….

    Для каждого Эл из Элементы Цикл

    СтрокаКоманды = «СобытияИнтерфейса.» + Эл.Действие + «();»;



    Лин3 = Лин2.Кнопки.Добавить ….

    Лин3.Подсказка = СтрокаКоманды;



    Лин2 = Лин1.Кнопки.Добавить ….

    Лин2.Подсказка = СтрокаКоманды;



    Лин1 = ЭлементыФормы[ ….

    Лин1.Подсказка = СтрокаКоманды;



    КонецПроцедуры

    Соответственно все действия переносятся в общий модуль

    «СобытияИнтерфейса» и к каждому действию добавляется «Экспорт»

    Преимущества — возможность использовать в одной конфигурации несколько динамических интерфейсов, а действия изменять сразу для всех интерфейсов централизованно в одном месте.

    Reply
  20. Ivon

    (20). У меня все процедуры по интерфейсу хранятся в одном месте — общая форма «ОсновноеМеню». Если используется вертикальный интерфейс, то он все-равно обращается к процедурам формы «Основное меню». Эти же процедуры можно открыть из любого места конфигурации, то есть использование любых других видов интерфейсов так же возможно.

    Reply
  21. DMSDeveloper

    (7) Работа с Flash в 1С возможна! Постараюсь в ближайшие день — два выложить некий пример по работе с картами.

    Reply
  22. Aydrey

    Большое спасибо. простой и ничего лишнего. спасибо за сэкономленное время.

    Reply
  23. goodwin12

    Чето в 8.2 ошибки

    Reply
  24. Ivon

    (24) Он не предназначен для управляемых форм.

    Reply
  25. goodwin12

    Да нет формы обычные просто под 8.2 сконвертировал

    Reply
  26. Ivon

    Странно. Мы конвертили — у нас все работало. Где ошибку выдает и какую?

    Reply
  27. Oleeeg

    Еще бы действия генерить прямо в справочнике интерфейсов, чтоб процедуры не дописывать при добавлении какого-то нового пункта меню. Тогда пользователи смогут делать менюшки сами без участия программиста

    Reply
  28. Ivon

    (28) Oleeeg, у себя уже дописал. Просто вписываю в «Действие» код вызова нужной формы. Сделать это несложно.

    Reply

Leave a Comment

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