В современной корпоративной среде возможность быстрого обсуждения документа непосредственно в интерфейсе учетной системы значительно повышает эффективность работы. Вместо использования внешних мессенджеров пользователи могут оставлять комментарии, задавать вопросы и координировать действия прямо "в контексте" задачи. Разберем, как реализовать этот функционал в конфигурации на базе 1С:Предприятие 8.3 и Библиотеки стандартных подсистем (БСП).
Проанализируем самый современный и технологичный способ — Систему взаимодействия. Это встроенный механизм платформы 1С, который позволяет организовать обмен сообщениями, видеозвонки и передачу файлов. Основное преимущество здесь — механизм контекстных обсуждений.
Рассмотрим по шагам, как это работает. Контекстное обсуждение жестко привязано к объекту базы данных (например, к документу). Для его реализации нам не нужно создавать новые справочники или регистры. Достаточно включить соответствующую возможность в свойствах формы документа. Выясним, как программно управлять этим процессом:
// Пример получения или создания обсуждения, привязанного к документу
ПараметрыОбсуждения = СистемаВзаимодействия.СоздатьОбсуждение();
ПараметрыОбсуждения.Ключ = СсылкаНаОбъект; // Указываем ссылку на наш документ
ПараметрыОбсуждения.Записать();
Для того чтобы пользователи видели панель обсуждения прямо в форме, в редакторе формы в свойстве Состав можно добавить стандартную панель обсуждений. Это избавит нас от необходимости писать код для обновления списка сообщений — платформа берет это на себя, используя push-уведомления. Проанализируем плюсы: отсутствие нагрузки на базу данных (сообщения хранятся на сервере взаимодействия) и наличие мобильного клиента.
Если по каким-то причинам использование внешнего сервера взаимодействия невозможно, разберем классический подход с использованием Регистра сведений. Это решение кажется "легче" для понимания и дает полный контроль над данными. Создадим непериодический регистр сведений, например, ЧатДокументов.
Структура регистра может быть следующей:
ДокументОбъект (Тип: ЛюбаяСсылка) — определяет, к какому документу относится переписка.ДатаСообщения (Тип: Дата) — для сортировки.ТекстСообщения (Тип: Строка) — собственно текст.Автор (Тип: СправочникСсылка.Пользователи).Теперь выясним причину основной проблемы таких самописных чатов — обновление данных. Использование обработчика ожидания, который каждую секунду опрашивает сервер, — это плохая практика, создающая лишнюю нагрузку. Рассмотрим более изящное решение через механизм оповещений.
При записи нового сообщения в регистр будем вызывать метод Оповестить():
// Код в модуле формы или команды отправки сообщения
НоваяЗапись = РегистрыСведений.ЧатДокументов.СоздатьМенеджерЗаписи();
НоваяЗапись.ДокументОбъект = Объект.Ссылка;
НоваяЗапись.ДатаСообщения = ТекущаяДатаСеанса();
НоваяЗапись.Автор = Пользователи.ТекущийПользователь();
НоваяЗапись.ТекстСообщения = Объект.ТекстНовогоСообщения;
НоваяЗапись.Записать();
// Оповещаем систему о том, что чат обновился
Оповестить("ОбновлениеЧата", Объект.Ссылка, "ФормаЧата");
В самой форме документа, где выведен список сообщений (динамический список или таблица), мы пропишем обработчик события ОбработкаОповещения. Посмотрим на пример кода:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновлениеЧата" И Параметр = Объект.Ссылка Тогда
// Обновляем динамический список сообщений
Элементы.СписокСообщенийЧата.Обновить();
КонецЕсли;
КонецПроцедуры
Стандартный динамический список выглядит аскетично. Чтобы сделать чат похожим на современный мессенджер (с облачками текста, разными цветами для авторов и форматированием), проанализируем использование Поля HTML-документа. Мы можем динамически формировать HTML-строку на основе данных из нашего регистра сведений.
Рассмотрим алгоритм формирования контента:
РегистрыСведений.ЧатДокументов по фильтру ссылки документа.<div> с соответствующими стилями CSS.Строка, связанный с полем HTML.Такой подход позволяет добавить в чат кликабельные ссылки на другие объекты 1С. Для этого используем протокол e1cib в атрибуте href тега <a>.
Выясним, подходит ли нам стандартная подсистема БСП Заметки. По умолчанию она предназначена для личного использования (каждый видит только свои заметки). Однако, проанализировав код, мы поймем, что ее можно адаптировать. Основной плюс здесь в том, что механизмы привязки заметок к любым объектам уже реализованы и отлажены.
Если нам нужно коллективное обсуждение, нам придется доработать механизм RLS (права доступа на уровне записей) или изменить запрос в форме списка заметок, чтобы он игнорировал фильтр по текущему пользователю. Это решение хорошо тем, что оно уже интегрировано в общую экосистему БСП и поддерживает хранение в дополнительных свойствах.
Если общение в документе — это не просто "болталка", а процесс согласования или уточнения данных, рассмотрим вариант с использованием подсистемы Бизнес-процессы. В БСП есть отличный процесс "Исполнение". При создании задачи пользователь может написать комментарий, который увидят другие участники цепочки. Это более формализованный подход, обеспечивающий дисциплину и историю принятия решений.
Подводя итог, выберем оптимальный путь в зависимости от условий:
Помните о производительности: при использовании регистра сведений обязательно настройте индексы по измерению ДокументОбъект и ДатаСообщения, а также продумайте механизм архивации старых сообщений, чтобы база данных не разрасталась со временем.