Как расширить возможности Системы взаимодействия в 1С: автоподбор участников, группы и история переписки?

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

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

Рассмотрим, как можно реализовать эти функции с помощью программной доработки, используя встроенный язык 1С и API Системы взаимодействия.

1. Автоматический подбор участников обсуждения по контексту

Проблема: При создании обсуждения, привязанного к документу или другому объекту, приходится вручную выбирать каждого участника. Хотелось бы, чтобы система сама предлагала или добавляла пользователей, связанных с этим объектом (например, автора документа, ответственного менеджера, руководителя отдела).

Решение: Эта задача решается программно через использование объекта глобального контекста СистемаВзаимодействия. Логику подбора участников нужно встроить в код конфигурации.

Разберем по шагам, как это можно реализовать:

  1. Определяем событие для запуска. Автоматическое добавление участников может происходить при открытии формы объекта, при его записи или по нажатию специальной кнопки на форме. Например, можно использовать обработчик события формы ПриСозданииНаСервере или ПриОткрытии.
  2. Получаем данные для отбора. В коде обработчика нужно получить доступ к данным текущего объекта. Например, если мы работаем с документом "Заказ клиента", нас могут интересовать реквизиты Автор, Ответственный, Контрагент.
  3. Формируем список пользователей. На основе полученных данных формируем список пользователей системы, которых нужно пригласить. Может потребоваться дополнительный запрос, чтобы, например, по контрагенту найти его основного менеджера или по автору документа — его руководителя.
  4. Создаем обсуждение или добавляем участников. Используя методы API, мы программно управляем обсуждением.
    • Для создания нового обсуждения используется метод СистемаВзаимодействия.СоздатьОбсуждение().
    • Для добавления участников в уже существующее обсуждение — метод Обсуждение.ДобавитьУчастника().

Пример логики для кнопки "Создать обсуждение с ответственными":

Предположим, на форме документа есть кнопка. В обработчике команды этой кнопки мы можем написать следующий код:


// &НаСервере
Процедура СоздатьОбсуждениеСОтветственнымиНаСервере()
    
    // Получаем текущий объект, к которому будет привязано обсуждение
    КонтекстОбсуждения = Объект.Ссылка;
    
    // Получаем пользователей из реквизитов документа
    ПользовательАвтор = Объект.Автор;
    ПользовательОтветственный = Объект.Ответственный;
    
    // Важно: в систему взаимодействия добавляются не пользователи ИБ (справочник "Пользователи"),
    // а пользователи системы взаимодействия. Их нужно получить по пользователю ИБ.
    УчастникАвтор = СистемаВзаимодействия.ПолучитьПользователя(ПользовательАвтор);
    УчастникОтветственный = СистемаВзаимодействия.ПолучитьПользователя(ПользовательОтветственный);
    
    // Создаем новое обсуждение
    НовоеОбсуждение = СистемаВзаимодействия.СоздатьОбсуждение("Обсуждение заказа №" + Объект.Номер, КонтекстОбсуждения);
    
    // Добавляем участников, если они определены
    Если УчастникАвтор <> Неопределено Тогда
        НовоеОбсуждение.ДобавитьУчастника(УчастникАвтор);
    КонецЕсли;
    
    Если УчастникОтветственный <> Неопределено Тогда
        НовоеОбсуждение.ДобавитьУчастника(УчастникОтветственный);
    КонецЕсли;
    
    // Сохраняем обсуждение
    НовоеОбсуждение.Записать();
    
КонецПроцедуры

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

2. Создание и использование групп пользователей для обсуждений

Проблема: В системе нет встроенного понятия "группа пользователей Системы взаимодействия", чтобы можно было одной командой пригласить в чат, например, весь отдел бухгалтерии или проектную команду.

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

Посмотрим на примерную реализацию:

  1. Создаем справочник. В конфигураторе создаем новый справочник, например, ГруппыПользователейСВ. У него будет наименование (например, "Бухгалтерия", "Отдел продаж") и табличная часть СоставГруппы с одной колонкой Пользователь (тип СправочникСсылка.Пользователи).
  2. Заполняем справочник. В пользовательском режиме создаем элементы этого справочника и заполняем состав групп нужными сотрудниками.
  3. Реализуем механизм приглашения группы. На форме, где нужно приглашать группы, добавляем поле для выбора элемента из справочника ГруппыПользователейСВ и кнопку "Пригласить группу".
  4. Пишем код для добавления участников. В обработчике кнопки получаем выбранную группу, запрашиваем ее табличную часть, перебираем пользователей в цикле и каждого добавляем в текущее или новое обсуждение.

