В современной разработке на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда внешнее оборудование (сканеры штрихкодов, ТСД, системы мониторинга) передает данные в базу через HTTP-сервис. Основная сложность заключается в том, что HTTP-сервис работает в фоновом режиме на сервере и «не знает» о том, у какого пользователя в данный момент открыта форма соответствующего документа. Напрямую вызвать клиентский метод из серверного кода HTTP-сервиса невозможно.
Рассмотрим подробно несколько стратегий решения этой задачи: от простых обработчиков ожидания до использования современной Системы взаимодействия.
Проанализируем самый доступный способ. Если HTTP-сервис напрямую изменяет и записывает документ, форма на клиенте должна узнать об этом изменении. Самый простой путь — периодический опрос сервера.
Разберем алгоритм реализации:
Пример кода для формы документа:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ПроверитьОбновлениеДанных", 5); // Проверка каждые 5 секунд
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОбновлениеДанных()
Если Объект.Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;
НужноОбновить = ПроверитьИзмененияНаСервере(Объект.Ссылка, Объект.ВерсияДанных);
Если НужноОбновить Тогда
// Метод Прочитать() восстановит данные объекта из БД
ЭтотОбъект.Прочитать();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьИзмененияНаСервере(Ссылка, ТекущаяВерсия)
Возврат Ссылка.ВерсияДанных <> ТекущаяВерсия;
КонецФункции
Важный нюанс: использование метода Прочитать() полностью перезаполняет объект. Если пользователь в этот момент начал что-то вводить вручную, его несохраненные правки будут потеряны. Также возникнет ошибка «Данные были изменены или удалены другим пользователем», если клиент попытается записать форму, не обновив её предварительно.
Этот метод более надежен и профессионален. Вместо того чтобы HTTP-сервис сразу правил документ, мы заставим его записывать данные в специальный «буфер» — регистр сведений. Это исключает блокировки документа и конфликты версий.
Выясним причину, почему это лучше: когда форма сама «забирает» данные из регистра, она делает это в контексте текущего сеанса пользователя. Мы можем программно добавить строки в таблицу, не вызывая полную перезагрузку объекта Прочитать().
Разберем по шагам:
ОчередьОбновленияШК с измерениями ДокументСсылка и ресурсом ДанныеШК.Пример обработки данных из очереди в форме:
&НаКлиенте
Процедура ОбработкаОчереди()
НовыеДанные = ПолучитьДанныеИзРегистра(Объект.Ссылка);
Если НовыеДанные.Количество() > 0 Тогда
Для Каждого СтрокаДанных Из НовыеДанные Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = 1;
// Дополнительная логика поиска цены и т.д.
КонецЦикла;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Проанализируем наиболее современный подход. Начиная с версии платформы 8.3.15, 1С позволяет отправлять сообщения конкретным пользователям или в обсуждения. Это избавляет систему от постоянных запросов к серверу (polling) и снижает нагрузку.
Рассмотрим схему работы:
ПриПолученииСообщения.Это позволяет реализовать «мгновенное» обновление без задержек, характерных для таймеров. Пользователь отсканировал ШК — строка тут же появилась в форме.
Иногда корень проблемы лежит в нестабильности работы торгового оборудования. Если сканер работает через HTTP-сервис только потому, что «отваливаются драйверы», стоит рассмотреть альтернативные варианты настройки.
Посмотрим на рекомендации по стабилизации работы сканеров:
Выясним, какой метод выбрать в зависимости от условий:
ВерсияДанных, но помним о риске конфликта блокировок при записи.Подводя итог, отметим, что прямое обновление формы из HTTP-сервиса — это всегда комбинация серверного события и клиентского механизма «прослушивания». Правильно спроектированная архитектура (например, через промежуточный регистр) позволит вашим пользователям работать комфортно и без ошибок потери данных.