В процессе разработки распределенных и многопользовательских систем часто возникает задача межсеансового взаимодействия: передать команду от одного сеанса другому («разбудить» клиент, запустить фоновый пересчет, обновить форму или закрыть окно). Разберем архитектурные ограничения платформы 1С:Предприятие и практические способы решения этой задачи.
Перед тем как проектировать решение, проанализируем базовые принципы работы сеансов в 1С:
Оповестить(): Стандартный метод Оповестить() и обработчик ОбработкаОповещения в формах работают строго в рамках одного клиентского приложения (между открытыми окнами текущего пользователя) и не передают события в другие сеансы.Наиболее современным и рекомендуемым способом отправки сигналов между сеансами является использование программного интерфейса Системы взаимодействия. Это позволяет доставлять сообщения мгновенно по технологии Push/WebSocket без постоянной нагрузки на СУБД.
Разберем по шагам, как настроить отправку и обработку управляющей команды:
1. Отправка команды со стороны первого клиента (или сервера):
Формируем сообщение конкретному пользователю, передавая в свойствах служебные параметры команды:
// Отправка управляющего сообщения пользователю-получателю
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("Действие", "ОбновитьДанные");
ПараметрыКоманды.Вставить("ИдентификаторОбъекта", СсылкаНаОбъект);
Сообщение = СистемаВзаимодействия.СоздатьСообщение();
Сообщение.Получатели.Добавить(ИдентификаторПользователяПолучателя);
Сообщение.Текст = "Служебная команда";
Сообщение.Данные = Новый ХранилищеЗначения(ПараметрыКоманды);
Сообщение.Записать();
2. Перехват события на стороне принимающего клиента:
В модуле управляемого приложения определяем процедуру обработки входящих сообщений:
Процедура ОбработкаПолученияСообщенияСистемыВзаимодействия(Сообщение, ДополнительныеПараметры)
Если Сообщение.Данные <> Неопределено Тогда
Команда = Сообщение.Данные.Получить();
Если ТипЗнч(Команда) = Тип("Структура") И Команда.Свойство("Действие") Тогда
// Отменяем стандартное отображение сообщения пользователю
ДополнительныеПараметры.СтандартнаяОбработка = Ложь;
Если Команда.Действие = "ОбновитьДанные" Тогда
Оповестить("ОбновитьФорму", Команда.ИдентификаторОбъекта);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Особенности развертывания Системы взаимодействия:
1cdialog.com, что требует доступа к интернету.Если Система взаимодействия недоступна, применим классический механизм опроса состояния базы данных по таймеру.
Рассмотрим алгоритм реализации:
ОчередьКомандКлиентов) со структурой: Получатель (Измерение), ИдентификаторКоманды (Измерение), Команда (Ресурс), Обработана (Реквизит).Посмотрим на пример подключения обработчика ожидания на клиенте:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
// Подключаем опрос с интервалом в 10 секунд
ПодключитьОбработчикОжидания("ПроверитьВходящиеКоманды", 10, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьВходящиеКоманды()
// Проверяем наличие команд на сервере
СписокКоманд = ПолучитьИОбработатьКомандыНаСервере();
Для Каждого ТекКоманда Из СписокКоманд Цикл
Если ТекКоманда = "ВыполнитьДействие" Тогда
// Выполняем требуемое действие в интерфейсе
Оповестить("ВыполнитьСпецифичноеДействие");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Плюсы и минусы метода: Метод полностью автономен и не требует сторонних сервисов, однако слишком частый опрос (интервал менее 5–10 секунд) создает постоянную паразитную нагрузку на сервер 1С и СУБД при большом числе активных пользователей.
Для тонкого клиента в локальной сети мгновенную передачу сигналов можно реализовать с помощью внешней компоненты, поддерживающей постоянное TCP/WebSocket-соединение или подписку на брокер очередей (например, RabbitMQ, MQTT):
ОбработкаВнешнегоСобытия(Источник, Событие, Данные), в которой выполняется требуемый клиентский код.Ограничение: Данный способ не подходит для работы в веб-клиенте без установки расширения работы с файлами и специфичен в поддержке.
При выборе архитектурного решения обязательно учитываем тип клиентского приложения:
ПодключитьОбработчикОжидания и внешние компоненты Native API.