Чат и оповещение пользователей 1С+Mysql

25.05.17

Разработка - Инструментарий разработчика

Простое решение реализации чата и оповещение пользователей 1С+Mysql, с внедрением в конфигурацию только одного общего модуля и обработки.

Скачать файлы

Наименование Файл Версия Размер
Чат и оповещение пользователей 1С+Mysql:
.rar 8,11Kb
8
.rar 8,11Kb 8 Скачать

Начнем! Для начала на сервере Mysql создадим базу данных mychat  и в ней две таблицы chat - для переписки пользователей  и feed - для их оповещения, все как на скриншотах.

Скачиваем Connector/ODBC  и устанавливаем на сервере 1С.

Идем в конфигурацию 1С и в модуле обычного приложения  в процедуру "ПриНачалеРаботыСистемы" пропишем два обработчика ожидания. 

Для чата интервал 10 секунд, а для служебных сообщений 1 минута!

    ПодключитьОбработчикОжидания("ПроверитьНаличиеСообщенийПользователю",10,);
    ПодключитьОбработчикОжидания("ПроверитьНаличиеСлужебныхСообщений",60,);

И там же добавим к ним две процедуры.

Процедура ПроверитьНаличиеСлужебныхСообщений() Экспорт
РезультатПроверкиСообщений = ОбщийМодульЧат.ПроверитьСлужебныеСообщения();
Если Не РезультатПроверкиСообщений = "" Тогда
ПоказатьОповещениеПользователя("Новое сообщение от Администратора", ,РезультатПроверкиСообщений);   
КонецЕсли;
КонецПроцедуры
 
  Процедура ПроверитьНаличиеСообщенийПользователю() Экспорт
    РезультатПроверкиСообщений = ОбщийМодульЧат.ПроверитьНаличиеСообщенийСервер();
    Если Не РезультатПроверкиСообщений = "" Тогда
        Форма = Обработки.Чат.ПолучитьФорму("Форма");
        Форма.ЭлементыФормы.ЧатПоле.Значение = РезультатПроверкиСообщений;
        Форма.ЭлементыФормы.ЧатПоле.СоздатьКолонки();
    КонецЕсли;
КонецПроцедуры

Эти процедуры будут получать результат с общего модуля.

Создаем общий модуль ("ОбщийМодульЧат"), в его свойствах выставляем калки "Сервер" и "Вызов Сервера", чтобы все функции выполнялись на сервере, где у нас уже установлен Connector/ODBC.

Добавляем  функции!

/////Функция подключения к серверу MySQL/////
//Прописываем данные для подключения к БД
&НаСервере
  Функция ПолучитьConnectStringDBchat()
       
    server    = ""; //"localhost";
    user     = ""; // логин к базе mySql
    password= ""; // пароль к базе mySql
    database= ""; // имя базы
   
    ConnectString="Driver={MySQL ODBC 5.1 Driver};"
        + "Server=" + server
        + ";Database=" + database
        + ";User=" + user
        + ";Password=" + password
        + ";STMT=SET CHARACTER SET cp1251;"
        + ";Option=3;" ;    
    Возврат ConnectString;
   
