Чат в 1С




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

8 Comments

  1. Lesha1C

    выложите вместе с конфигурацией, а не только обработку…как написано в тексте обработка не заработала…

    Reply
  2. micha26

    Прикольно ))

    Reply
  3. vec435

    если добавить возможность отправки ссылки на документы, элементы справочника 1С — вот это крутотень!

    Reply
  4. Demanoidos

    Посмотрите на хороший корпоративный чат и интеграцию с ним: http://infostart.ru/public/542472/

    Не нужно держать запущенный 1С на всех клиентских местах, да и вообще, инструмент «взрослый».

    Reply
  5. user616739_katenkanosatova

    Классная обработка

    Reply
  6. Mullakaev1992

    Можете выложить конфигурацию! пожалуйста

    Reply
  7. 🅵🅾️🆇

    (0) Прошу прощения за некропостинг. Реализовал подобный функционал. Может кому помогут мои наблюдения и направят в нужную сторону.

    Есть несколько моментов на которые стоит обратить внимание:

    1) получать данные о новых сообщениях с помощью JS в JSON формате. Если у Вас только управляемые формы под виндой то можно передать в переменную JS общий модуль 1с и тогда весь код подключения на форме сведеться к одной процедуре ЧатHTMLДокументСформирован(). Но если делать обновление через таймер JS не забывайте убивать его при завершении сеанса, а то оно так и подвиснет в консоле кластера и у клиента.

    2) попробуйте в верстке использовать аттрибут CSS «float» для сообщений и прочие прелести адаптивного дизайна.

    3) 1с все обещает выкатить функционал сервера для локального корпоративного чата вшитого прям в платформу

    4) возможно стоит использовать для хранения информации не метаданные 1с, а непосредственно писать сразу в скуль, тогда удобно будет расширить до веб формы и мобильного приложения, хотя это сделать можно и http сервисом 1с. В любом случае регистр сведений всяко лучше справочника для этих целей.

    5) может имеет смысл бэкэндом использовать существующий мессенджер (api телеги очень удобный, вполне можно написать свой клиент даже без использования специальных библиотек) или туже irc

    На скриншоте мой адаптивный чат, на управляемой форме есть только строковый реквизит «ЧатHTML» ну и HTML поле под него. Одна процедура «ЧатHTMLДокументСформирован(Элемент)» (немного слукавил, еще используется процедура закрытия формы и приложения, но в теории от них можно избавиться). JS запрашивает данные у регистра сведений в JSON каждые 5 секунд и выводит их не пересобирая чат. Также реализованна и отправка сообщений и выбор группы/пользователя (за одним пользователем 1с у нас может сидеть несколько людей).

    Reply
  8. 🅵🅾️🆇

    (7)

    Вот код прототипа чата который набросал, если вдруг кому интересно.

    JS принимает массив сообщений в JSON формате и использую HTML DOM добавляет их в контейнер «msgbox».

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

    Reply

Leave a Comment

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