Реализация чата на 1С 8,3 (Управляемые формы)




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

    Интересно, но — если ключей еще нет то после создания ключей продолжение процедуры дает ошибку в этой строке(«ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());» Еще перепутаны в форме с ТЗ (пользователи) = Адресат = Элементы.Пользователи.ТекущиеДанные; — здесь напутано в именах

    Reply
  2. iolko

    (1) seermak, Доброго дня, действительно были недочеты, спасибо, что вовремя указали. Исправил, внес корректировки в код. Отправил на модерацию. Так же добавил скрины того что в итоге получается.

    Reply
  3. sashocq

    Выглядит как-то сыровато. Сделать только простенький чат — дело не хитрое. Тут, конечно, фишка в шифровании. Но в данной реализации оно выглядит неуместным. У нас рядом в базе лежит регистр с зашифрованными сообщениями и тут же в константах открытый и закрытый ключи (секретностью тут не пахнет). Если бы обмен сообщениями осуществлялся между разными базами — это можно было бы понять, а так нет. Если вы хотите сделать чат внутри одной базы между разными пользователями с шифрованием, то у каждого пользователя должен быть свой закрытый ключ, который не передается на сервер.

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

    Итогом, если статью назвать «как шифровать в 1С через COM», то пойдет, а с текущим заголовком — не зачет.

    Reply
  4. seermak

    (3) да дело здесь скорее не в самом чате — + за то, что подвинул на изучение криптографии на таком простом примере))

    Reply
  5. DragEugen

    спасибо сподвигли на изучение криптографии в 1с

    Reply
  6. hazd

    что-то подобное на данном ресурсе уже встречалось,

    Reply
  7. maksa2005

    Особено актуально, когда на работе запрещено устанавливать icq

    Reply
  8. informa1555

    Интересная статья, но визуально выглядит не очень. Я делал на СКД полностью чат вот в этой разработке http://infostart.ru/public/309075/

    Reply
  9. lampa24111986

    {ОбщийМодуль.RSA_Шифрование.Модуль(80)}: Ошибка при вызове метода контекста (FromXmlString)

    ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());

    по причине:

    Произошла исключительная ситуация (mscorlib): Недопустимый синтаксис в строке 1.

    Reply
  10. lampa24111986

    Странно, всё сделал. В обработке главную форму ставлю — «Форма»

    Затем когда открываю обработку, в колонке «Пользователь» выбираю пользователя, которому хочу отправить сообщение и ничего не происходит, вторая форма не открывается, чтоб отправить сообщение.

    Reply
  11. iolko

    (10) lampa24111986, Доброго дня. Если честно, чтобы понять в чем проблема нужно смотреть проблему целиком. Так ответить не готов. Вроде бы где то оставались исходники, если нужно могу выслать.

    Reply
  12. lampa24111986

    (11) Если Вам не сложно, то хотелось бы их получить. Вот моя почта lampa241186@rambler.ru

    Reply
  13. user721310

    (11) Я столкнулся с такой же проблемой, не могли бы вы скинуть исходник, если он у вас еще остался в живых.

    Reply
  14. iolko

    (13) Доброго дня! ушло.

    Reply
  15. user1030389

    Здравствуйте, у меня такая же проблема(10) , не осталось ли исходников у вас?

    Reply
  16. iolko

    (15) завтра посмотрю

    Reply
  17. palkor

    (16) поделитесь со мной тоже (palkor@list.ru) Буду очень признателен. Вероятно, на сайте не измененный код, исходный. У меня «проблемы» аналогичные вышеописанным.

    И огромное спасибо, что даете возможность изучать то, что не «лежит на поверхности» 🙂

    Reply
  18. palkor

    (16), к сообщению (17)

    Вот, например:

    {ОбщийМодуль.RSA_Шифрование.Модуль(71)}: Ошибка при вызове метода контекста (FromXmlString)

    ОбъектШифрования.FromXmlString(Константы.RSA_ПубличныйКлюч.Получить());

    по причине:

    Произошла исключительная ситуация (mscorlib): Недопустимый синтаксис в строке 1.

    ???

    Reply
  19. user1030389

    И у меня такая же)

    Reply
  20. user1030389

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

    Reply
  21. user1030389

    (18) А в этом случае не правильно заполнен ключ

    Reply
  22. user1080794

    Доброго времени суток! Если остался исходник, не могли бы вы поделиться (v.aleksandra1204@gmail.com). Заранее благодарна:)

    Reply
  23. 1c_nik923

    Алексей доброго времени, тоже был бы рад исходникам (mr.petrachuk@mail.ru). Заранее спасибо ))

    Reply
  24. Sympho

    И мне, если не сложно. klavadez@gmail.com

    Reply
  25. user1109053

    Пришлите, пожалуйста и мне, если Вас не затруднит: doktor_kkk@mail.ru

    Reply
  26. Petrm

    Доброго дня, Алексей, если остался исходник, не могли бы вы поделиться и выслать на почту petrm@list.ru

    Reply
  27. Nefilimus

    Можно пожалуйста исходники? Выдаёт ошибки (( m.novruzov161@gmail.com

    Reply
  28. stash_84

    (16) Добрый день! Если исходники ещё живы, то был бы рад, если скинете на почту stash_84@mail.ru

    Reply

Leave a Comment

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