Возвращает позицию символа по переданной закладке.
Синтаксис
ПолучитьПозициюПоЗакладке(<Закладка>)Полное описание, параметры и ограничения
ФорматированныйДокумент.ПолучитьПозициюПоЗакладке (FormattedDocument.GetBookmarkPosition)
ФорматированныйДокумент (FormattedDocument)
ПолучитьПозициюПоЗакладке (GetBookmarkPosition)
Доступен, начиная с версии 8.2.
Синтаксис:
ПолучитьПозициюПоЗакладке(<Закладка>)
Параметры:
<Закладка> (обязательный)
Тип: ЗакладкаФорматированногоДокумента.
Закладка в форматированном документе, для которой надо получить позицию.
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает позицию символа по переданной закладке.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Получить закладки выделения и заменить собственное слово в памятке
Выделение форматированного текста определяется закладками, а не четырьмя номерами строк и колонок. Меняем Книга на КНИГА и восстанавливаем диапазон по числовым позициям.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте внешнюю обработку УчебныеПоляДокументов85 с пустой управляемой основной формой. Запускайте в тонком клиенте Windows; веб-клиент в этот урок не входит.
Не создавайте вручную УчебныйДокумент, ПолеДокумента или учебную команду. Модуль программно добавляет их при открытии формы.
В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте весь код одного урока на уровне модуля, сохраните свою EPF и откройте её в учебной базе.
Поле связано с реквизитом УчебныйДокумент типа ФорматированныйДокумент. Объект документа содержит данные, элемент ПолеДокумента отвечает за отображение и пользовательские действия.
Документ создаётся заново из собственных констант. Книга: 3 штуки по 250, сумма 750. Реальные документы, справочники, файлы, сертификаты и сетевые адреса не используются.
Каждый урок запускайте в отдельной копии формы. Изменения текста и оформления живут в памяти открытой учебной формы; код не сохраняет документ в файл, не печатает и не пишет в базу.
Размеры и ограничения элемента задаются на сервере создания формы. Кнопка выполняет клиентские проверки или явно описанное учебное изменение.
Фактический вид и запуск в 1С не проверены. Настройки компоновки формы, масштаб интерфейса и версия клиента могут влиять на отображение; сверяйте его вручную.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("УчебныйДокумент", Новый ОписаниеТипов("ФорматированныйДокумент")));
ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
Документ = Новый ФорматированныйДокумент;
Документ.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока("Книга: 3 × 250 = 750"));
ЭтаФорма.УчебныйДокумент = Документ;
Поле = Элементы.Добавить("ПолеДокумента", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеФорматированногоДокумента;
Поле.ПутьКДанным = "УчебныйДокумент";
Поле.ТолькоПросмотр = Ложь;
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Заменить своё слово";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Процедура УчебноеДействие(Команда)
Поле = Элементы.ПолеДокумента;
Если Поле.ВыделенныйТекст <> "Книга" Тогда
Сообщить("Выделите только слово Книга в собственной памятке");
Возврат;
КонецЕсли;
Начало = Неопределено;
Конец = Неопределено;
Поле.ПолучитьГраницыВыделения(Начало, Конец);
Если ТипЗнч(Начало) <> Тип("ЗакладкаФорматированногоДокумента") ИЛИ ТипЗнч(Конец) <> Тип("ЗакладкаФорматированногоДокумента") Тогда
ВызватьИсключение "Не получены закладки собственного выделения";
КонецЕсли;
ПозицияНачала = УчебныйДокумент.ПолучитьПозициюПоЗакладке(Начало);
ПозицияКонца = УчебныйДокумент.ПолучитьПозициюПоЗакладке(Конец);
Сообщить(СтрДлина(Поле.ВыделенныйТекст) = 5);
Сообщить("Позиции выделения: " + Строка(ПозицияНачала) + " … " + Строка(ПозицияКонца));
Поле.ВыделенныйТекст = "КНИГА";
НовоеНачало = УчебныйДокумент.ПолучитьЗакладкуПоПозиции(ПозицияНачала);
НовыйКонец = УчебныйДокумент.ПолучитьЗакладкуПоПозиции(ПозицияКонца);
Поле.УстановитьГраницыВыделения(НовоеНачало, НовыйКонец);
Сообщить(Поле.ВыделенныйТекст = "КНИГА");
Сообщить(СтрНайти(УчебныйДокумент.ПолучитьТекст(), "750") > 0);
КонецПроцедуры
Разбор по шагам
Перед нажатием выделяем ровно Книга. Любое другое выделение вызывает только инструкцию, без замены.
ПолучитьГраницыВыделения возвращает два объекта ЗакладкаФорматированногоДокумента через переменные.
До изменения переводим закладки в числовые позиции. Длину пяти букв проверяем по ВыделенныйТекст, а реальные позиции выводим диагностически: справка этого метода не объявляет разность границ длиной строки.
После записи ВыделенныйТекст старые закладки изменённого фрагмента не используем: заново получаем их по сохранённым позициям.
Новая строка имеет ту же длину, поэтому границы диапазона сохраняются. Метод установки выделения принимает две новые закладки.
Как проверить результат
После правильного выделения ожидаются три Истина: длина текста 5, выделенное КНИГА и нетронутая сумма 750, а также строка фактических позиций.
Нажмите без нужного выделения: памятка не изменится. Повторный исходный опыт выполняйте после нового открытия формы.
Ожидаемый результат
Выделение форматированного документа разобрано с правильными объектами границ и явным сохранением позиций.
На что обратить внимание
Не подставляйте четыре координаты обычного текста в метод форматированного поля.
Закладки удалённого или изменённого фрагмента не следует молча считать действительными.
При замене текстом другой длины нужно пересчитать конечную позицию; этот урок использует только равную длину.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Найти ошибочное название и заменить его, обновив закладку после удаления
В собственной строке Товар: Ручка; количество: 3 заменяем Ручка на Книга. Отсутствие совпадения обрабатывается до доступа к диапазону.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Отдельная учебная база, серверный общий модуль УчебныеЗадачи. Фрагмент без директив вставьте в тело ВыполнитьПример() Экспорт.
Документ создаётся заново в памяти при каждом запуске. Существующие реквизиты, файлы и документы конфигурации не меняются.
Сообщения показывают контрольные проверки. Для визуального просмотра оформления используйте отдельную задачу с полным модулем учебной формы.
Документ = Новый ФорматированныйДокумент;
Документ.Добавить("Товар: Ручка; количество: 3");
Начало = Документ.ПолучитьЗакладкуНачала();
Конец = Документ.ПолучитьЗакладкуКонца();
Область = Документ.НайтиТекст("ручка", Начало, Конец, Истина, Истина);
Если Область = Неопределено Тогда
ВызватьИсключение "Учебное название для замены не найдено";
КонецЕсли;
Сообщить(Документ.ПолучитьТекст(Область.ЗакладкаНачала, Область.ЗакладкаКонца) = "Ручка");
Позиция = Документ.ПолучитьПозициюПоЗакладке(Область.ЗакладкаНачала);
Документ.Удалить(Область.ЗакладкаНачала, Область.ЗакладкаКонца);
НоваяЗакладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция);
Документ.Вставить(НоваяЗакладка, "Книга");
Сообщить(СтрНайти(Документ.ПолучитьТекст(), "Товар: Книга; количество: 3") > 0);
Сообщить(Документ.НайтиТекст("Ручка") = Неопределено);
Сообщить(Документ.ПолучитьПозициюПоЗакладке(Документ.ПолучитьЗакладкуНачала()) = 0);Разбор по шагам
Получаем начальную/конечную закладки документа и ищем ручка без учёта регистра.
НайтиТекст возвращает ОбластьФорматированногоДокумента либо Неопределено. Проверяем отсутствие до обращения к ЗакладкаНачала/Конца.
Сохраняем числовую позицию начала найденного названия, удаляем только диапазон совпадения.
После изменения создаём НОВУЮ закладку по сохранившей смысл позиции начала и вставляем Книга.
Проверяем всю ожидаемую фразу, отсутствие старого названия и нулевую позицию начала документа.
Как проверить результат
Четыре сравнения Истина; количество 3 и остальной текст не потерялись.
Измените исходное название на Коробка: пример выдаёт понятную ошибку отсутствия, не обращается к свойствам Неопределено.
Ожидаемый результат
Выполнена конкретная замена с безопасной обработкой результата поиска и обновлением позиции вставки.
На что обратить внимание
Вставленный текст получает оформление по правилам позиции документа. Для точного стиля используйте возвращённый текстовый элемент и задайте его свойства.
Это замена одного ближайшего совпадения, не глобальная замена всех строк.
После удаления старые объекты диапазона не используем для следующей вставки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.