Оформление (форматирование) текста запроса

14.07.25

Разработка - Инструментарий разработчика

Лично мне намного удобнее читать текст запроса, когда все "КАК" в списке выбираемых полей выровнены в один столбец. Выравнивать вручную - обычно муторно и долго, да и жалко время на это тратить. Потому немного заморочился и автоматизировал это дело.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Оформление (форматирование) текста запроса
.epf 8,50Kb
0 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Обработка форматирует текст запроса - выравнивает слова "КАК" в списке выбираемых полей в одну колонку. На мой взгляд, это значительно повышает комфортность чтения текста запроса.

Обработку можно использовать как отдельный инструмент, а можно код из неё добавить в любимую консоль запросов. Лично я именно так и поступил.

Консоль, которой я пользуюсь, умеет генерировать код для модулей, и тут я столкнулся с таким эффектом: если в выбираемых полях есть строковые литералы, то при создании текста для модуля кавычки в них экранируются добавлением ещё одних кавычек, и форматирование "разъезжается". Чтобы избежать этого, в параметры функции ФорматированныйТекстЗапроса был добавлен параметр УчитыватьКавычки. Если текст запроса форматируется для использования "как есть" (в окне консоли, например) - указываем Ложь (это значение по умолчанию, можно вообще не указывать), и поправка на кавычки не делается. А если делаем форматирование перед созданием тескта для модуля - передаём в этом параметре Истина, и получаем красиво отформатированный текст запроса с экранированными кавычками.

Единственный, на мой взгляд, минус - перед форматированием текст запроса нормализуется при помощи объекта СхемаЗапроса: текст загоняется в схему запроса и выгружается из нее, чтобы получить гарантированно каноническое написание операторов и оформление исходного текста запроса. При этом, естественно, теряются все комментарии.
 

 
// Функция - Форматированный текст запроса
//
// Параметры:
//  ИсходныйТекст - Строка - текст запроса, который необходимо отформатировать
//  УчитыватьКавычки - Булево - при формировании текста для модуля в строке запроса кавычки экранируются, т.е. строки 
//     изменяются. Чтобы форматирование из-за этого не разъезжалось, перед формированием кода модуля следует 
//     отформатировать с параметром УчитыватьКавычки = Истина.
// 
// Возвращаемое значение:
//  Строка - отформатированный текст запроса
//
&НаКлиенте
Функция ФорматированныйТекстЗапроса(ИсходныйТекст, УчитыватьКавычки = Ложь)
	
	Перем ВерхнийИндекс, ГотовыеСтроки, ДлинаСловаВыбрать, ДлинаСловаВыбратьСоСкобкой, ИндексСтроки, ИсходныеСтроки, 
		Результат, СтрокаЗапроса, ТекСтрокаЗапроса;
	
	СтрокаЗапроса = НормированныйТекстЗапроса(ИсходныйТекст);
	ИсходныеСтроки = СтрРазделить(СтрокаЗапроса, Символы.ПС);
	ГотовыеСтроки = Новый Массив;
	ИндексСтроки = 0;
	ВерхнийИндекс = ИсходныеСтроки.ВГраница();
	ДлинаСловаВыбрать = 7;
	ДлинаСловаВыбратьСоСкобкой = 8;
	
	Пока ИндексСтроки <= ВерхнийИндекс Цикл
		
		ТекСтрокаЗапроса = СокрЛП(ИсходныеСтроки[ИндексСтроки]);
		
		Если Лев(ТекСтрокаЗапроса, ДлинаСловаВыбрать) = "ВЫБРАТЬ" Тогда
			
			ОбработатьСписокПолейЗапроса(ГотовыеСтроки, ИсходныеСтроки, ИндексСтроки, ВерхнийИндекс, УчитыватьКавычки);
			
		ИначеЕсли Лев(ТекСтрокаЗапроса, ДлинаСловаВыбратьСоСкобкой) = "(ВЫБРАТЬ" Тогда
			
			ОбработатьСписокПолейВложенногоЗапроса(ГотовыеСтроки, ИсходныеСтроки, ИндексСтроки, ВерхнийИндекс, УчитыватьКавычки);
			
		Иначе
			
			ГотовыеСтроки.Добавить(ИсходныеСтроки[ИндексСтроки]);
			ИндексСтроки = ИндексСтроки + 1;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Результат = СтрСоединить(ГотовыеСтроки, Символы.ПС);
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция НормированныйТекстЗапроса(Знач ИсходныйТекст)
	
	Перем СхемаЭтогоЗапроса, СтрокаЗапроса;
	
	СхемаЭтогоЗапроса = Новый СхемаЗапроса;
	СхемаЭтогоЗапроса.УстановитьТекстЗапроса(ИсходныйТекст);
	СтрокаЗапроса = СхемаЭтогоЗапроса.ПолучитьТекстЗапроса();
	
	Возврат СтрокаЗапроса;
	
КонецФункции // ФорматированныйТекстЗапроса()

&НаКлиенте
Процедура ОбработатьСписокПолейЗапроса(ГотовыеСтроки, ИсходныеСтроки, ИндексСтроки, ВерхнийИндекс, УчитыватьКавычки)
	
	Перем ПерваяСтрока, КонецСпискаПолей, ТекСтрокаЗапроса, ПоследняяСтрока;
	
	ПерваяСтрока = ИндексСтроки;
	КонецСпискаПолей = Ложь;
	
	Пока Не КонецСпискаПолей Цикл
		
		ТекСтрокаЗапроса = СокрЛП(ИсходныеСтроки[ИндексСтроки]);
		КонецСпискаПолей = (ТекСтрокаЗапроса = "ИЗ" 
			Или ТекСтрокаЗапроса = ";" 
			Или ИндексСтроки = ВерхнийИндекс);
		ИндексСтроки = ИндексСтроки + 1;
		
	КонецЦикла;
	
	ПоследняяСтрока = Мин(ИндексСтроки, ВерхнийИндекс);
	ОбработатьБлок(ГотовыеСтроки, ИсходныеСтроки, ПерваяСтрока, ПоследняяСтрока, УчитыватьКавычки);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьСписокПолейВложенногоЗапроса(
	ГотовыеСтроки, 
	ИсходныеСтроки, 
	ИндексСтроки, 
	ВерхнийИндекс, 
	УчитыватьКавычки)
	
	Перем ПерваяСтрока, КонецСпискаПолей, ТекСтрокаЗапроса, ОткрытыхСкобок, ПоследняяСтрока;
	
	ПерваяСтрока = ИндексСтроки;
	КонецСпискаПолей = Ложь;
	ОткрытыхСкобок = 0;
	
	Пока Не КонецСпискаПолей Цикл
		
		ТекСтрокаЗапроса = СокрЛП(ИсходныеСтроки[ИндексСтроки]);
		ОткрытыхСкобок = ОткрытыхСкобок 
			+ СтрЧислоВхождений(ТекСтрокаЗапроса, "(") 
			- СтрЧислоВхождений(ТекСтрокаЗапроса, ")");
		КонецСпискаПолей = ТекСтрокаЗапроса = "ИЗ" Или ОткрытыхСкобок = 0;
		ИндексСтроки = ИндексСтроки + 1;
		
	КонецЦикла;
	
	ПоследняяСтрока = Мин(ВерхнийИндекс, ИндексСтроки);
	ОбработатьБлок(ГотовыеСтроки, ИсходныеСтроки, ПерваяСтрока, ПоследняяСтрока, УчитыватьКавычки);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьБлок(ГотовыеСтроки, ИсходныеСтроки, Начало, Конец, Учитыватькавычки)
	
	Перем ДальнийКАК, ДанныеСтрок, ДанныеСтроки, ИндексСтроки, КоличествоКавычек, КоличествоПробелов, КонецСтрокиПоля, 
		МаксимальноеКоличествоКавычек, НачалоСтрокиПоля, ПозицияКАК, ПозицияСкобки, РезультатДляСтроки, СтрокаПробелов, 
		СтрокаРезультат, ТекСтрока;
	
	// дальний КАК
	ИндексСтроки = Начало;
	ДальнийКАК = 0;
	МаксимальноеКоличествоКавычек = 0;
	ШагТабуляции = 4;
	ЗаменаТабуляции = СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", ШагТабуляции);
	ДанныеСтрок = Новый Соответствие;
	
	Пока ИндексСтроки < Конец Цикл
		
		ТекСтрока = ИсходныеСтроки[ИндексСтроки];
		ТекСтрокаБезТабуляции = СтрЗаменить(ТекСтрока, Символы.Таб, ЗаменаТабуляции);
		ПозицияКАК = СтрНайти(ТекСтрока, " КАК ", НаправлениеПоиска.СКонца);
		ПозицияСкобки = СтрНайти(ТекСтрокаБезТабуляции, ")", НаправлениеПоиска.СКонца);
		СимволовДоКАК = СтрНайти(ТекСтрокаБезТабуляции, " КАК ", НаправлениеПоиска.СКонца);
		РезультатДляСтроки = ?(ПозицияСкобки > СимволовДоКАК, 0, СимволовДоКАК);
		ДальнийКАК = Макс(ДальнийКАК, РезультатДляСтроки);
		КоличествоКавычек = СтрЧислоВхождений(ТекСтрока, """");
		МаксимальноеКоличествоКавычек = Макс(МаксимальноеКоличествоКавычек, КоличествоКавычек);
		ДанныеСтроки = Новый Структура("ПозицияКАК, СимволовДоКАК, КоличествоКавычек", ПозицияКАК, РезультатДляСтроки, КоличествоКавычек);
		ДанныеСтрок.Вставить(ТекСтрока, ДанныеСтроки);
		
		ИндексСтроки = ИндексСтроки + 1;
		
	КонецЦикла;
	
	// форматирование строк
	ИндексСтроки = Начало;
	
	Пока ИндексСтроки < Конец Цикл
		
		ТекСтрока = ИсходныеСтроки[ИндексСтроки];
		ПозицияКАК = ДанныеСтрок[ТекСтрока].ПозицияКАК;
		СимволовДоКАК = ДанныеСтрок[ТекСтрока].СимволовДоКАК;
		КоличествоКавычек = ДанныеСтрок[ТекСтрока].КоличествоКавычек;
		
		Если СимволовДоКАК = 0 Тогда
			
			ГотовыеСтроки.Добавить(ТекСтрока);
			
		Иначе
			
			КоличествоПробелов = ?(УчитыватьКавычки, 
				ДальнийКАК - СимволовДоКАК + МаксимальноеКоличествоКавычек - КоличествоКавычек,
				ДальнийКАК - СимволовДоКАК);
			СтрокаПробелов = СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов(" ", КоличествоПробелов);
			НачалоСтрокиПоля = Лев(ТекСтрока, ПозицияКАК);
			КонецСтрокиПоля = Прав(ТекСтрока, СтрДлина(ТекСтрока) - ПозицияКАК);
			СтрокаРезультат = НачалоСтрокиПоля + СтрокаПробелов + КонецСтрокиПоля;
			ГотовыеСтроки.Добавить(СтрокаРезультат);
			
		КонецЕсли;
		
		ИндексСтроки = ИндексСтроки + 1;
		
	КонецЦикла;
	
КонецПроцедуры

 

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.1.91

Вступайте в нашу телеграмм-группу Инфостарт

Обработка Запрос Текст запроса Схема запроса Форматирование текста Оформление текста

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    198309    1096    410    

1010

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    33687    205    104    

192

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    23133    62    20    

90

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

15000 руб.

10.11.2023    15829    69    39    

85

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    33445    114    50    

158

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    20268    8    32    

44

Инструментарий разработчика Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    106607    249    100    

313
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. zhkonst 14.07.25 14:15 Сейчас в теме
М ещё - если кто подскажет, как программно получить шаг табуляции - буду крайне признателен. Так и не смог найти, поэтому просто захардкодил 4 пробела. Если у кого-то установлен другой шаг - меняйте в коде процедуры ОбработатьБлок.
Оставьте свое сообщение