Чат для 1С8.2 УФ (реализован в HTML интерфейсе)




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

54 Comments

  1. MarSeN

    Забыл написать. Отправка сообщения по Ctrl+Enter

    Reply
  2. wunderland

    (+) однозначно. Забрал смотреть. В работе очень часто приходится использовать локальные чаты (icq и skype обычно запрещены в больших компаниях по линии безопасности) типа NetWriter или похожих… Но всегда есть моменты, которые хочется поправить 🙂 А тут родная 1С — руки развяжет.

    Reply
  3. seermak

    интересно, а что во втором файле Файл «1C8PKG» (.1c8pkg)?

    Reply
  4. LaNaite

    Класс!

    Делала нечто очень похожее. Как-нибудь тоже выложу во free.

    http://pixs.ru/showimage/Bezimeni1j_3974885_9295155.jpg

    Reply
  5. MarSeN

    (3) seermak

    Хороший вопрос ))

    в статье в самом низу… «Архив содержит Инсталляционный пакет для Инсталлятора пакетов 1С 8.2. и выгрузка из БД….»

    Это инсталляционный пакет для Инсталлятора паветов 1С 8.2 (http://infostart.ru/public/194576/). Автоматически установить подсистему. В частность надо открывать 1С (режим предприятия) УФ

    Reply
  6. MarSeN

    (4) LaNaite,

    Спасибо.

    Ваша ссылка не открывается (

    Reply
  7. MarSeN

    (4) LaNaite,

    о, открылась )

    Reply
  8. LaNaite

    (7) еще бы группировать старые сообщения. По принципу facebook — типа «загрузка более ранних сообщений»))

    Reply
  9. MarSeN

    (8) LaNaite,

    ага, это в планах. Старые сообщения будут храниться локально у пользователя на компе (sqlite3)

    Reply
  10. Yashazz

    Баян. Делали такое ещё на 8.0

    Reply
  11. MarSeN

    (10) Yashazz,

    никто не говорит что сам чат в 1С — что-то новое.

    но попробуйте то-же самое реализовать на 8.2 УФ, особенно перехватите контрол+энтер и передайте текст в 1С. На обычных формах все просто. На УФ таких штатных возможностей нет.

    И ссылочку плиз….

    Reply
  12. Yashazz

    (11) Уже мучился. Правда, не для чата — мне для своей «Базы знаний» понадобилось, когда в УФ переводить стал. Авось к Новому Году допилю, выложу ))

    Reply
  13. MarSeN

    (12) Yashazz,

    качни — посмотри как сделано.. все вроде просто ))

    Reply
  14. Yashazz

    (13) Давай так — если сам красиво не соображу, через месяц качну. Тоже, знаешь, сам хочу решить! )))

    Reply
  15. MarSeN

    (14) Yashazz,

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

    вообще, конечно, лучше чтоб еще какао-то решение было )

    Reply
  16. Makushimo

    а можно выложить выгрузку базы без необходимости качать «инсталятор». Это скрытая реклама?

    Reply
  17. MarSeN

    (16) Makushimo,

    а можно выложить выгрузку базы без необходимости качать «инсталятор». Это скрытая реклама?

    Исталлятор качать не обязательно.

    Выгрузка и инсталляционный пакет находятся в одном архиве к статье.

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

    Reply
  18. Lancelot-2M

    ХТМЛ-документ,конечно, дает возможности по отрисовке интерфейса, но ИМХО довольно тяжеловесен. Думается мне, что для работы с базой через инет я бы использовал ТаблицуФормы.

    В любом случае очень приятная разработка.

    Reply
  19. MarSeN

    (18) Lancelot-2M,

    При этом потеряется возможность форматировать текст сообщения

    Reply
  20. Lancelot-2M

    Я понимаю. Точнее потеряется возможность форматировать отдельные фрагменты текста сообщения. Но производительность в браузере может оказаться критичнее.

    Reply
  21. MarSeN

    (20) Lancelot-2M,

    и все-таки я бы не стал делать такие выводы. Сам по себе объект создается 1 раз при открытии обработки. потом если собеседник активен и вы с ним общаетесь, то сообщения добавляются. Только если вы меняете собеседника переписка перечитывается

    конечно, если использовать чат в том виде, в котором он представлен в публикации — будут тормоза.

    Нужно отсекать старые сообщения, как сделано, к примеру, в скайпе (что и будет сделано)

    Reply
  22. sput74

    Принимается на уровне красивой идеи.

    Для реальной жизни подходит ИМХО слабо, по сравнению со stand-alone мессенджерами.

    Например, пользователю нужно написать сообщение следующего вида:

    «Дорогой админ, помоги скорее, у меня не запускается 1С-восьмерка».

    Наши действия?

    Reply
  23. MarSeN

    (22) sput74,

    принимается на уровне красивого вопроса )

    ответный вопрос: у пользователя не запускается компьютер или stand-alone мессенджер

    пользователю нужно написать сообщение следующего вида:

    «Дорогой админ, помоги скорее, у меня не запускается 1С-восьмерка».

    Наши действия? )))

    скорее всего он возьмет телефон и позвонит.

    Reply
  24. Lancelot-2M

    а мне вот неймется рискнуть внедрить, но у меня 40 юзеров через инет в пике активности почти одновременно пишут в 2 регистра… вот борюсь с соблазном)

    Reply
  25. MarSeN

    (24) Lancelot-2M,

    не забудь тогда написать регл. процедуру по удалению старых сообщений. или переноси их куда-нибудь.

    Старые сообщения определяются по закладке. смотри запрос по получению сообщений

    Reply
  26. Lancelot-2M

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

    Reply
  27. MarSeN

    (26) Lancelot-2M,

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

    Reply
  28. Lancelot-2M

    И еще бы добавитьвозможность отображения статуса собеседника — онлайн он или нет.

    Reply
  29. MarSeN

    (28) Lancelot-2M,

    тогда придется добавлять еще 1 регистр… чего не охота делать.

    я планирую сделать визуальное отображение прочитал собеседник сообщение или нет.

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

    Reply
  30. MarSeN

    (28) Lancelot-2M,

    но статус, тоже желателен. согласен )

    Reply
  31. sput74

    (23)

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

    Чат внутри 1С бесполезен, в случаях, когда

    1. У пользователя не включается 1С

    2. Пользователь вышел из 1С (по просьбе админа, как в примере)

    3. Не все пользователи, которым нужен чат, работают с 1С (по лицензионным, техническим, организационным соображениям)

    4. Пользователи работают более чем с одной базой 1С.

    5. Пользователи работают удаленно, например на планшетах (разновидность п. 3)

    6. У пользователя запущена громоздкая обработка чего-нибудь

    7. У пользователя [ИЛИ|И] админа [занят|разрядился|сломался|неоплачен]телефон/охрип/глухонемой/сидит удаленно с ребенком/etc, в сочетании с пп 1,2,3,5,6

    Добавлю для очистки совести:

    -Все предусмотренное, напомню, мое личное ИМХО;

    -Контр-аргументы сохранились с тех времен когда У МЕНЯ в организации стоял вопрос про вариант корпоративного чата

    -Сказано только для организаций ПОХОЖИХ на мою — они есть, и поэтому в этой ветке такие аргументы уместны.

    -Осознаю, что ЕСТЬ и другие организации — для них эта программа может подойти.

    -Топикстартеру в любом случае респект и уважуха за энтузиазм и красиво сделанную работу.

    Reply
  32. MarSeN

    (31) sput74,

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

    Пользователи работают более чем с одной базой 1С.

    данный функционал скорее всего будет добавлен.

    Reply
  33. Программулькин

    лень читать все коменты, в толстом клиенте не пашет?

    Reply
  34. MarSeN

    (33) Программулькин,

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

    Reply
  35. friday1

    очень интересная задумка, будем тестировать)

    Reply
  36. Abadonna

    (31) sput74,

    1. У пользователя не включается 1С

    А еще важнее: пользователю вообще по барабану 1С, он, к примеру, конструктор.

    Имхейшее имхо: корпоративный чат надо строить по другому (UDP, IMAP и т.п.). А для полного счастья можно предусмотреть и отправку в 1С/ из 1С (как у нас и сделано ;))

    P.S. По вышеприведенным соображениям и все «поздравлялки» 1С ущербны, ибо подразумевают наличие у пользователя 1С

    P.P.S. А автор — всё равно молодец! 😉

    Reply
  37. MarSeN

    (36) Abadonna,

    Спасибо!

    Reply
  38. shira84

    Отличная доработка, но для РИБ что можно подобное придумать? Не синхронизировать же каждую секунду.

    Reply
  39. MarSeN

    (38) shira84,

    Да, каждую секунду конечно не вариант синхронизировать. м/б как вариант сделать доп. обмен только сообщениями…

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

    Reply
  40. shira84

    (39)

    Не очень оперативно получается, а как раз таки в таких базах не помешал бы чат, у нас это насущьная тема, куча удаленных розничных точек, постоянные изменения, акции… пользуемся майлом агентом. Вот сделал бы кто нить чат для 1с через чейнить сервер, тот че майл к примеру.

    Reply
  41. MarSeN

    (40) shira84,

    Веб сервисы можете поднять?

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

    как вариант прикрутить почту…

    Reply
  42. shira84

    Да кстати это идея слышал про такие. Увы пока не пробовал.

    Reply
  43. MarSeN

    (42) shira84,

    На инфостарте есть статья по этому поводу (обмен ч/з веб сервисы, кажись). Только для этого придется поднимать веб сервер

    Reply
  44. sadam_max

    (4) LaNaite, Привет. можно поковырять твой чат он поинтересней кажется чем этот))

    Reply
  45. Pawlick

    Есть очень существенная проблема:

    если сообщений между пользователями кот наплакал, то все просто идеально… А вот есть сообщений поднакопилось «поболе», то начинают возникать трудности с выводом на экран:

    эксперименты показали, что

    — переписка до 300 сообщений грузится вполне себе сносно;

    — при загрузке переписки от 300 до 1000 сообщений загрузка «переваривается» так долго, что проще через скайп продублировать;

    — при попытке загрузить от 1000 сообщений — сеанс «валится» без возможности восстановления…

    Очевидно, что решением проблемы было бы загрузка сообщений порциями: скажем по 100 сообщений, а при прокрутке страницы вверх, происходила бы подгрузка сообщений скажем по 30 — 50 шт…

    В этом случае цены бы не было работе, т.к. пока это единственное решение которое я видел, у которого при добавлении нового сообщения в конец таблицы, вся таблица сдвигается вверх (нижняя строка как бы выдавливает остальные строки выше), как в скайпе например. Из за этой особенности использование 1С-ных табличных полей неудобно, т.к. добавляемые программно строки (в случае когда строк в таблице уже на весь экран), попадают «ниже видимой части монитора», и для их просмотра необходима «ручная» прокрутка таблицы вниз…

    Reply
  46. olegov

    Доброго времени суток. Спасибо за разработку, очень полезная штука. Могу ли я предложить Вам доработать сей чат по следующим пунктам.

    1) Можно ли сделать общую комнату, где все собеседники могут общаться одновременно.

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

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

    Как Вы думаете?

    Reply
  47. MarSeN

    (45) Pawlick,

    Согласен.

    У меня есть версия, в которой есть, как в скайпе, вывод за неделю, месяц и т.п.

    Я сейчас занят проектом магазина типа AppStore — Магазин решений «PrimaStore». Временный сайт проекта primastore.top-choice ру

    Как только запущу проект — выложу туда обновленную версию чата.

    Reply
  48. MarSeN

    (46) olegov,

    Конечно, Вы можете дорабатывать чат для своих нужд.

    Reply
  49. mikmike

    (36) Abadonna, не подскажете как у вас сделано? корпоративный час да еще и с обменом с 1С

    Reply
  50. kentavr27

    Выглядит, конечно же, красиво. Вот только с доработкой — полный затык получается. Точнее, доработать HTML морду не знаю как. Может чо подскажите? Пока хочу добавить три основные ф-ции:

    1. Изначально не понравилось действие «Добавить контакт». Вывел в список всех пользователей системы. Теперь бы их хотелось сгруппировать по филиалам, но как организовать управление группами — это большой вопрос.

    Типа группа «Филиал №1» и под ней список пользователей этого филиала. Нажал на группу — список развернулся. Нажал еще раз — свернулся.

    Вариации темы группировок — управляющие кнопки управления списком пользователей типа «отобразить всех», «только on-line», «отобразить по переписке» (только тех, с кем был контакт), «очистить историю» и т.п.

    2. Так же нужна ф-ция отправки сообщения нескольким выбранным пользователям (типа флажка напротив пользователя, что ли, но как его нарисовать в HTML и отловить событие пометки?).

    3. Ну и отрисовка on-line пользователей цветом совсем не помешала бы.

    Или может быть подскажете где нарыть доходчивый мануал по управлению HTML?

    Reply
  51. kentavr27

    (50) kentavr27, проблему иерархического отображения пользователей решил с помощью запроса, который выдает нужную структуру в зависимости от выбора пользователя. Группы теперь разворачиваются/сворачиваются. Как изменить цвет текста/шрифт групп, элементов и он-лайн пользователей — тоже нашел.

    Остался вопрос организации флагов в HTML форме.

    Да и с редактированием макета (даже добавление простого текста) как-то не алё получается. Редакторы показывают одну картинку, а 1С рисует несколько по-другому…

    Reply
  52. MarSeN

    (51) к сожалению сейчас не могу заняться этим вопросом. Вернусь к не?У после 12 января

    Reply
  53. wowkai

    подскажите на каких конфигурациях тестировали работу? на УТ11 взлетит?

    Reply
  54. kentavr27

    (52) в общем получилось что-то типа этого:



    Основное, чего бы хотелось — сделал.

    С флагами напротив каждого пользователя пока не стал заморачиваться — тяжело для понимания, с учетом того, что дело с HTML, javascript и CSS имею первый раз в жизни.

    Даже, с простыми, на первый взгляд, доработками, пришлось немного повозиться.

    Да и с самым элементарным — разметкой морды формы, ну совсем не все хорошо.

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

    » для отправки сообщения…..» тоже выглядит почему-то коряво

    Reply

Leave a Comment

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