Как обновить данные в открытой форме 1С, если они приходят через HTTP-сервис

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

В современной разработке на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда внешнее оборудование (сканеры штрихкодов, ТСД, системы мониторинга) передает данные в базу через HTTP-сервис. Основная сложность заключается в том, что HTTP-сервис работает в фоновом режиме на сервере и «не знает» о том, у какого пользователя в данный момент открыта форма соответствующего документа. Напрямую вызвать клиентский метод из серверного кода HTTP-сервиса невозможно.

Рассмотрим подробно несколько стратегий решения этой задачи: от простых обработчиков ожидания до использования современной Системы взаимодействия.

Метод 1. Использование обработчика ожидания и контроля версии объекта

Проанализируем самый доступный способ. Если HTTP-сервис напрямую изменяет и записывает документ, форма на клиенте должна узнать об этом изменении. Самый простой путь — периодический опрос сервера.

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

  1. В форме документа при открытии подключаем обработчик ожидания.
  2. В процедуре обработчика проверяем, не изменилась ли версия объекта в базе данных.
  3. Если версия изменилась — обновляем данные.

Пример кода для формы документа:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("ПроверитьОбновлениеДанных", 5); // Проверка каждые 5 секунд
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОбновлениеДанных()
    Если Объект.Ссылка.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    НужноОбновить = ПроверитьИзмененияНаСервере(Объект.Ссылка, Объект.ВерсияДанных);
    
    Если НужноОбновить Тогда
        // Метод Прочитать() восстановит данные объекта из БД
        ЭтотОбъект.Прочитать(); 
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьИзмененияНаСервере(Ссылка, ТекущаяВерсия)
    Возврат Ссылка.ВерсияДанных <> ТекущаяВерсия;
КонецФункции

Важный нюанс: использование метода Прочитать() полностью перезаполняет объект. Если пользователь в этот момент начал что-то вводить вручную, его несохраненные правки будут потеряны. Также возникнет ошибка «Данные были изменены или удалены другим пользователем», если клиент попытается записать форму, не обновив её предварительно.

Метод 2. Реализация через «Очередь сообщений» (Регистр сведений)

Этот метод более надежен и профессионален. Вместо того чтобы HTTP-сервис сразу правил документ, мы заставим его записывать данные в специальный «буфер» — регистр сведений. Это исключает блокировки документа и конфликты версий.

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

Разберем по шагам:

  1. Создаем регистр сведений ОчередьОбновленияШК с измерениями ДокументСсылка и ресурсом ДанныеШК.
  2. HTTP-сервис получает штрихкод и создает запись в этом регистре.
  3. Форма документа через обработчик ожидания проверяет наличие записей в регистре по своей ссылке.
  4. Если записи найдены, форма считывает их, добавляет строки в табличную часть и удаляет записи из регистра.

Пример обработки данных из очереди в форме:


&НаКлиенте
Процедура ОбработкаОчереди()
    НовыеДанные = ПолучитьДанныеИзРегистра(Объект.Ссылка);
    
    Если НовыеДанные.Количество() > 0 Тогда
        Для Каждого СтрокаДанных Из НовыеДанные Цикл
            НоваяСтрока = Объект.Товары.Добавить();
            НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
            НоваяСтрока.Количество = 1;
            // Дополнительная логика поиска цены и т.д.
        КонецЦикла;
        Модифицированность = Истина;
    КонецЕсли;
КонецПроцедуры

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

Проанализируем наиболее современный подход. Начиная с версии платформы 8.3.15, 1С позволяет отправлять сообщения конкретным пользователям или в обсуждения. Это избавляет систему от постоянных запросов к серверу (polling) и снижает нагрузку.

Рассмотрим схему работы:

  1. HTTP-сервис, получив данные, программно отправляет сообщение в канал обсуждения, связанный с этим документом.
  2. В форме документа подключается обработчик оповещений Системы взаимодействия.
  3. Как только сообщение приходит, на клиенте мгновенно срабатывает событие ПриПолученииСообщения.

Это позволяет реализовать «мгновенное» обновление без задержек, характерных для таймеров. Пользователь отсканировал ШК — строка тут же появилась в форме.

Метод 4. Решение проблем на уровне оборудования (Mindeo 3690 и аналоги)

Иногда корень проблемы лежит в нестабильности работы торгового оборудования. Если сканер работает через HTTP-сервис только потому, что «отваливаются драйверы», стоит рассмотреть альтернативные варианты настройки.

Посмотрим на рекомендации по стабилизации работы сканеров:

Сравнение подходов

Выясним, какой метод выбрать в зависимости от условий:

  1. Нужна максимальная скорость и современная платформа? Выбираем Систему взаимодействия. Это обеспечит мгновенную реакцию интерфейса.
  2. Нужна надежность и работа с несколькими пользователями? Выбираем Регистр-очередь. Это гарантирует, что данные не потеряются, даже если форма была закрыта в момент сканирования (их можно будет подтянуть при открытии).
  3. Нужно быстрое и простое решение «здесь и сейчас»? Используем обработчик ожидания с проверкой ВерсияДанных, но помним о риске конфликта блокировок при записи.

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

← На главную