TGViewer
Журнал инженера-программиста Журнал инженера-программиста @software_engineer_notes · 248 subscribers
Post #212 170
🟡 => 🤬 🤬 🤬

Захотелось в 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


Итого. Удобного функционала нет, а использование существующего сопряжено с рисками, что в следующей версии платформы поведение изменится. Риторический вопрос: что мешало разработчикам сделать выделение текста, чтобы оно сразу работало без танцев с бубном?
  • 🔥 4
More from @software_engineer_notes
  1. Oct 3, 2026"Вы автоматизируете хаос" - этим страхом любят пугать своих бизнес-заказчиков консалтеры,…
  2. Sep 28, 2026Уже второй проект на работе делаю в методике "парного программирования" с Claude Code. И с…
  3. Sep 13, 2026За последний месяц произошло много событий, но наиболее интересным является использование…
  4. Sep 1, 2026Самая обычная бумажная книга учета - это пока лучший инструмент фиксации проектных изменен…
  5. Aug 31, 2026Очень показательная причина моей нелюбви реализации сравнения/объединения конфигураций в 1…
  6. Aug 29, 2026О концепции LLM-Wiki я впервые прочитал на X (Twitter). Чтобы позже ознакомится детальнее,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →