Как вызвать процедуру или передать сигнал на другой клиент в 1С:Предприятие?

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

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

Ограничения архитектуры платформы

Перед тем как проектировать решение, проанализируем базовые принципы работы сеансов в 1С:

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

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

Наиболее современным и рекомендуемым способом отправки сигналов между сеансами является использование программного интерфейса Системы взаимодействия. Это позволяет доставлять сообщения мгновенно по технологии Push/WebSocket без постоянной нагрузки на СУБД.

Разберем по шагам, как настроить отправку и обработку управляющей команды:

1. Отправка команды со стороны первого клиента (или сервера):

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


// Отправка управляющего сообщения пользователю-получателю
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("Действие", "ОбновитьДанные");
ПараметрыКоманды.Вставить("ИдентификаторОбъекта", СсылкаНаОбъект);

Сообщение = СистемаВзаимодействия.СоздатьСообщение();
Сообщение.Получатели.Добавить(ИдентификаторПользователяПолучателя);
Сообщение.Текст = "Служебная команда";
Сообщение.Данные = Новый ХранилищеЗначения(ПараметрыКоманды);
Сообщение.Записать();

2. Перехват события на стороне принимающего клиента:

В модуле управляемого приложения определяем процедуру обработки входящих сообщений:


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

КонецПроцедуры

Особенности развертывания Системы взаимодействия:

  1. Облачный сервис: По умолчанию подключение происходит через сервис 1cdialog.com, что требует доступа к интернету.
  2. Локальный сервер взаимодействия: Если информационная база работает в закрытом контуре без доступа в интернет, можно развернуть собственный Сервер взаимодействия 1С (1C:Collaboration System Server) внутри локальной сети предприятия.

Способ 2. Периодический опрос через регистр сведений и обработчик ожидания (Polling)

Если Система взаимодействия недоступна, применим классический механизм опроса состояния базы данных по таймеру.

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

  1. Создаем регистр сведений (например, ОчередьКомандКлиентов) со структурой: Получатель (Измерение), ИдентификаторКоманды (Измерение), Команда (Ресурс), Обработана (Реквизит).
  2. Клиент-отправитель записывает строку с нужной командой для целевого пользователя.
  3. Клиент-получатель при старте подключает фоновый обработчик ожидания.

Посмотрим на пример подключения обработчика ожидания на клиенте:


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

&НаКлиенте
Процедура ПроверитьВходящиеКоманды()
    
    // Проверяем наличие команд на сервере
    СписокКоманд = ПолучитьИОбработатьКомандыНаСервере();
    
    Для Каждого ТекКоманда Из СписокКоманд Цикл
        Если ТекКоманда = "ВыполнитьДействие" Тогда
            // Выполняем требуемое действие в интерфейсе
            Оповестить("ВыполнитьСпецифичноеДействие");
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Плюсы и минусы метода: Метод полностью автономен и не требует сторонних сервисов, однако слишком частый опрос (интервал менее 5–10 секунд) создает постоянную паразитную нагрузку на сервер 1С и СУБД при большом числе активных пользователей.

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

Для тонкого клиента в локальной сети мгновенную передачу сигналов можно реализовать с помощью внешней компоненты, поддерживающей постоянное TCP/WebSocket-соединение или подписку на брокер очередей (например, RabbitMQ, MQTT):

  1. Компонента загружается на клиенте и держит открытый сокет.
  2. При поступлении сигнала по сети компонента вызывает внешнее событие платформы.
  3. В конфигурации 1С срабатывает предопределенная процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные), в которой выполняется требуемый клиентский код.

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

Сравнение тонкого и веб-клиента

При выборе архитектурного решения обязательно учитываем тип клиентского приложения:

  1. Тонкий клиент: Поддерживает все доступные технологии: Систему взаимодействия, периодический опрос через ПодключитьОбработчикОжидания и внешние компоненты Native API.
  2. Веб-клиент: Из-за ограничений безопасности веб-браузеров внешние сокет-компоненты недоступны. Для веб-клиента оптимальным выбором является Система взаимодействия (работающая через веб-сокеты браузера) либо периодический опрос базы данных по таймеру.
← На главную