Ситуация, когда информационная система 1С начинает «вязнуть» или «подтормаживать» при внедрении интеграции с телефонией, является классической проблемой для разработчиков. Казалось бы, код выполняется быстро, отладчик не показывает критических задержек, но пользователь жалуется на медленное открытие окон и задержки в отрисовке интерфейса. Проанализируем ситуацию: в нашем случае используется механизм ПодключитьОбработчикОжидания, который раз в несколько секунд опрашивает внешний сервис. Разберем по шагам, почему это приводит к деградации производительности и как реализовать правильную архитектуру взаимодействия.
Выясним основную причину «вязкости» интерфейса. Платформа 1С:Предприятие в части клиентского приложения работает в преимущественно однопоточном режиме для графического интерфейса (UI). Когда срабатывает ПодключитьОбработчикОжидания, выполнение любого пользовательского действия (ввод текста, прокрутка списка) приостанавливается. Рассмотрим подробнее факторы влияния:
HTTPСоединение, это вызывает процедуру рукопожатия (handshake), которая может длиться дольше, чем сам обмен данными.ОповеститьОбИзменении() или программное изменение свойств видимости заставляет платформу полностью пересчитывать макет формы, что является ресурсоемкой операцией.Наиболее современный и правильный способ избежать постоянных опросов (polling) — это переход на событийную модель (push). Рассмотрим подробнее использование Системы взаимодействия. Схема выглядит так: внешний сервис телефонии при поступлении звонка сам отправляет сигнал в 1С.
Для этого на стороне 1С создается HTTP-сервис, который принимает данные от телефонии. После получения данных сервер 1С отправляет сообщение конкретному пользователю через Систему взаимодействия:
// Код на стороне сервера (в HTTP-сервисе)
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя);
ПараметрыСообщения = Новый Структура("НомерТелефона, ИмяКлиента", АОН, ИмяКлиента);
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(ОбсуждениеСсылка);
НовоеСообщение.Текст = "Входящий звонок";
НовоеСообщение.Данные = ПараметрыСообщения;
НовоеСообщение.Записать();
На стороне клиента в модуле управляемого приложения или формы подключается обработчик оповещений Системы взаимодействия. Клиент 1С не делает никаких запросов в режиме ожидания, он просто «слушает» входящий канал, что полностью снимает нагрузку с UI-потока.
Если Система взаимодействия недоступна, проанализируем вариант с использованием поля HTML-документа. Это позволяет реализовать технологию WebSockets или Long Polling внутри 1С. Суть метода заключается в том, что JavaScript-код внутри HTML-поля работает в отдельном процессе (или потоке браузерного движка) и не блокирует основной интерфейс 1С.
Разберем по шагам реализацию этого метода:
window.external.MessageFromObject.Пример получения данных в 1С:
&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
// Обработка данных, пришедших из JavaScript
Если ДанныеСобытия.ИмяСобытия = "IncomingCall" Тогда
ОткрытьКарточкуЗвонка(ДанныеСобытия.Номер);
КонецЕсли;
КонецПроцедуры
Если вы решили оставить ПодключитьОбработчикОжидания, проанализируем, как минимизировать его негативное влияние. Основная ошибка — выполнение «тяжелого» запроса в каждом цикле. Разделим логику на два этапа.
Этап 1: Легкая проверка. Создайте на сервере 1С промежуточное хранилище (например, регистр сведений или кэш в модуле), где будет храниться только флаг наличия нового звонка для пользователя. Обработчик ожидания должен делать максимально быстрый запрос к этому флагу.
Этап 2: Получение данных. Только если флаг установлен, запускайте процедуру получения полной информации о звонке и обновления формы.
Посмотрим на пример оптимизированного обработчика:
&НаКлиенте
Процедура ОбработчикОжидания_ПроверитьЗвонок()
// Проверка флага в памяти сервера (очень быстро)
Если ЕстьНовыеСобытияТелефонии() Тогда
// Только теперь выполняем тяжелую работу
ОбновитьДанныеЗвонкаНаФорме();
КонецЕсли;
КонецПроцедуры
Для максимально производительной работы следует использовать внешние компоненты. Компонента, написанная на C++ или C#, может работать в собственном потоке операционной системы. Она поддерживает постоянное соединение с АТС (например, по протоколу TAPI или через прямое TCP-взаимодействие) и генерирует ВнешнееСобытие в 1С только в момент реального поступления звонка.
Преимущества этого метода:
Выясним причину задержек на уровне сетевого стека. При работе через VPN часто возникает проблема MTU (Maximum Transmission Unit). Если пакет с данными от телефонии вместе с заголовками VPN превышает стандартный размер 1500 байт, происходит фрагментация. Это заставляет клиент 1С ждать сборки пакетов, что выглядит как «зависание» интерфейса в момент сетевого вызова. Рекомендуется установить значение MTU на сетевых интерфейсах в пределах 1300–1400 байт для стабильной работы туннелей.
Подведем итог: Для устранения тормозов необходимо уйти от блокирующих вызовов в основном потоке. Идеальный путь — использование Системы взаимодействия или внешних компонент. Если это невозможно, используйте поле HTML-документа для реализации асинхронности через JavaScript. Это позволит сделать интерфейс отзывчивым, а работу сотрудников — комфортной.