КонецФункции
//////////////
// Проверяем наличие сообщений на сервере в таблице chat 
/// на начало и конец текущего дня
// записываем все в таблицу значений и возвращаем результат
// в процедуру ПроверитьНаличиеСообщенийПользователю , которая в свою очередь выведет результат в обработку
&НаСервере
Функция ПроверитьНаличиеСообщенийСервер() Экспорт   
    SQLiteObject = Новый COMОбъект("ADODB.Connection");
  SQLiteConnectionString = ПолучитьConnectStringDBchat();
  Попытка
      SQLiteObject.Open(SQLiteConnectionString);
  Исключение
          Сообщить(ОписаниеОшибки());
      Возврат "" ;
  КонецПопытки;
  RS = Новый COMОбъект("ADODB.RecordSet");
  Стр = "chat"; // таблица чат сообщений
    ДатаНачала = НачалоДня(ТекущаяДата());
    ДатаНачалаU = Формат(Число(ДатаНачала - Дата('19700101')),"ЧГ=0");
    ДатаКонца = КонецДня(ТекущаяДата());
    ДатаКонцаU = Формат(Число(ДатаКонца - Дата('19700101')),"ЧГ=0");
    RS.Open("SELECT data, author, text
    |FROM "+стр+" 
    |WHERE data > "+ДатаНачалаU+" 
    |AND data < "+ДатаКонцаU+"" , SQLiteObject);
 
  ТаблицаРезультат = новый ТаблицаЗначений;
  Для НомерСтолбца = 0 По Rs.Fields.Count-1 Цикл
  ИмяНовойКолонки = Rs.Fields(НомерСтолбца).Name;
    ТаблицаРезультат.Колонки.Добавить(ИмяНовойКолонки);
  КонецЦикла;
  Если Не Rs.eof Тогда
  rs.MoveFirst();
  КонецЕсли;
  Пока Не Rs.eof Цикл
  НоваяСтрока = ТаблицаРезультат.Добавить();
  Для каждого Колонка из ТаблицаРезультат.Колонки Цикл
  ИмяКолонки = Колонка.Имя;
                Если ИмяКолонки = "data" тогда
                Значение = Rs.Fields.Item(ИмяКолонки).Value ;
                Значение = дата(1970,1,1,1,0,0) + Значение; //преобразуем unixtime в дату
                Значение = Значение;
            Иначе
                Значение = Rs.Fields.Item(ИмяКолонки).Value ;
          Значение = Значение;
          КонецЕсли;       
  Если значение <> Null Тогда
  НоваяСтрока[ИмяКолонки] = Значение;
  КонецЕсли;
  КонецЦикла;
  rs.MoveNext();
        КонецЦикла;
  SQLiteObject.Close();
        Возврат ТаблицаРезультат;
КонецФункции
/////////////////
////Отправка сообщений на сервер из обработки "Чат" в таблицу chat
&НаСервере
Функция  ВыгрузкаChat(Текст) Экспорт   
    ConnectString=ПолучитьConnectStringDBchat();
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.open(ConnectString);   
    Дата=ТекущаяДата();
    Пользователь = Пользователи.ТекущийПользователь();
    Текст = Текст;
    Дата = Формат(Дата - Дата(1970,1,1,1,0,0), "ЧГ=0"); //переводим дату в unixtime 
    Попытка
        ТекстSQL = "insert INTO chat
    |(
    | author, 
    | data,
    | text
    |) VALUES (
    | '"+Пользователь+"',
    | '"+Дата+"',
    | '"+Текст+"'
    |);";
    ss=Connection.Execute(текстSQL);
    Connection.Close();
Исключение
        Сообщить(ОписаниеОшибки());
      Возврат "" ;
    КонецПопытки;   
КонецФункции
////////////////////
////Проверяем наличие сообщений для оповещения пользователя из таблицы feed
/// на начало и конец текущего дня
// возвращаем Значение
  &НаСервере
  Функция ПроверитьСлужебныеСообщения() Экспорт
   
    SQLiteObject = Новый COMОбъект("ADODB.Connection");
  SQLiteConnectionString = ПолучитьConnectStringDBchat();
  Попытка
      SQLiteObject.Open(SQLiteConnectionString);
  Исключение
              Сообщить(ОписаниеОшибки());
      Возврат "" ;
  КонецПопытки;
  RS = Новый COMОбъект("ADODB.RecordSet");
  Стр = "feed";
    ДатаНачала = НачалоДня(ТекущаяДата());
    ДатаНачалаU = Формат(Число(ДатаНачала - Дата('19700101')),"ЧГ=0");
    ДатаКонца = КонецДня(ТекущаяДата());
    ДатаКонцаU = Формат(Число(ДатаКонца - Дата('19700101')),"ЧГ=0");
    RS.Open("SELECT text
    |FROM "+стр+" 
    |WHERE data > "+ДатаНачалаU+" 
    |AND data < "+ДатаКонцаU+"" , SQLiteObject);
 
  Если Не Rs.eof Тогда
  rs.MoveFirst();
  КонецЕсли;
  Пока Не Rs.eof Цикл
    Значение = Rs.Fields.Item("text").Value ;
  rs.MoveNext();
    КонецЦикла;
  SQLiteObject.Close();
    Возврат Значение;
КонецФункции
//////////////
///////Отправка сообщений на сервер из внешней обработки "Оповещения" в таблицу feed
&НаСервере
Функция  ВыгрузкаСлужебныхСообщений(Текст) Экспорт
   
    ConnectString=ПолучитьConnectStringDBchat();
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.open(ConnectString);   
    Дата=ТекущаяДата();
    Пользователь = Пользователи.ТекущийПользователь();
    Текст = Текст;
    Дата = Формат(Дата - Дата(1970,1,1,1,0,0), "ЧГ=0");
    Попытка
       
        ТекстSQL = "insert INTO feed
    |( 
    | data,
    | text
    |) VALUES (
    | '"+Дата+"',
    | '"+Текст+"'
    |);";
    ss=Connection.Execute(текстSQL);
    Connection.Close();
Исключение
        Сообщить(ОписаниеОшибки());
      Возврат "" ;
    КонецПопытки;   
КонецФункции
////////////////////
/////Очищаем таблицу feed из внешней обработки "Оповещения"
//Чтобы у пользователя не выскакивало окно с оповещением 
&НаСервере
Функция УдалитьСообщенияОповещения () Экспорт
    SQLiteObject = Новый COMОбъект("ADODB.Connection");
  SQLiteConnectionString = ПолучитьConnectStringDBchat();
    SQLiteObject.Open(SQLiteConnectionString);
    Попытка
    ТекстSQL = "TRUNCATE TABLE feed ";
    SQLiteObject.Execute(текстSQL);
    Сообщить("Информация успешно удалена с сервера");
      Исключение
    Сообщить(ОписаниеОшибки());
      Возврат "" ;
  КонецПопытки;
  SQLiteObject.Close();
КонецФункции

Осталось теперь создать две обработки. Начнем с Чата!

Создаем обработку, добавляем реквизит "Текст" на форму кидаем ПолеВвода с этим реквизитом и ТабличноеПоле с именем "ЧатПоле".

Для кнопки "Выполнить" пишем следующую процедуру.

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Если Не ЗначениеЗаполнено(Текст) Тогда
        Сообщить("А кто будет заполнять поле?");
        Возврат;
    Иначе
        ОбщийМодульЧат.ВыгрузкаChat(Текст);
    КонецЕсли;
    ЭлементыФормы.ПолеВвода1.Значение = "";
КонецПроцедуры

На этом все, добавляем обработку в конфигурацию!

Обработка оповещения добавляем реквизит "Текст" на форму кидаем ПолеВвода с этим реквизитом и еще одну кнопку "Удалить" для удаления сообщений с сервера.

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Текст = ЭлементыФормы.ПолеВвода1.Значение;
    Если Не ЗначениеЗаполнено(Текст) Тогда
        Сообщить("А кто будет заполнять поле?");
        Возврат;
    иначе
    ОбщийМодульЧат.ВыгрузкаСлужебныхСообщений(Текст);
    КонецЕсли;
    ЭлементыФормы.ПолеВвода1.Значение = "";
КонецПроцедур


Процедура УдалитьНажатие(Элемент)
    ОбщийМодульЧат.УдалитьСообщенияОповещения();
КонецПроцедуры

Вот результат, и спасибо всем за внимание!

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    122290    673    389    

716

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 15300 руб.

06.10.2023    7326    22    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3583    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177773    1074    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99365    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18130    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28115    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23605    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
5. BigB 191 31.05.17 14:35 Сейчас в теме
(4) С чего Вы решили, что "Система взаимодействия" реализованная в 8.3.10 стоит денег? Мы ей уже пользуемся и ни копейки не платим.
6. DonAlPatino 176 01.06.17 11:06 Сейчас в теме
(5) Ну так поделитесь как оно, какие грабли и стоит ли того, чтобы в это влезать?
7. BigB 191 01.06.17 11:24 Сейчас в теме
(6) Лично мне нравится. Пока в ней нет звонков, но текстовые сообщения реализованы нормально.
9. DonAlPatino 176 01.06.17 13:32 Сейчас в теме
(7) Ну мне больше интересно мнение пользователей, как они ее используют в работе и кол-во пользователей?
10. BigB 191 01.06.17 13:54 Сейчас в теме
(9) 50 пользователей одновременно в базе. Раньше в скайпе переписывались, теперь в 1С.
Самое интересное это то, что сообщения работают и в копии рабочей базы, которая находится на другом сервере. Во как.
Никакой код в 1С писать не надо. Достаточно её просто включить и можно пользоваться.
Подробнее можно почитать тут https://wonderland.v8.1c.ru/blog/sistema-vzaimodeystviya/
1. starik-2005 3033 25.05.17 17:05 Сейчас в теме
Для чата, ИМХО, лучше использовать механизмы именованных очередей. Их поддерживает, например, REDIS. MySQL здесь явно избыточен.
Сурикат; +1 Ответить
4. JohnnyAlexandrov 25 26.05.17 13:36 Сейчас в теме
(1) Для 30-60 пользователей, которые будут активно переписываться и сообщения в среднем будут весить 5-10кб MySql вполне должен справиться.

(2) Это простой пример реализации, и не нужно ходить к каждому и устанавливать, а потом объяснять как пользоваться jabber, так можно то и просто беседу в viber создать и там общаться)

(3) А вот этот велосипед стоит денег.
2. nytlenc 25.05.17 18:16 Сейчас в теме
Для чата, ИМХО, лучше использовать Jabber сервер, созданный как раз специально для этого, совершенно бесплатно заметьте, а не изобретать велосипед.
3. unichkin 1559 25.05.17 23:34 Сейчас в теме
8. Matveev_VS 159 01.06.17 11:32 Сейчас в теме
Оставьте свое сообщение