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