Как реализовать современный внутренний мессенджер в 1С на обычных формах

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Разработка полноценного чата внутри конфигураций на обычных формах (таких как УПП или старые редакции УТ) — задача нетривиальная. Основная сложность заключается в ограничениях интерфейса и отсутствии встроенных инструментов для работы в реальном времени, которые появились только в более поздних версиях платформы 8.3. Однако, проанализировав опыт разработчиков, мы можем выделить несколько эффективных стратегий внедрения мессенджера, который будет поддерживать ссылки на объекты, вложения и мгновенные уведомления.

Вариант 1: Использование Системы взаимодействия в режиме обычных форм

Существует распространенное заблуждение, что Система взаимодействия (СВ) доступна только в управляемом приложении. На самом деле, начиная с определенных версий платформы 8.3, мы можем интегрировать функционал СВ в конфигурации на обычных формах. Рассмотрим, как это реализовать. Основная идея заключается в создании «мостика» между обычными формами и механизмом управляемых форм, в которых СВ работает нативно.

Для реализации этого метода проанализируем следующие шаги:

  1. Включение возможности использования управляемых форм в настройках конфигурации (свойство "Использовать управляемые формы в обычном приложении").
  2. Создание служебной управляемой формы, которая будет служить контейнером для чата.
  3. Программный вызов формы из основного интерфейса обычного приложения.

Главный плюс этого подхода — нативная поддержка навигационных ссылок e1cib/data/.... Чтобы ссылка открыла объект в обычном приложении, нам потребуется написать обработчик события при нажатии на ссылку, который будет использовать метод ПерейтиПоСсылке(). Рассмотрим пример кода для открытия документа по ссылке:


Процедура ОбработкаПереходаПоСсылке(НавигационнаяСсылка)
    ПараметрыСсылки = ПолучитьПараметрыНавигационнойСсылки(НавигационнаяСсылка);
    СсылкаНаОбъект = НайтиПоСсылке(ПараметрыСсылки.Значение);
    Если Не СсылкаНаОбъект.Пустая() Тогда
        ОткрытьФорму(СсылкаНаОбъект.ПолучитьФорму());
    КонецЕсли;
КонецПроцедуры

Вариант 2: Технология WebSockets и внешние компоненты

Если штатная Система взаимодействия по каким-то причинам не подходит (например, из-за требований безопасности или необходимости работы на старых версиях платформы), проанализируем вариант с использованием внешних серверов сообщений. Чтобы избежать «тяжелых» запросов к базе данных через обработчик ожидания, мы должны использовать технологию Push или WebSockets.

Разберем архитектуру такого решения:

  1. Серверная часть: Отдельный сервис на Node.js или использование брокера сообщений типа RabbitMQ/MQTT.
  2. Клиентская часть (1С): Внешняя компонента (Native API), которая поддерживает постоянное соединение с сервером.
  3. Интерфейс: Поле HTML-документа на обычной форме 1С.

Выясним причину, почему это лучше стандартного регистра сведений. В обычном мессенджере на РС клиент опрашивает базу каждые 5-10 секунд, создавая нагрузку. В случае с WebSockets сервер сам «толкает» сообщение клиенту. Как только сообщение приходит в компоненту, она генерирует внешнее событие в 1С, которое мы обрабатываем в коде формы:


Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Источник = "MessengerComponent" И Событие = "NewMessage" Тогда
        // Обновляем текст в поле HTML-документа
        ЭлементыФормы.ПолеЧат.Документ.parentWindow.addNewMessage(Данные);
        // Выводим всплывающее уведомление
        ПоказатьОповещениеПользователя("Новое сообщение", , Данные);
    КонецЕсли;
КонецПроцедуры

Вариант 3: Реализация ссылок на объекты 1С и работа с буфером обмена

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

Чтобы реализовать передачу ссылки на объект в чат, мы можем использовать уникальный идентификатор (GUID). Проанализируем процесс отправки ссылки:

  1. Пользователь перетаскивает документ в окно чата (Drag-and-drop).
  2. Программа получает ссылку на объект и его метаданные.
  3. В HTML-код чата вставляется тег <a href="1c-object://[GUID]">Документ Реализация №1</a>.

Для работы со скриншотами и вставкой картинок из буфера обмена в обычных формах штатными средствами обойтись сложно. Рекомендуем использовать внешнюю компоненту на C#, которая умеет перехватывать содержимое буфера. Рассмотрим алгоритм:

  1. При нажатии Ctrl+V в окне чата вызывается метод компоненты.
  2. Компонента проверяет, есть ли в буфере изображение.
  3. Если изображение есть, оно сохраняется во временный файл и передается в 1С как путь или массив двоичных данных.
  4. 1С загружает это изображение в хранилище (например, на S3-совместимое хранилище или в сетевую папку), чтобы не «раздувать» основную базу данных .1CD или SQL-базу.

Вариант 4: Интеграция с корпоративными мессенджерами через API

Если бюджет и время ограничены, стоит рассмотреть интеграцию с готовыми решениями, такими как Mattermost или Rocket.Chat. Это мощные Open-source мессенджеры, которые можно развернуть внутри сети предприятия. Мы можем встроить их веб-интерфейс прямо в форму 1С через движок Chromium (используя компоненты типа CefSharp, так как встроенный IE в старых платформах не поддерживает современный JS).

Преимущества такого подхода:

Подводя итог, выбор решения зависит от ваших ресурсов. Если платформа 8.3 достаточно свежая, Система взаимодействия — самый логичный путь. Если же требуется максимальная кастомизация и независимость от механизмов 1С, связка WebSocket + HTML5 обеспечит наилучшую юзабельность и производительность для ваших пользователей.

← На главную