При разработке мобильных приложений на платформе 1С часто возникает задача отображения больших списков номенклатуры с картинками. Стандартные элементы формы не всегда позволяют реализовать гибкий дизайн, поэтому разработчики часто прибегают к использованию ПолеHTMLДокумента. Однако здесь мы сталкиваемся с ограничением: встроенные события 1С не реагируют на прокрутку внутри этого поля. Давайте разберем, как реализовать механизм дозагрузки данных (бесконечную прокрутку) через взаимодействие 1С и JavaScript.
Для того чтобы реализовать «бесконечную прокрутку», нам нужно создать связку между браузерным движком (WebView), в котором отображается HTML, и серверной (или клиентской) логикой мобильного приложения 1С. Поскольку 1С не видит событие onScroll внутри HTML, мы должны «вытащить» это событие наружу.
ОбработкаНавигации мы считываем этот сигнал, получаем новую порцию данных и передаем их обратно в HTML.Наиболее эффективным и современным способом отследить конец списка является использование Intersection Observer API. Вместо постоянного вычисления координат скролла, которое нагружает процессор мобильного устройства, мы создадим невидимый элемент-маркер в конце списка.
// Внутри HTML документа в самом низу списка добавляем пустой элемент
// <div id="scroll-trigger"></div>
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
// Как только элемент появился в зоне видимости, отправляем сигнал в 1С
window.location = 'e1cib:loadMore';
}
}, { threshold: 1.0 });
observer.observe(document.querySelector('#scroll-trigger'));
Когда в JavaScript выполняется инструкция window.location = 'e1cib:loadMore', платформа 1С генерирует событие ОбработкаНавигации. Нам нужно корректно обработать этот вызов.
&НаКлиенте
Процедура ПолеHTMLОбработкаНавигации(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылка = \"e1cib:loadMore\" Тогда
// Вызываем серверный метод для получения новых данных
ДогрузитьДанныеСервер();
КонецЕсли;
КонецПроцедуры
После того как данные получены на сервере (например, в виде массива структур или JSON), нам нужно обновить DOM-дерево страницы, не перезагружая её полностью. Для этого используем метод Документ.parentWindow.eval().
// Пример передачи данных в JS
Функция СформироватьJSКодДобавления(НовыеДанные)
// Преобразуем данные в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, НовыеДанные);
СтрокаJSON = ЗаписьJSON.Закрыть();
Возврат \"appendItems('\" + СтрокаJSON + \"');\";
КонецФункции
// Выполнение в 1С:
Скрипт = СформироватьJSКодДобавления(МассивНовыхЭлементов);
Элементы.ПолеHTML.Документ.parentWindow.eval(Скрипт);
В самом HTML-файле у вас должна быть определена JS-функция appendItems, которая принимает JSON-строку, парсит её и добавляет новые узлы (элементы div с картинками) в контейнер списка.
Работая с большими списками в мобильной среде, всегда помните о следующих моментах:
loading=\"lazy\" у тегов <img>. Это позволит браузеру самостоятельно загружать изображения только тогда, когда они приближаются к области видимости.Данный подход является наиболее стабильным способом реализации бесконечного скролла в 1С, так как он минимизирует количество обновлений всей страницы и обеспечивает плавную работу интерфейса даже на слабых устройствах. Проанализировав этот метод, вы сможете легко интегрировать его в свои разработки, создавая современные и быстрые интерфейсы для мобильных пользователей.