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

14.07.25

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

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

Файлы

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

Наименование Скачано Купить файл
Оформление (форматирование) текста запроса
.epf 8,50Kb
3 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    208632    1143    413    

1039

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

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

8400 руб.

20.08.2024    38221    215    111    

203

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

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

16000 руб.

10.11.2023    17566    75    39    

92

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

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    25198    65    30    

95

Инструментарий разработчика Программист 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

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

9500 руб.

17.05.2024    36198    131    53    

175

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

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше.<br/> Далее в публикации:<br/> MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

9900 руб.

25.08.2025    1398    4    7    

10

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    3208    7    0    

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