В современной практике интеграции 1С с внешними системами (системами распознавания номеров, весовым оборудованием, сторонними веб-сервисами) часто возникает задача мгновенной реакции интерфейса на внешнее событие. Рассмотрим классический сценарий: внешняя система (например, Trassir) отправляет JSON-пакет на HTTP-сервис 1С, и в этот же момент у пользователя (весовщика или оператора) должна автоматически открыться форма нового или существующего документа. Разберем, почему это невозможно сделать напрямую и какие существуют надежные способы реализации этой задачи.
Проанализируем техническую суть проблемы. Когда 1С получает HTTP-запрос, выполнение кода происходит на сервере в рамках отдельного сеанса. Этот сеанс является фоновым и не имеет графического интерфейса. У него нет «экрана», на котором можно было бы отобразить форму. Команда ОткрытьФорму() в контексте серверного вызова HTTP-сервиса просто не имеет смысла и не сработает. Более того, серверный сеанс HTTP-сервиса никак напрямую не связан с клиентским сеансом конкретного пользователя, сидящего за компьютером. Наша задача — передать «сигнал» из невидимого серверного сеанса в активное окно пользователя. Выясним, как это реализовать.
Это самый популярный и универсальный способ, который подходит как для обычных, так и для управляемых форм. Идея заключается в использовании промежуточного звена — «очереди событий».
Шаг 1. Создание регистра-очереди. Разберем структуру регистра сведений (назовем его ОчередьСобытийДляОткрытияФорм). Нам понадобятся следующие ресурсы и реквизиты:
Шаг 2. Запись данных при получении HTTP-запроса. В модуле HTTP-сервиса, после обработки JSON и создания/поиска документа, мы фиксируем необходимость открытия формы:
НоваяЗапись = РегистрыСведений.ОчередьСобытийДляОткрытияФорм.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Пользователь = НужныйПользователь;
НоваяЗапись.ДокументСсылка = СозданныйДокумент;
НоваяЗапись.Обработано = Ложь;
НоваяЗапись.Записать();
Шаг 3. Клиентский мониторинг. На стороне клиента (в форме рабочего стола или в глобальном модуле через обработчик ожидания) мы запускаем проверку этого регистра. Рассмотрим пример кода в модуле обычного приложения или в форме АРМ:
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьОчередьОткрытияФорм", 5); // Проверка каждые 5 секунд
КонецПроцедуры
Процедура ПроверитьОчередьОткрытияФорм() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Очередь.ДокументСсылка
|ИЗ
| РегистрСведений.ОчередьСобытийДляОткрытияФорм КАК Очередь
|ГДЕ
| Очередь.Пользователь = &ТекущийПользователь
| И Очередь.Обработано = ЛОЖЬ";
Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Открываем форму документа
ОткрытьФормуДокумента(Выборка.ДокументСсылка);
// Помечаем как обработанное, чтобы не открывать повторно
МенеджерЗаписи = РегистрыСведений.ОчередьСобытийДляОткрытияФорм.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.ДокументСсылка = Выборка.ДокументСсылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Обработано = Истина;
МенеджерЗаписи.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Если ваша база работает на платформе версии 8.3.10 и выше, мы можем использовать более современный механизм — Систему взаимодействия. Она позволяет отправлять сообщения между сеансами практически мгновенно, не нагружая сервер постоянными запросами к базе данных.
Рассмотрим, как это работает. При получении HTTP-запроса серверная часть 1С отправляет сообщение в специальный канал или конкретному пользователю. На стороне клиента срабатывает обработчик события ПриПолученииСообщения. В этом обработчике мы можем прописать код открытия формы. Это избавляет нас от использования ПодключитьОбработчикОжидания и обеспечивает реакцию в доли секунды.
Пример отправки сообщения (Сервер):
Сообщение = СистемаВзаимодействия.СоздатьСообщение(НужноеОбсуждение);
Сообщение.Текст = "ОТКРЫТЬ_ВЗВЕШИВАНИЕ";
Сообщение.Данные = Новый Структура("Ссылка", СсылкаНаДокумент);
Сообщение.Отправить();
Преимущество: Это решение гораздо элегантнее, так как работает по событийной модели (Push-уведомление), а не по модели опроса (Pulling).
Как справедливо отмечено в обсуждении, «выбрасывание» новых форм перед лицом пользователя может быть неудобным, особенно если машины едут плотным потоком. Правильнее будет разработать Автоматизированное рабочее место (АРМ).
Разберем структуру такого АРМ:
Сигнал() или запуском аудиофайла).Такой подход позволяет пользователю контролировать процесс и самостоятельно открывать нужную запись, нажав на нее, либо форма может открываться автоматически, только если у пользователя сейчас не открыто другое окно (проверка ЭтаФорма.Активна()).
Проанализируем несколько критических моментов, которые часто упускают при реализации подобных задач:
1. Фокус окна Windows. При программном открытии формы из фонового режима окно 1С может просто начать мигать на панели задач. Чтобы принудительно вывести окно на передний план, иногда приходится использовать внешние компоненты, вызывающие функцию Windows API SetForegroundWindow. Без этого бухгалтер может просто не заметить, что форма открылась «где-то там под браузером».
2. Блокировки данных. Учтите, что пока HTTP-сервис создает и записывает документ, он может наложить на него блокировку. Если клиентская часть попытается открыть форму этого же документа в ту же миллисекунду, возникнет конфликт. Рекомендуется делать небольшую паузу или обрабатывать исключение при открытии формы.
3. Оптимизация опроса. Если вы выбрали метод с обработчиком ожидания, не ставьте интервал меньше 3-5 секунд. Слишком частые запросы к базе данных от многих пользователей могут создать лишнюю нагрузку на SQL-сервер. Для мгновенного отклика лучше использовать Систему взаимодействия или внешние компоненты с поддержкой WebSockets.
Заключение. Несмотря на то, что прямого метода ОткрытьФорму() из HTTP-запроса не существует, комбинация Регистра Сведений и Обработчика ожидания является надежным «золотым стандартом» для старых конфигураций (БП 2.0). Для современных систем рекомендуется смотреть в сторону Системы взаимодействия, которая обеспечивает наилучший пользовательский опыт.