Как программно открыть карточку клиента на компьютере конкретного пользователя при входящем звонке?

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

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

Способ 1. Использование Системы взаимодействия (рекомендуемый метод)

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

Алгоритм реализации:

  1. На стороне сервера при получении сигнала от АТС мы создаем новое сообщение в Системе взаимодействия.
  2. В свойство сообщения Данные мы помещаем структуру, содержащую ссылку на документ или навигационную ссылку.
  3. На стороне клиента в модуле управляемого приложения мы подключаем обработчик события, который будет реагировать на входящее сообщение.

Рассмотрим пример кода для клиентской части в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    СистемаВзаимодействия.ПодключитьОбработчикПриПолученииСообщения(Новый ОписаниеОповещения("ОбработкаСообщенияТелефонии", ЭтотОбъект));
КонецПроцедуры

Процедура ОбработкаСообщенияТелефонии(Сообщение, ДополнительныеПараметры) Экспорт
    Если Сообщение.Данные <> Неопределено И Сообщение.Данные.Свойство("ОткрытьДокумент") Тогда
        ПараметрыФормы = Новый Структура("Ключ", Сообщение.Данные.СсылкаНаДокумент);
        ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы);
    КонецЕсли;
КонецПроцедуры

Этот метод работает мгновенно через push-уведомления и практически не нагружает сервер 1С.

Способ 2. Реализация через Регистр сведений и обработчик ожидания

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

Создание структуры данных:

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

Логика работы на клиенте:

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


Процедура ПриНачалеРаботыСистемы()
    ПодключитьОбработчикОжидания("ПроверитьВходящиеЗвонки", 3); // Проверка каждые 3 секунды
КонецПроцедуры

Процедура ПроверитьВходящиеЗвонки() Экспорт
    // Вызываем серверную функцию для получения данных
    ДанныеЗвонка = ПолучитьДанныеЗвонкаССервера();
    
    Если ДанныеЗвонка <> Неопределено Тогда
        ПараметрыФормы = Новый Структура("Ключ", ДанныеЗвонка.Ссылка);
        ОткрытьФорму(ДанныеЗвонка.ИмяФормы, ПараметрыФормы);
    КонецЕсли;
КонецПроцедуры

Важные нюансы:

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

Способ 3. Внешнее событие и Native API компоненты

Многие интеграционные решения (например, для Asterisk или специализированных панелей телефонии) используют внешние компоненты. В этом случае сервер телефонии отправляет данные напрямую на компьютер пользователя через сетевой протокол, а компонента генерирует в 1С ВнешнееСобытие.

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


Процедура ПриВнешнемСобытии(Источник, Событие, Данные)
    Если Источник = "TelephonyComponent" И Событие = "IncomingCall" Тогда
        // Данные могут содержать ID документа или номер телефона
        СсылкаНаОбъект = ПоискКлиентаПоТелефону(Данные);
        ПоказатьЗначение(, СсылкаНаОбъект);
    КонецЕсли;
КонецПроцедуры

Способ 4. Передача данных через навигационные ссылки

Если интеграция происходит через внешнее приложение на рабочем столе пользователя, можно инициировать открытие документа через механизм навигационных ссылок. 1С поддерживает протокол e1c://.

Разберем, как это работает: внешнее приложение телефонии при получении звонка формирует строку вида e1c://server/base#e1cib/data/Документ.ЗаказПокупателя?ref=идентификатор и выполняет её в операционной системе. Если сеанс 1С уже запущен, платформа перехватит эту ссылку и откроет нужное окно без повторного ввода логина и пароля.

Типичные проблемы и способы их решения

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

Модальные окна: Проанализируем ситуацию, когда у пользователя открыто модальное окно (например, предупреждение или выбор файла). В этом случае метод ОткрытьФорму() может не сработать или вызвать ошибку. Для предотвращения таких ситуаций в современных конфигурациях следует использовать блокирующие окна («режим использования модальности — не использовать») и проверять состояние окна перед вызовом открытия формы.

Отсутствие пользователя на месте: Если звонок поступил, а менеджер отошел, программное открытие формы может «засорить» экран. Хорошей практикой считается не просто открывать документ, а выводить небольшое всплывающее уведомление (через ПоказатьОповещениеПользователя), при нажатии на которое уже откроется полноценная карточка клиента или сделки.

← На главную