Захотелось в 1С сделать красивую вставочку текста по нажатию на кнопки. Ни в поле текстового ввода, ни в поле текстового документа управление позицией курсора не предусмотрено.
Точнее существует метод GetTextSelectionBounds(), над параметрами к которому еще нужно поломать голову:
Form field extension for a text document
Syntax: GetTextSelectionBounds(<BeginningOfRow>, <BeginningOfColumn>, <EndOfRow>, <EndOfColumn>)
Returned value: Returns the cursor position.
Но он просто не работает и выдает ошибку: Object procedure called as function (GetTextSelectionBounds)
Но зато обнаружилась установка выделения фрагмента - тоже неплохо. Пусть текст вставляется в конец, но если он будет выделен, то можно его схватить мышкой и перетащить на требуемую позицию.
Ага. Разбежался 🤣
Form field extension for a text document
SetTextSelectionBounds(<StartPosition>, <EndPosition>)
<StartPosition> (required) - Type: Number - Start position of selection in the text.
<EndPosition> (required) - Type: Number - End position of selection in the text.
Указываю началом позицию окончания предыдущей строки и делаю смещение на длину добавляемого фрагмента. Запускаю на выполнение и... получаю ошибку: Invalid parameter value (parameter number '2') - понимай как хочешь 🤔
Методом эксперимента выясняю, что если передать во второй параметр стартовую позицию, то ошибки не будет. Прихожу к выводу: не смотря на новое значение данных для поля на форме, сама форма об этом еще не в курсе. Хорошо, попробую обновить элемент. Отлично, ошибка пропала и в текстовом поле добавился новый фрагмент, только он не выделился 😳
А что если причина в клике на кнопку? Ведь сейчас форма считает активным элементом именно кнопку, а выделять текст можно только при редактировании текстового поля, когда оно активно. А что если перед выделением вернуть позиционирование на форме на текст? Ура, получилось! 🥹
Итого, для вставки выделенного фрагмента в текстовое поле нужно выполнить следующие операции:
&AtClient
Procedure AddNewText(NewText)
PrevPosition = StrLen(DocumentText) + 1;
DocumentText = DocumentText + NewText;
NewPosition = PrevPosition + StrLen(NewText);
ThisObject.RefreshDataRepresentation(Items.DocumentText);
ThisObject.CurrentItem = Items.DocumentText;
Items.DocumentText.SetTextSelectionBounds(PrevPosition, NewPosition);
EndProcedure
Итого. Удобного функционала нет, а использование существующего сопряжено с рисками, что в следующей версии платформы поведение изменится. Риторический вопрос: что мешало разработчикам сделать выделение текста, чтобы оно сразу работало без танцев с бубном?