1с вставить текст в позицию курсора
Редактор текста и модуля — это один из инструментов разработки. Он используется для редактирования текстовых документов и для редактирования программных модулей конфигурации.
Редактор текстов и модулей предоставляет пользователю все основные функции, необходимые при редактировании как простых текстов, так и текстов программных модулей. Конфигуратор 1С:Предприятия 8 использует этот редактор в двух режимах:- для редактирования текстовых документов;
- для редактирования текстов модулей (как составную часть редактора формы).
Редактирование текстовых документов
В режиме редактирования текстовых документов редактор поддерживает все стандартные функции редактирования текста:- создание нового документа или открытие одного из существующих документов;
- ввод и редактирование текста;
- сохранение отредактированного текста;
- печать текста.
В процессе редактирования текста можно переходить к конкретной строке документа, сдвигать блоки текста на позицию табуляции, выполнять поиск и замену и использовать закладки. Закладки могут быть размещены на любой строке текста:
В дальнейшем быстрый переход по закладкам возможен по сочетанию клавиш или команде меню:
Редактирование текстов модулей
Редактирование текстов модулей может выполняться в процессе создания формы объекта прикладного решения, непосредственно при разработке модулей объектов или всего приложения, и при редактировании внешнего текстового файла, содержащего текст модуля.
Помимо стандартных действий, присущих любому текстовому редактору, редактор текстов и модулей имеет ряд специфических особенностей:
Выделение цветом синтаксических конструкций
Для удобства редактирования текстов модулей редактор выделяет цветом элементы встроенного языка: ключевые слова, языковые константы, операторы, комментарии и пр.:
Разработчик может использовать цвета выделения, установленные по умолчанию, или настроить их самостоятельно. В общем случае система сама отслеживает необходимость включения режима выделения цветом. Однако в ситуации, когда система «не знает» о том, что редактируется текст модуля (например, если редактируется внешний текстовый файл, содержащий текст модуля), разработчик может включить режим выделения цветом вручную, используя меню конфигуратора:
Группировка
При просмотре модулей редактор позволяет объединять некоторые синтаксические конструкции языка в группы, сворачивать и разворачивать их. Использование группировки синтаксических конструкций позволяет лучше воспринимать различные части текста, а также переносить и копировать группы целиком:
Свернутый текст замещается специальным маркером, который позволяет просмотреть содержимое свернутой группы в виде подсказки:
Разработчику предоставляется возможность настраивать режим группировки, указывая, какие синтаксические конструкции могут группироваться, и каким должно быть исходное состояние группировки (свернутая или развернутая) при открытии документа. Таким образом, он может настроить, например, использование группировок «по максимуму»:
Области
Разработчик может выделять произвольные области текста, группировать и сворачивать их подобно тому, как сворачиваются инструкции циклов, условий, процедур и функций.
Каждой области текста, которую выделяет разработчик, он может дать собственное имя. Это позволяет простым и понятным образом выделять части модуля, имеющие сходный смысл.
Области могут быть вложены друг в друга или в другие группируемые конструкции языка.
Операции с блоками
Редактор позволяет выполнять ряд операций над выделенными блоками текста модуля: автоматическое форматирование, изменение отступа, добавление/удаление комментариев и переносов строк.
Форматирование модуля
Хорошим стилем написания модулей считается использование синтаксического отступа для выделения управляющих конструкций встроенного языка. Редактор позволяет автоматически форматировать текст при его вводе, и кроме этого, выполнять автоматическое форматирование уже введенного текста.
Результат автоматического форматирования:
Увеличение/уменьшение отступа
Наряду с автоматическим форматированием всего выделенного текста, редактор поддерживает также операции сдвига выделенного блока вправо или влево на шаг табуляции.
Это облегчает ручное форматирование больших фрагментов кода.
Добавление/удаление комментариев
Также редактор содержит очень удобную для разработчика функцию автоматической (одним нажатием мыши) установки и снятия комментариев на выделенный текст. Такая возможность часто используется при отладке модулей:
Добавление/удаление переноса строки
Использование добавления и удаления переноса строки часто применяется при переносе текстов запроса между модулем и, например, консолью запросов.
Таким образом, отладив запрос в консоли запросов, разработчик может просто скопировать текст запроса из консоли, вставить его в модуль и одним движением добавить перенос строки ко всем строкам текста запроса:
Переход по процедурам и функциям
В ситуации, когда модуль содержит большое количество процедур и функций, удобно использовать режим поиска процедур, который поддерживается редактором. Процедуры и функции отображаются в отдельном окне в порядке их расположения в модуле, однако разработчик может отсортировать их по алфавиту. Пиктограммы слева от названия обозначают имеющиеся процедуры и функции, а имена в угловых скобках соответствуют предопределенным процедурам, которые в настоящий момент отсутствуют, но могут быть размещены в данном модуле.
Если установить курсор на той процедуре, которая еще отсутствует в модуле, и нажать Перейти, конструктор автоматически вставит в текст модуля заголовок предопределенной процедуры.
Переход к определению процедур и функций
Редактор позволяет автоматически переходить к определению процедуры или функции, использованной в тексте модуля. Для этого достаточно установить курсор на имени нужной функции в теле модуля и выполнить команду контекстного меню или нажать «горячую» клавишу. В окне редактора будет открыт текст искомой процедуры или функции:
Контекстная подсказка
Редактор предоставляет средство контекстного ввода выражений с использованием системных объектов, их свойств, методов и пр. В процессе ввода текста или при нажатии комбинации клавиш редактор выводит контекстный список, позволяющий выбрать нужное свойство, метод, функцию и т. д., что позволяет быстро и правильно набирать тексты модулей:
Контекстная подсказка также работает и для параметров некоторых методов, если эти параметры задаются строковыми литералами.
Копирование имен объектов и реквизитов
При написании текста модуля разработчик может просто перетаскивать мышью имена объектов или их реквизитов из дерева метаданных в нужное место модуля:
Проверка модуля
Редактируемый модуль может быть проверен на правильность использования синтаксических конструкций встроенного языка, корректность обращений к методам и свойствам объектов «через точку», а также на корректность некоторых параметров, имеющих тип «Строка»:
Кроме этого конфигуратор поддерживает выполнение полной проверки всех модулей, содержащихся в прикладном решении.
В процессе работы с модулем разработчик имеет возможность получать контекстную подсказку по встроенному языку, используя синтакс-помощник. Для этого достаточно установить курсор на интересующий элемент языка и нажатием комбинации клавиш (или по контекстному меню) перейти к описанию этого элемента языка в синтакс-помощнике.
Ограничение доступа к модулю
Для большинства модулей прикладного решения можно установить пароль доступа, защищающий авторские права разработчика конфигурации. При попытке открыть защищенный модуль выводится диалог ввода пароля:
Использование шаблонов
При редактировании текстовых документов и модулей конфигуратор предоставляет разработчику возможность использовать механизм шаблонов для автоматической подстановки часто используемых фрагментов текста.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
Разместил: E_Migachev Версии: | 8.x | Дата: 28.02.2011 Прочитано: 30952
Похожие FAQ
1С Предприятие что это? 11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое База для Разработки или Рабочая? Как быстро определить? 3
Когда-то я работал консультантом SAP . В SAPe есть настройка изменения цвета главного окна программы и у нас было негласное правило: Рабочая программа - Красный фон , Тестовая - Зеленый , Разработка - Синий . Работая в 1С, всегда открыто по 5-6 Временные таблицы, что из себя представляют и как с ними работать? 7
Временные таблицы - хранятся на сервере и позволяют писать более простые запросы. Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц . Когда этот объект уничтожается, уничтожаются и временные таблицы. Чтобы создать временную таблицу Выборка из результата запроса всех вошедших в него значений группировок 4
При обходе результата запроса нередко возникает необходимость получения всех значений группировок внутри какой-либо другой группировки. Такая возможность может понадобиться, например, при выводе кросс отчета. Для обеспечения такой возможности в объек Выбрать движения, получить выборку записей регистра накопления 1
Пример 1 : //Взаиморасчеты за период, хотя, это лучше выбирать запросом , он в примере 3 Отбор = Новый Структура("Организация", Организация); НаборЗаписей = РегистрыНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Выбрать(ПериодРегистрации, КонецМе Посмотреть все результаты поиска похожих
Еще в этой же категории
Как сформировать документ в Word из 1С? (Active Document) 14
ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ _ Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа: 1. Путем замены шаблонного текста в макете Wordа. 2. Путем вставки текста с помощью закладок в Wo Как в excel сохраненный из 1С вставить новый лист? 13
Я думаю, все сталкивались с однолистовым excel файлом из 1С, у которого на первый взгляд, нет возможности добавить листы. Все не так страшно - их просто скрыли или, что чаще всего - даже не отображали (обусловлено созданием файла из стороннего прил Экспорт и Импорт данных 1С - Microsoft Excel 12
Экспорт Процедура ОсновныеДействияФормыЭкспорт(Кнопка) - выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel с указанным именем, используя преобразование данных к типу число и типу строка; Процедура Основ Преобразование XLS в MXL 10
Конвертация таблиц из Excel в MXL - скачать Converter Excel v MXL: Для 8.х - Для 7.7 - // Выбор файла Microsoft Excel Procedure FileNameStartChoice(Element, StdProcessing) StdProcessing = False; DialogFile = New FileDialog(FileDialogMode. Выгрузка данных в Excel с установкой разных параметров 9
// Процедура выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel // с указанным именем, используя преобразование данных к типу число и типу строка; Процедура ОсновныеДействияФормыЭкспорт(Кнопка) Попытка Посмотреть все в категории Работа с Microsoft Office и OpenOffice
Необходимость задавать исполняемый код в пользовательском режиме появляется не так уж и редко. Для этого создано множество инструментов - универсальные регламентные задания, консоли кода, динамические подписки на события и т.д. С помощью этих инструментов можно создавать код, содержащий запросы, и хорошо бы иметь возможность вызывать для этих запросов конструктор. Более того, во всем известных "Инструментах разработчика" уже есть решение этой задачи для обычных форм с применением библиотеки регулярных выражений (внешней библиотеки, подключаемой как COM-объект).
Мы же рассмотрим решение исключительно средствами 1С, которое вы сможете легко встраивать в свои формы, и которое будет подходить как для обычной, так и для управляемой формы (в толстом клиенте). Следующая иллюстрация показывает, чего мы хотим добиться от нашего алгоритма:
То есть нам необходимо получить возможность работать с запросами в коде аналогичную той, что дает Конфигуратор - открывать существующий запрос, изменять его, и затем возвращать измененный запрос в код на языке 1С с форматированием и сохранением позиции курсора. Эта задача сложна лишь потому, что у поля тестового документа 1С мало методов для работы с текстом и их придется "изобретать" самостоятельно.
Сначала опишем алгоритм на человеческом языке, а затем перейдем к реализации алгоритма на языке платформы.
Нам нужно:
1) Определить позицию курсора в поле текстового документа на форме.
2) Извлечь текст до курсора и после курсора.
3) В тексте, расположенном до курсора, найти открывающую запрос кавычку. В тексте расположенном после курсора найти первую несдвоенную кавычку от начала строки, это будет закрывающая кавычка.
4) Отделить текст запроса, расположенный между открывающей и закрывающей кавычками. А также выделить код, расположенный до начала запроса и после него.
5) Преобразовать код запроса таким образом, чтобы он нормально воспринимался конструктором запроса. Вместо двойных кавычек подставить одинарные, убрать символы вертикальной черты. После чего передать полученный текст в конструктор.
6) После закрытия конструктора сделать обратное преобразование полученного из него кода запроса. Добавить отступы и привести его к виду, который будет нормально воспринят интерпретатором языка 1С.
7) Соединить новый код запроса с текстом, который раньше располагался до и после текста запроса. Загрузить полученный код в поле формы и восстановить позицию курсора.
Теперь перейдем к поэтапной реализации этого алгоритма на языке 1С. Для демонстрации выберем обычную форму. Для управляемой формы код будет отличаться всего несколькими строками, и он также есть в прикрепленном к этой публикации файле. Пусть поле текстового документа на нашей форме имеет имя "Поле".
1) Упростим процесс кодирования введением дополнительных переменных и определим текущую позицию курсора. Позицию курсора запишем в переменные НачалоСтроки и НачалоКолонки. Значение переменной НачалоСтроки в ходе алгорима менять не будем. Оно понадобится в конце для восстановления позиции курсора:
//БЛОК №1 - ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ
ЭлементПоля = ЭлементыФормы . Поле ;
Кавычка = """" ;
ДвойнаяКавычка = """""" ;
ЗаменаДляДвойнойКавычки = Строка (Новый УникальныйИдентификатор );
КоличествоСтрок = ЭлементПоля . КоличествоСтрок ();
НачалоСтроки = 0 ;
НачалоКолонки = 0 ;
КонецСтроки = 0 ;
КонецКолонки = 0 ;
ЭлементПоля . ПолучитьГраницыВыделения ( НачалоСтроки , НачалоКолонки , КонецСтроки , КонецКолонки );
ЭлементПоля . УстановитьГраницыВыделения ( НачалоСтроки , НачалоКолонки , Началостроки , НачалоКолонки );
2) Определим текст, расположенный до курсора и после него. Для этого поле текстового документа дает нам только одну возможность - устанавливать границы выделения и получать выделенный текст. Далее нам придется искать открывающую и закрывающую запрос кавычку. Сильной помехой в этом могут оказаться двойные кавычки. Чтобы избежать лишнего кода по обработке двойных кавычек используем следующий прием. Временно заменим все двойные кавычки на уникальную строку. Обратную замену будем проводить в конце алгоритма, при получении нового кода:
//БЛОК №2 - ОПРЕДЕЛЕНИЕ ТЕКСТА ДО КУРСОРА И ПОСЛЕ КУРСОРА
ЭлементПоля . УстановитьГраницыВыделения ( 1 , 1 , Началостроки , НачалоКолонки );
ТекстДоКурсора = ЭлементПоля . ВыделенныйТекст ;
ЭлементПоля . УстановитьГраницыВыделения ( НачалоСтроки , НачалоКолонки , КоличествоСтрок + 1 , 1 );
ТекстПослеКурсора = ЭлементПоля . ВыделенныйТекст ;
ЭлементПоля . УстановитьГраницыВыделения ( НачалоСтроки , НачалоКолонки , Началостроки , НачалоКолонки );
//гарантируем отсутствие в тексте двойных кавычек
ТекстДоКурсора = СтрЗаменить ( ТекстДоКурсора , ДвойнаяКавычка , ЗаменаДляДвойнойКавычки );
//в тексте после курсора необходимо оставить первую кавычку, если сразу после нее идет двойная
//случай подряд идущих кавычек в количестве более 5-ти штук обрабатывать не будем
ТекстПослеКурсора = СтрЗаменить ( Лев ( ТекстПослеКурсора , 1 ) +
СтрЗаменить ( Сред ( ТекстПослеКурсора , 2 ), ДвойнаяКавычка , ЗаменаДляДвойнойКавычки ), ДвойнаяКавычка , ЗаменаДляДвойнойКавычки ) ;
3) Двигаясь по строке кода, расположенного до курсора, находим открывающую запрос кавычку. Поскольку мы избавились от двойных кавычек, то найти ее несложно. Нужно просто найти кавычку, которая не была закрыта следующей за ней. Правда, нужно учитывать, что кавычки в комментариях надо пропустить, перемещаясь сразу к концу строки, а также то, что курсор сам мог находиться внутри двойной кавычки в строке запроса:
//БЛОК №3 - ИЩЕМ ПОЗИЦИЮ ОТКРВАЮЩЕЙ И ЗАКРЫВАЮЩЕЙ КАВЫЧКИ ДЛЯ СТРОКИ ЗАПРОСА
ПозицияОткрывающейКавычки = 0 ;
ПозицияЗакрывающейКавычки = 0 ;
ВСтроке = Ложь;
КавычкиЕсть = Ложь;
ПозицияПредыдущейКавычки = 0 ;
ПоизцияПоследнейКавычки = 0 ;
Позиция = 1 ;
ДлинаТекстаДоКурсора = СтрДлина ( ТекстДоКурсора );
//ИЩЕМ ОТКРЫВАЮЩУЮ КАВЫЧКУ
Пока Позиция < = ДлинаТекстаДоКурсора Цикл
ТекущийСимвол = Сред ( ТекстДоКурсора , Позиция , 1 );
ПредыдущийСимвол = " " ;
Если Позиция > 1 Тогда
ПредыдущийСимвол = Сред ( ТекстДоКурсора , Позиция - 1 , 1 );
КонецЕсли;
Если ТекущийСимвол = Кавычка Тогда
ВСтроке = НЕ ВСтроке ;
ПозицияПредыдущейКавычки = ПоизцияПоследнейКавычки ;
ПоизцияПоследнейКавычки = Позиция ;
КавычкиЕсть = Истина;
КонецЕсли;
//Обработка комментария - начало
Если НЕ ВСтроке И ПредыдущийСимвол = "/" И ТекущийСимвол = "/" Тогда
//это комментарий, пропускаем символы до конца строки
Пока ТекущийСимвол <> Символы . LF И ТекущийСимвол <> Символы . CR Цикл
Позиция = Позиция + 1 ;
Если Позиция > ДлинаТекстаДоКурсора Тогда
Прервать;
КонецЕсли;
ТекущийСимвол = Сред ( ТекстДоКурсора , Позиция , 1 );
КонецЦикла;
Продолжить;
КонецЕсли;
//Обработка комментария - конец
Позиция = Позиция + 1 ;
КонецЦикла;
//ОСОБЫМ ОБРАЗОМ ОБРАБОТАЕМ СЛУЧАЙ НАХОЖДЕНИЯ КУРСОРА В
//ДВОЙНОЙ КАВЫЧКЕ ВНУТРИ СТРОКИ ЗАПРОСА
Если НЕ ВСтроке И КавычкиЕсть И СтрДлина ( ТекстПослеКурсора ) > 0 Тогда
Если Сред ( ТекстДоКурсора , ДлинаТекстаДоКурсора , 1 ) = Кавычка И Лев ( ТекстПослеКурсора , 1 ) = Кавычка Тогда
ВСтроке = Истина;
ПоизцияПоследнейКавычки = ПозицияПредыдущейКавычки ;
ТекстДоКурсора = Лев ( ТекстДоКурсора , ДлинаТекстаДоКурсора - 1 );
ТекстПослеКурсора = ЗаменаДляДвойнойКавычки + Сред ( ТекстПослеКурсора , 2 );
КонецЕсли;
КонецЕсли;
//ЕСЛИ НАШИЛИ ОТКРЫВАЮЩУЮ КАВЫЧКУ, ТО ИЩЕМ ЗАКРЫВАЮЩУЮ
Если ВСтроке Тогда
ПозицияОткрывающейКавычки = ПоизцияПоследнейКавычки ;
ПозицияЗакрывающейКавычки = Найти ( ТекстПослеКурсора , Кавычка );
КонецЕсли;
4) Теперь можно выделить код между кавычками (запрос) и код расположенный до и после запроса. Чтобы текст запроса был воспринят конструктором его необходимо преобразовать, убрав из начала каждой его строки вертикальную черту:
//БЛОК №4 - ОПРЕДЕЛЯЕМ ТЕКСТ ДО ЗАПРОСА, ТЕКСТ ЗАПРОСА И ТЕКСТ ПОСЛЕ ЗАПРОСА
//ПОСЛЕ ЧЕГО ВОЗРАЩАЕМ ДВОЙНЫЕ КАВЫЧКИ В КОД, НЕ ЯВЛЯЮЩИЙСЯ ЧАСТЬЮ ЗАПРОСА
Конструктор = Новый( "КонструкторЗапроса" );
ГраницыЗапросаНайдены = ПозицияОткрывающейКавычки <> 0 И ПозицияЗакрывающейКавычки <> 0 ;
ТекстДоНачалаЗапроса = Лев ( ТекстДоКурсора , ПозицияОткрывающейКавычки );
ТекстПослеКонцаЗапроса = Сред ( ТекстПослеКурсора , ПозицияЗакрывающейКавычки );
ТекстЗапросаССимвовамиВертикальнойЧерты = Сред ( ТекстДоКурсора , ПозицияОткрывающейКавычки + 1 )
+ Лев ( ТекстПослеКурсора , ПозицияЗакрывающейКавычки - 1 );
//для конструктора запроса вместо двойной кавычки будем подставлять одинарную
ТекстЗапросаССимвовамиВертикальнойЧерты =
СтрЗаменить ( ТекстЗапросаССимвовамиВертикальнойЧерты , ЗаменаДляДвойнойКавычки , Кавычка );
КоличествоСтрокВТексте = СтрЧислоСтрок ( ТекстЗапросаССимвовамиВертикальнойЧерты );
ТекстЗапроса = "" ;
Для К = 1 To КоличествоСтрокВТексте Цикл
СтрокаИзТекстаЗапроса = СокрЛП ( СтрПолучитьСтроку ( ТекстЗапросаССимвовамиВертикальнойЧерты , К ));
Если Лев ( СтрокаИзТекстаЗапроса , 1 ) = "|" Тогда
//для конструктора запроса убираем вертикальную черту в начале строки
СтрокаИзТекстаЗапроса = Сред ( СтрокаИзТекстаЗапроса , 2 );
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + СтрокаИзТекстаЗапроса + Символы . LF ;
КонецЦикла;
Конструктор . Текст = ТекстЗапроса ;
КонецЕсли;
//возвращаем двойные кавычки
ТекстДоНачалаЗапроса = СтрЗаменить ( ТекстДоНачалаЗапроса , ЗаменаДляДвойнойКавычки , ДвойнаяКавычка );
ТекстПослеКонцаЗапроса = СтрЗаменить ( ТекстПослеКонцаЗапроса , ЗаменаДляДвойнойКавычки , ДвойнаяКавычка );
5) Передаем текст запроса в конструктор и, если конструктор отработал успешно, вычисляем отступ, который будем добавлять к строкам запроса. Отступ необходимо добавлять, чтобы код запроса вставился на форму красиво, а не безусловно лепился к левому краю текстового поля:
//БЛОК №5 - ОТКРЫВАЕМ КОНСТРУКТОР ЗАПРОСА С ПОЛУЧЕННОЙ СТРОКОЙ ЗАПРОСА И В СЛУЧАЕ УСПЕШНОГО
//РЕЗУЛЬТАТА ВЫЧИСЛЯЕМ ОТСТУП, КОТОРЫЙ БУДЕМ ДОБАВЛЯТЬ К КАЖДОЙ СТРОКЕ ЗАПРОСА
Если НЕ Конструктор . ОткрытьМодально () Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = Конструктор . Текст ;
Если ПустаяСтрока ( ТекстЗапроса ) Тогда
Возврат;
КонецЕсли;
ДлинаТекстаДоНачалаЗапроса = СтрДлина ( ТекстДоНачалаЗапроса );
Позиция = ДлинаТекстаДоНачалаЗапроса - 1 ;
Пока Позиция >= 1 Цикл
Если Сред ( ТекстДоНачалаЗапроса , Позиция , 1 ) = Символы . LF Тогда
Прервать;
КонецЕсли;
Позиция = Позиция - 1 ;
КонецЦикла;
СтрокаОтступа = Сред ( ТекстДоНачалаЗапроса , Позиция + 1 , ДлинаТекстаДоНачалаЗапроса - Позиция - 1 );
ДлинаСтрокиОтступа = СтрДлина ( СтрокаОтступа );
СтрокаОтступаИзПробеловИТабуляций = "" ;
Для К = 1 To ДлинаСтрокиОтступа Цикл
Если Сред ( СтрокаОтступа , К , 1 ) = Символы . Tab Тогда
СтрокаОтступаИзПробеловИТабуляций = СтрокаОтступаИзПробеловИТабуляций + Символы . Tab ;
Иначе
СтрокаОтступаИзПробеловИТабуляций = СтрокаОтступаИзПробеловИТабуляций + " " ;
КонецЕсли;
КонецЦикла;
6) Теперь у нас есть текст запроса на языке запросов. Нужно преобразовать его в строку на встроенном языке 1С. Добавляем символы вертикальной черты и отступы, преобразуем одинарные кавычки в двойные:
//БЛОК №6 - ОБРАБАТЫВАЕМ РЕЗУЛЬТАТ, ЗАМЕНЯЕМ ОДИНАРНЫЕ КАВЫЧКИ НА ДВОЙНЫЕ,
//ДОБАВЛЯЕМ ОТСТУП И ВЕРТИКАЛЬНУЮ ЧЕРТУ СТРОКАМ ЗАПРОСА НАЧИНАЯ СО ВТОРОЙ
ТекстЗапроса = СтрЗаменить ( ТекстЗапроса , Кавычка , ДвойнаяКавычка );
КоличествоСтрокВТексте = СтрЧислоСтрок ( ТекстЗапроса );
ТекстЗапросаССимвовамиВертикальнойЧерты = СтрПолучитьСтроку ( ТекстЗапроса , 1 );
Для К = 2 To КоличествоСтрокВТексте Цикл
ТекстЗапросаССимвовамиВертикальнойЧерты = ТекстЗапросаССимвовамиВертикальнойЧерты +
Символы . LF + СтрокаОтступаИзПробеловИТабуляций + "|" + СтрПолучитьСтроку ( ТекстЗапроса , К );
КонецЦикла;
7) Задача фактически решена. Склеиваем код, располагавшийся до запроса, новую строку запроса и код, располагавшийся после запроса. Загружаем получившуюся строку в поле формы и восстанавливаем позицию курсора:
//ЗАГРУЖАЕМ НОВЫЙ КОД В ТЕКСТОВОЕ ПОЛЕ И УСТАНАВЛИВАЕМ КУРСОР НА ПРЕЖНЮЮ ПОЗИЦИЮ
ИтоговыйКод = ТекстДоНачалаЗапроса + ТекстЗапросаССимвовамиВертикальнойЧерты + ТекстПослеКонцаЗапроса ;
ЭлементПоля . УстановитьТекст ( ИтоговыйКод );
НоваяКолонка = СтрДлина ( СтрокаОтступаИзПробеловИТабуляций )+ 2 ;
ЭлементПоля . УстановитьГраницыВыделения ( НачалоСтроки , НоваяКолонка , НачалоСтроки , НоваяКолонка );
ЭтаФорма . ТекущийЭлемент = ЭлементПоля ;
Для применения этого метода в своих разработках вам достаточно заменить в коде имя одного элемента формы - поля текстового документа.
К публикации прилагается обработка с реализацией этого алгоритма, в которой есть обычная и управляемая форма. Обработка предназначена для работы в толстом клиенте управляемого или обычного приложения. При работе с управляемой формой есть незначительные отличия в коде. Например, восстанавливать положение курсора приходится через отложенный вызов процедуры, через обработчик ожидания.
Алгоритм был создан с целью применения в новой версии универсальной подсистемы Динамические подписки на события v.3 . Не проходите мимо этой разработки, она может облегчить поддержку ваших баз:
В процессе разработки прикладных решений возникает необходимость предоставить пользователю возможность выполнять редактирование текстов с оформлением (далее форматированный документ). В качестве примера такой необходимости можно привести написание писем электронной почты, различных служебных записок или сопроводительных документов.
Для работы с форматированным документом предназначен объект ФорматированныйДокумент, с помощью которого можно выполнять программную обработку документа, и поле вида Поле форматированного документа, который предназначен для интерактивного изменения форматированного документа.
В информационной базе форматированный документ рекомендуется хранить в реквизите типа ХранилищеЗначения, в который помещается объект типа ФорматированныйДокумент.
Для того чтобы предоставить пользователю возможность интерактивного изменения документа, следует выполнить следующие шаги:
- Создать реквизит формы типа ФорматированныйДокумент и установить для него свойство Сохраняемые данные.
- Создать элемент формы типа Поле ввода вида Поле форматированного документа и связать его с ранее созданным реквизитом.
- При чтении данных формы (обработчик ПриЧтенииНаСервере()) загрузить в реквизит формы документ (метод УстановитьHTML()), который необходимо редактировать, предварительно получив его из информационной базы.
- Перед записью данных формы (обработчик ПередЗаписьюНаСервере()) получить результат (метод ПолучитьHTML()) редактирования документа и поместить его в реквизит, сохраняемый в информационной базе.
В процессе работы с документом можно использовать закладки. Закладка описывает положение некоторого символа в документе. При определении положения нужно учитывать следующие особенности:
- содержимое документа считается одной последовательностью символов;
- перенос строки считается одним символом;
- картинка считается одним символом.
Если положение символа, с которым связана закладка, изменится, то закладка будет отслеживать положение связанного символа. Если удаляется символ, с которым связана закладка, то закладка пытается привязаться к следующему символу, а если этого символа нет ‑ закладка будет указывать на конец документа. Если заменить целиком весь форматированный документ, то все закладки в этом документе станут невалидными.
С помощью закладок можно получать и устанавливать выделение или позицию курсора в редакторе, добавлять и удалять элементы текста в документе (собственно текст, картинка, перевод строки).
Если при получении выделения позиция начала и позиция окончания совпадают, это значит, что выделение отсутствует и получено положение курсора. Так же и при установке выделения: если начальная и конечная позиция выделения совпадают, происходит изменение позиции курсора, без выделения. При программном изменении текста собственно отображение выделения в поле форматированного документа не изменится. Если перед изменением текста выполнялось получение границ выделения, то после изменения текста, закладки могут изменить свою позицию, сохранив при этом свое положение. Другими словами, если вставка происходила внутрь выделения, то позиция закладки, описывающей окончание выделения, увеличится на размер вставленного текста и т. д.
Приведем пример получения и установки выделения в редакторе форматированного документа.
При выполнении операций удаления закладка, описывающая начало удаляемого фрагмента, может оказаться некорректной. Если при этом необходимо сохранить позицию начала удаляемого фрагмента, то следует воспользоваться позицией начала фрагмента. Так, пример замены выделенного текста другим текстом будет выглядеть следующим образом.
Если в форматированном документе присутствуют гиперссылки и форматированный документ отображается в режиме Только просмотр, то гиперссылки доступны для перехода. Переход выполняется в новом окне веб-браузера.
Также имеется возможность программного доступа к тексту форматированного документа. Сам текст состоит из объектов типа ПараграфФорматированногоДокумента, который доступен через свойство Элементы объекта ФорматированныйДокумент. При этом каждый параграф состоит из объектов типа
- ТекстФорматированногоДокумента,
- ПереводСтрокиФорматированногоДокумента
- КартинкаФорматированногоДокумента (элементы форматированного документа).
Доступ к этой коллекции обеспечивается через свойство Элементы объекта ПараграфФорматированногоДокумента. Границей элемента не обязательно является граница слова.
Например, следующий пример показывает перебор всех параграфов форматированного документа, содержащих текст, и отдельную обработку каждого параграфа.
Обработка элементов форматированного документа, входящего в состав параграфа, может оказаться полезной в том случае, если нужно, например, убрать все оформление в виде курсива или полужирного шрифта.
При программной работе с текстом также могут помочь методы ПолучитьЭлементы() и СформироватьЭлементы(). Эти методы возвращают массив элементов форматированного документа. Чтобы увидеть разницу в работе этих методов, рассмотрим пример форматированного документа, содержащего следующую строку: 012 456 890. Строка состоит из 11 символов, где на месте символов 4 и 8 расположены пробелы. Необходимо получить элементы, которые расположены между позициями 2 и 9 этого документа.
Разница в работе этих методов будет в том, что метод ПолучитьЭлементы() возвращает все элементы, которые попадают между заданными закладками (включая все граничные элементы), т. е. рассматриваемом примере будет выведен следующий текст:
Другими словами, при использовании метода СформироватьЭлементы() система формирует набор элементов таким образом, чтобы он включал в себя только то содержимое форматированного документа, которое ограничено закладками.
Такой результат будет даже в том случае, если полученный, после вызова СформироватьЭлементы(), набор элементов никак не изменялся.
Читайте также: