Как программно прокрутить «Поле форматированного документа» к концу текста в 1С?

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

При разработке чатов или систем отображения истории переписки в 1С:Предприятии 8.3 часто возникает задача: пользователь должен видеть самые последние сообщения сразу после их добавления. Стандартное поведение Поля форматированного документа при программном изменении содержимого через УстановитьФорматированнуюСтроку таково, что скролл автоматически устанавливается в самое начало документа. Давайте разберем, как принудительно заставить поле прокрутиться вниз.

Решение 1: Использование метода УстановитьГраницыВыделения

Это наиболее «родной» и платформенный способ, который не требует вызова внешних COM-объектов. Суть метода заключается в манипуляции с закладками документа. Мы программно получаем позицию конца документа и принудительно устанавливаем границы выделения в эту точку. Когда фокус выделения смещается в конец, интерфейс элемента автоматически прокручивается, чтобы показать выделенную область.

Для реализации этого решения проанализируем следующий код:


&НаКлиенте
Процедура ПрокрутитьФормДокументВниз()
    // Получаем объект форматированного документа из элемента формы
    ФормДокумен = Элементы.ПолеФорматированногоДокумента.ПолучитьДанные();
    
    // Получаем закладку, указывающую на самый конец документа
    ЗакладкаКонца = ФормДокумен.ПолучитьЗакладкуКонца();
    
    // Устанавливаем границы выделения в одну точку (конец документа)
    Элементы.ПолеФорматированногоДокумента.УстановитьГраницыВыделения(ЗакладкаКонца, ЗакладкаКонца);
КонецПроцедуры

Важные нюансы реализации:

  1. Метод работает корректно только в том случае, если элемент формы уже отрисован. Если вы вызываете этот код сразу в ПриСозданииНаСервере, прокрутка может не сработать, так как форма еще не инициализировала визуальные компоненты.
  2. Для надежности рекомендуется вызывать процедуру прокрутки через ПодключитьОбработчикОжидания с минимальной задержкой (например, 0.1 секунды), чтобы дать платформе время на завершение отрисовки данных в Поле форматированного документа.

Решение 2: Эмуляция нажатия клавиш (WScript.Shell)

Этот подход был предложен на ранних этапах обсуждения и является «обходным путем». Он имитирует физическое нажатие клавиш Ctrl+End, которое во всех текстовых редакторах (включая элемент 1С) перемещает курсор в конец текста.


// Устанавливаем фокус на элемент
ЭтаФорма.ТекущийЭлемент = Элементы.ПолеФорматированногоДокумента;
// Создаем объект для управления клавиатурой
Shell = Новый COMОбъект("WScript.Shell");
// Эмулируем нажатие клавиш
Shell.SendKeys("^{END}");

Ограничения данного способа:

  1. Требует наличия прав на создание COM-объекта WScript.Shell, что может быть ограничено политиками безопасности на сервере или клиенте.
  2. Метод нестабилен, если пользователь в момент выполнения кода активно взаимодействует с клавиатурой или мышью — эмуляция клавиш может привести к непредсказуемому поведению фокуса в других элементах формы.
  3. Требует, чтобы свойство ТолькоПросмотр было установлено в Ложь, что не всегда допустимо по бизнес-логике приложения.

Рекомендации по архитектуре системы переписки

Проанализировав ситуацию, мы выяснили, что Поле форматированного документа не является специализированным инструментом для чатов. Оно хранит весь документ в памяти, и при каждом добавлении новой строки происходит пересборка всего объекта, что негативно сказывается на производительности при больших объемах переписки.

Если ваша задача подразумевает большой поток сообщений, рассмотрите следующие альтернативы:

Мы рекомендуем начать с использования метода УстановитьГраницыВыделения, так как он использует штатные возможности платформы 1С:v8.3, является наиболее безопасным и не требует дополнительных прав доступа к операционной системе.

← На главную