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

25.05.17

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Чат и оповещение пользователей 1С+Mysql:
.rar 8,11Kb
8 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Начнем! Для начала на сервере 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.Значение = "";
КонецПроцедур


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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    64769    341    168    

301

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    253694    1400    421    

1152

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22570 руб.

06.10.2023    36974    97    40    

117

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

15250 руб.

25.08.2025    49966    98    27    

114

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

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

17000 руб.

10.11.2023    24583    92    42    

101

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки. 1.3.11 Доработан механизм контекстной подсказки по метаданным

9500 руб.

17.05.2024    51694    181    63    

213

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

5000 руб.

25.02.2026    2873    11    1    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. BigB 193 31.05.17 14:35 Сейчас в теме
(4) С чего Вы решили, что "Система взаимодействия" реализованная в 8.3.10 стоит денег? Мы ей уже пользуемся и ни копейки не платим.
6. DonAlPatino 173 01.06.17 11:06 Сейчас в теме
(5) Ну так поделитесь как оно, какие грабли и стоит ли того, чтобы в это влезать?
7. BigB 193 01.06.17 11:24 Сейчас в теме
(6) Лично мне нравится. Пока в ней нет звонков, но текстовые сообщения реализованы нормально.
9. DonAlPatino 173 01.06.17 13:32 Сейчас в теме
(7) Ну мне больше интересно мнение пользователей, как они ее используют в работе и кол-во пользователей?
10. BigB 193 01.06.17 13:54 Сейчас в теме
(9) 50 пользователей одновременно в базе. Раньше в скайпе переписывались, теперь в 1С.
Самое интересное это то, что сообщения работают и в копии рабочей базы, которая находится на другом сервере. Во как.
Никакой код в 1С писать не надо. Достаточно её просто включить и можно пользоваться.
Подробнее можно почитать тут https://wonderland.v8.1c.ru/blog/sistema-vzaimodeystviya/
1. starik-2005 3237 25.05.17 17:05 Сейчас в теме
Для чата, ИМХО, лучше использовать механизмы именованных очередей. Их поддерживает, например, REDIS. MySQL здесь явно избыточен.
Сурикат; +1 Ответить
4. JohnnyAlexandrov 20 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 1622 25.05.17 23:34 Сейчас в теме
8. Matveev_VS 168 01.06.17 11:32 Сейчас в теме
Спасибо, попробуем
Для отправки сообщения требуется регистрация/авторизация