При интеграции 1С с системами телефонии часто возникает задача: в момент поступления входящего звонка сервер получает информацию о номере телефона и ответственном менеджере, и нам необходимо мгновенно «вытолкнуть» форму соответствующего документа или карточку клиента на экран именно этому менеджеру. Проблема заключается в том, что серверный код не имеет прямого доступа к пользовательскому интерфейсу (клиенту). Разберем несколько эффективных способов реализации этой задачи, от классических до самых современных.
Начиная с современных версий платформы 8.3, механизм «Система взаимодействия» является наиболее правильным и производительным способом передачи команд от сервера к клиенту. Он позволяет отправлять сообщения конкретным пользователям, которые клиентское приложение обрабатывает в реальном времени без постоянных опросов базы данных.
Алгоритм реализации:
Данные мы помещаем структуру, содержащую ссылку на документ или навигационную ссылку.Рассмотрим пример кода для клиентской части в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
СистемаВзаимодействия.ПодключитьОбработчикПриПолученииСообщения(Новый ОписаниеОповещения("ОбработкаСообщенияТелефонии", ЭтотОбъект));
КонецПроцедуры
Процедура ОбработкаСообщенияТелефонии(Сообщение, ДополнительныеПараметры) Экспорт
Если Сообщение.Данные <> Неопределено И Сообщение.Данные.Свойство("ОткрытьДокумент") Тогда
ПараметрыФормы = Новый Структура("Ключ", Сообщение.Данные.СсылкаНаДокумент);
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Этот метод работает мгновенно через push-уведомления и практически не нагружает сервер 1С.
Если «Система взаимодействия» не настроена, можно воспользоваться классическим методом опроса состояния через базу данных. Это надежный, проверенный временем способ, который подходит для любых конфигураций.
Создание структуры данных:
Для начала создадим непериодический регистр сведений, например, ОчередьСобытийТелефонии. В нем должны быть следующие измерения и ресурсы:
Логика работы на клиенте:
В модуле управляемого приложения при старте системы необходимо подключить обработчик ожидания, который будет проверять наличие новых записей в регистре для текущего пользователя.
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьВходящиеЗвонки", 3); // Проверка каждые 3 секунды
КонецПроцедуры
Процедура ПроверитьВходящиеЗвонки() Экспорт
// Вызываем серверную функцию для получения данных
ДанныеЗвонка = ПолучитьДанныеЗвонкаССервера();
Если ДанныеЗвонка <> Неопределено Тогда
ПараметрыФормы = Новый Структура("Ключ", ДанныеЗвонка.Ссылка);
ОткрытьФорму(ДанныеЗвонка.ИмяФормы, ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Важные нюансы:
При использовании этого метода важно помнить о нагрузке. Чтобы минимизировать влияние на производительность, запрос к регистру должен быть максимально простым, а индекс по полю Пользователь — обязательным. Также рекомендуется сразу удалять обработанные записи из регистра или помечать их как прочитанные, чтобы они не выбирались повторно.
Многие интеграционные решения (например, для Asterisk или специализированных панелей телефонии) используют внешние компоненты. В этом случае сервер телефонии отправляет данные напрямую на компьютер пользователя через сетевой протокол, а компонента генерирует в 1С ВнешнееСобытие.
Проанализируем преимущества этого подхода: он позволяет передать управление в 1С без посредничества базы данных 1С и сервера приложений. Для обработки такого события используется процедура ПриВнешнемСобытии в модуле управляемого приложения или в форме.
Процедура ПриВнешнемСобытии(Источник, Событие, Данные)
Если Источник = "TelephonyComponent" И Событие = "IncomingCall" Тогда
// Данные могут содержать ID документа или номер телефона
СсылкаНаОбъект = ПоискКлиентаПоТелефону(Данные);
ПоказатьЗначение(, СсылкаНаОбъект);
КонецЕсли;
КонецПроцедуры
Если интеграция происходит через внешнее приложение на рабочем столе пользователя, можно инициировать открытие документа через механизм навигационных ссылок. 1С поддерживает протокол e1c://.
Разберем, как это работает: внешнее приложение телефонии при получении звонка формирует строку вида e1c://server/base#e1cib/data/Документ.ЗаказПокупателя?ref=идентификатор и выполняет её в операционной системе. Если сеанс 1С уже запущен, платформа перехватит эту ссылку и откроет нужное окно без повторного ввода логина и пароля.
Проблема нескольких сеансов: Если пользователь «Вася Пупкин» открыл 1С на основном ПК и одновременно в терминале, система должна понимать, куда именно отправить форму. При использовании регистра сведений (Способ 2) рекомендуется добавлять в измерения регистра НомерСеанса или ИмяКомпьютера, чтобы команда дошла до активного в данный момент окна.
Модальные окна: Проанализируем ситуацию, когда у пользователя открыто модальное окно (например, предупреждение или выбор файла). В этом случае метод ОткрытьФорму() может не сработать или вызвать ошибку. Для предотвращения таких ситуаций в современных конфигурациях следует использовать блокирующие окна («режим использования модальности — не использовать») и проверять состояние окна перед вызовом открытия формы.
Отсутствие пользователя на месте: Если звонок поступил, а менеджер отошел, программное открытие формы может «засорить» экран. Хорошей практикой считается не просто открывать документ, а выводить небольшое всплывающее уведомление (через ПоказатьОповещениеПользователя), при нажатии на которое уже откроется полноценная карточка клиента или сделки.