Пример кода для команды "Пригласить группу":


// &НаСервере
Процедура ПригласитьГруппуНаСервере(ВыбраннаяГруппа, ТекущееОбсуждение)
    
    Если ЗначениеЗаполнено(ВыбраннаяГруппа) И ТекущееОбсуждение <> Неопределено Тогда
        
        // Получаем состав группы
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ГруппыПользователейСВСоставГруппы.Пользователь
            |ИЗ
            |   Справочник.ГруппыПользователейСВ.СоставГруппы КАК ГруппыПользователейСВСоставГруппы
            |ГДЕ
            |   ГруппыПользователейСВСоставГруппы.Ссылка = &СсылкаНаГруппу";
            
        Запрос.УстановитьПараметр("СсылкаНаГруппу", ВыбраннаяГруппа);
        
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            // Получаем пользователя системы взаимодействия
            ПользовательСВ = СистемаВзаимодействия.ПолучитьПользователя(Выборка.Пользователь);
            
            // Добавляем в обсуждение
            Если ПользовательСВ <> Неопределено Тогда
                ТекущееОбсуждение.ДобавитьУчастника(ПользовательСВ);
            КонецЕсли;
        КонецЦикла;
        
        // Не забываем записать изменения
        ТекущееОбсуждение.Записать();
        
    КонецЕсли;
    
КонецПроцедуры

Этот подход позволяет гибко управлять составом групп без изменения кода конфигурации. Если требуется готовая реализация групповых комнат и бесед без написания кода с нуля, подойдёт чат на управляемых формах с поддержкой комнат.

3. Просмотр истории взаимодействий и отбор по объектам

Проблема: Стандартный интерфейс не позволяет просмотреть всю историю сообщений по всем пользователям за период или сделать удобную выборку переписки, относящейся к конкретному заказу или контрагенту. Система взаимодействия хранит данные на отдельном сервере и является "черным ящиком" для аналитических запросов из 1С.

Решение: Организовать дублирование (зеркалирование) сообщений в специальный регистр сведений внутри информационной базы 1С. Как только данные окажутся в базе, их можно будет анализировать стандартными средствами — отчетами на СКД, динамическими списками и прямыми запросами.

Проанализируем шаги для реализации:

  1. Создаем хранилище. В конфигураторе создаем непериодический, независимый РегистрСведений, например, ИсторияСообщенийСВ.
  2. Определяем структуру регистра. Добавляем измерения и ресурсы, которые понадобятся для анализа:
    • Измерения: ИдентификаторСообщения (Строка), ИдентификаторОбсуждения (Строка).
    • Ресурсы: ТекстСообщения (Строка неограниченной длины).
    • Реквизиты: Автор (СправочникСсылка.Пользователи), Дата (Дата и время), КонтекстОбсуждения (ДокументСсылка, СправочникСсылка и т.д., составной тип данных).
  3. Перехватываем отправку сообщения. Самый сложный этап. Необходимо найти способ зафиксировать факт отправки сообщения и его содержимое. Это можно сделать, расширив формы обсуждений и переопределив стандартные команды отправки, или использовать другие платформенные механизмы, например, подписки на события. При отправке сообщения клиентским кодом, мы получаем его текст и контекст и передаем на сервер для записи в наш новый регистр.
  4. Создаем отчеты и формы просмотра. Когда регистр начнет наполняться данными, можно создавать на его основе любые аналитические инструменты. Например, отчет на СКД с отборами по автору, дате, контрагенту (через точку от контекстного объекта) и поиском по тексту сообщения.

Важный момент: этот подход создает дублирующую структуру данных, что незначительно увеличивает объем базы данных. Однако выгоды от возможности полноценного анализа переписки и контроля коммуникаций, как правило, перевешивают этот недостаток.

Итог: штатные ограничения и программные решения

Все рассмотренные задачи — автоматический подбор участников, создание групп и анализ истории — полностью реализуемы. Ключевая особенность заключается в том, что они решаются не с помощью пользовательских настроек, а путем программирования во встроенном языке 1С.

Основными инструментами для разработчика являются:

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

← На главную