При разработке чатов или систем отображения истории переписки в 1С:Предприятии 8.3 часто возникает задача: пользователь должен видеть самые последние сообщения сразу после их добавления. Стандартное поведение Поля форматированного документа при программном изменении содержимого через УстановитьФорматированнуюСтроку таково, что скролл автоматически устанавливается в самое начало документа. Давайте разберем, как принудительно заставить поле прокрутиться вниз.
Это наиболее «родной» и платформенный способ, который не требует вызова внешних COM-объектов. Суть метода заключается в манипуляции с закладками документа. Мы программно получаем позицию конца документа и принудительно устанавливаем границы выделения в эту точку. Когда фокус выделения смещается в конец, интерфейс элемента автоматически прокручивается, чтобы показать выделенную область.
Для реализации этого решения проанализируем следующий код:
&НаКлиенте
Процедура ПрокрутитьФормДокументВниз()
// Получаем объект форматированного документа из элемента формы
ФормДокумен = Элементы.ПолеФорматированногоДокумента.ПолучитьДанные();
// Получаем закладку, указывающую на самый конец документа
ЗакладкаКонца = ФормДокумен.ПолучитьЗакладкуКонца();
// Устанавливаем границы выделения в одну точку (конец документа)
Элементы.ПолеФорматированногоДокумента.УстановитьГраницыВыделения(ЗакладкаКонца, ЗакладкаКонца);
КонецПроцедуры
Важные нюансы реализации:
ПриСозданииНаСервере, прокрутка может не сработать, так как форма еще не инициализировала визуальные компоненты.ПодключитьОбработчикОжидания с минимальной задержкой (например, 0.1 секунды), чтобы дать платформе время на завершение отрисовки данных в Поле форматированного документа.Этот подход был предложен на ранних этапах обсуждения и является «обходным путем». Он имитирует физическое нажатие клавиш Ctrl+End, которое во всех текстовых редакторах (включая элемент 1С) перемещает курсор в конец текста.
// Устанавливаем фокус на элемент
ЭтаФорма.ТекущийЭлемент = Элементы.ПолеФорматированногоДокумента;
// Создаем объект для управления клавиатурой
Shell = Новый COMОбъект("WScript.Shell");
// Эмулируем нажатие клавиш
Shell.SendKeys("^{END}");
Ограничения данного способа:
WScript.Shell, что может быть ограничено политиками безопасности на сервере или клиенте.ТолькоПросмотр было установлено в Ложь, что не всегда допустимо по бизнес-логике приложения.Проанализировав ситуацию, мы выяснили, что Поле форматированного документа не является специализированным инструментом для чатов. Оно хранит весь документ в памяти, и при каждом добавлении новой строки происходит пересборка всего объекта, что негативно сказывается на производительности при больших объемах переписки.
Если ваша задача подразумевает большой поток сообщений, рассмотрите следующие альтернативы:
Табличное поле или Табличную часть формы. Это позволит вам использовать свойство ТекущаяСтрока, которое мгновенно и без «костылей» прокручивает список к нужному сообщению.Поле HTML-документа дает гораздо больше гибкости. Управление прокруткой там осуществляется через JavaScript (метод scrollIntoView()), что является стандартом индустрии для веб-интерфейсов и работает значительно быстрее, чем манипуляции с объектами 1С.Мы рекомендуем начать с использования метода УстановитьГраницыВыделения, так как он использует штатные возможности платформы 1С:v8.3, является наиболее безопасным и не требует дополнительных прав доступа к операционной системе.