Получить имена полей из текста запроса
Добрый день.
Стоит задача получать имена полей из текста запроса. Если запрос создавался под текущую конфигурацию - тут просто
Но если запрос нельзя выполнить в текущей конфигурации - способ не работает. Может кто знает универсальный способ?
Стоит задача получать имена полей из текста запроса. Если запрос создавался под текущую конфигурацию - тут просто
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
Колонки = СхемаЗапроса.ПакетЗапросов[0].Колонки;
Но если запрос нельзя выполнить в текущей конфигурации - способ не работает. Может кто знает универсальный способ?
По теме из базы знаний
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(9)
Натолкнули на мысль. Вот если у нас уже есть ВыборкаИзРезультатаЗапроса, но нет самого текста запроса (например внутри какой либо функции или в процедуре общего модуля) то получаем Владельца - РезультатЗапрос, а тут уже коллекция колонок:
<НашаВыборка>.Владелец().Колонки и уже пляшем
Построитель = Новый ПостроительЗапроса(ТекстЗапроса);
Построитель.ЗаполнитьНастройки();
Для Сч=0 по Построитель.ВыбранныеПоля.Количество()-1 Цикл
Поле = Построитель.ВыбранныеПоля[сч];
КонецЦикла;
Построитель.ЗаполнитьНастройки();
Для Сч=0 по Построитель.ВыбранныеПоля.Количество()-1 Цикл
Поле = Построитель.ВыбранныеПоля[сч];
КонецЦикла;
Натолкнули на мысль. Вот если у нас уже есть ВыборкаИзРезультатаЗапроса, но нет самого текста запроса (например внутри какой либо функции или в процедуре общего модуля) то получаем Владельца - РезультатЗапрос, а тут уже коллекция колонок:
<НашаВыборка>.Владелец().Колонки и уже пляшем
(1) да в общем-то простая задачка парсинга.
Имена полей будет в нижнем регистре.
Правда это не универсальное решение. Для простых запросов. Но для понять принципа думаю достаточно.
МассивИменПолей = Новый Массив;
м1 = СтрРазделить(ТекстЗапрос, ";", Ложь);
ТекстЗапроса = м1[м1.ВГраница()];
ТекстЗапроса = НРег(ТекстЗапрос);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"выбрать",";");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"из",";");
м1 = СтрРазделить(ТекстЗапроса, ";",Ложь);
ТекстПолей = м1[0];
м1 = СтрРазделить(ТекстПолей, ",", Ложь);
Для Каждого ТекстПоля Из м1 Цикл
мИмяПоля = СтрРазделить(ТекстПоля, ". ", Ложь);
ИмяПоля = мИмяПоля[мИмяПоля.ВГраница()];
МассивИменПолей.Добавить(ИмяПоля);
КонецЦикла;
ПоказатьИмена полей будет в нижнем регистре.
Правда это не универсальное решение. Для простых запросов. Но для понять принципа думаю достаточно.
(13)Ну не чавчем. Чё там парсить то между "выбрать"(sel ect) и " из" (" fr om")
Заменить переносы строки и табы на пробел, загнать стрРазделить в массив
Обходи себе массив. Главное помнить что алиас может начинаться после " как ", " as " и последнего пробела, а может псевдонима и не быть тогда, если последний символ ")" или "конец" или "end" возвращаем "Поле" с нарастающим индексом.
Ну и на закуску возвращаем поле с заменой точки на пустую строку.
Как бэ все просто
Заменить переносы строки и табы на пробел, загнать стрРазделить в массив
Обходи себе массив. Главное помнить что алиас может начинаться после " как ", " as " и последнего пробела, а может псевдонима и не быть тогда, если последний символ ")" или "конец" или "end" возвращаем "Поле" с нарастающим индексом.
Ну и на закуску возвращаем поле с заменой точки на пустую строку.
Как бэ все просто
Вроде бы всё учёл:
Текст = СтрЗаменить(СтрЗаменить(ТекстЗапроса, Символы.ПС, " "), Символы.Таб, " ");
Пока СтрНайти(Текст, " ") > 0 Цикл
Текст = СтрЗаменить(Текст, " ", " ");
КонецЦикла;
Текст = " " + ВРег(Текст);
ПозицияВыбрать = СтрНайти(Текст, " ВЫБРАТЬ ");
НаборыПолей = Новый Массив;
Пока ПозицияВыбрать > 0 Цикл
ПозицияИЗ = СтрНайти(Текст, " ИЗ ", , ПозицияВыбрать + 9);
Если ПозицияИЗ = 0 Тогда
ПозицияИЗ = СтрДлина(Текст) + 1;
КонецЕсли;
ОбластьПолей = Сред(Текст, ПозицияВыбрать + 9, ПозицияИЗ - ПозицияВыбрать - 9);
// удаляем выражения в скобках, так как они могут содеражть "КАК" и запятые
ПозицияОткрывающейСкобки = СтрНайти(ОбластьПолей, "(");
Пока ПозицияОткрывающейСкобки > 0 Цикл
ПозицияЗакрывающейСкобки = СтрНайти(ОбластьПолей, ")");
ВыражениеВСкобках = Сред(ОбластьПолей, ПозицияОткрывающейСкобки + 1, ПозицияЗакрывающейСкобки - ПозицияОткрывающейСкобки - 1);
Пока СтрЧислоВхождений(ВыражениеВСкобках, "(") <> СтрЧислоВхождений(ВыражениеВСкобках, ")") Цикл
ПозицияЗакрывающейСкобки = СтрНайти(ОбластьПолей, ")", , ПозицияЗакрывающейСкобки + 1);
ВыражениеВСкобках = Сред(ОбластьПолей, ПозицияОткрывающейСкобки + 1, ПозицияЗакрывающейСкобки - ПозицияОткрывающейСкобки - 1);
КонецЦикла;
ОбластьПолей = Лев(ОбластьПолей, ПозицияОткрывающейСкобки - 1) + Сред(ОбластьПолей, ПозицияЗакрывающейСкобки + 1);
ПозицияОткрывающейСкобки = СтрНайти(ОбластьПолей, "(");
КонецЦикла;
ВыраженияПолей = СтрРазделить(ОбластьПолей, ",", Ложь);
МассивПолей = Новый Массив;
НомерБезымянногоПоля = 1;
Для Каждого Выражение Из ВыраженияПолей Цикл
ПозицияКАК = СтрНайти(Выражение, " КАК ", НаправлениеПоиска.СКонца);
Если ПозицияКАК > 0 Тогда
ИмяПоля = Сред(Выражение, ПозицияКАК + 5);
Иначе
ИмяПоля = "Поле" + Формат(НомерБезымянногоПоля, "ЧГ=");
НомерБезымянногоПоля = НомерБезымянногоПоля + 1;
КонецЕсли;
МассивПолей.Добавить(ИмяПоля);
Сообщить(ИмяПоля);
КонецЦикла;
НаборыПолей.Добавить(МассивПолей);
ПозицияВыбрать = СтрНайти(Текст, " ВЫБРАТЬ ", , ПозицияВыбрать + 9);
КонецЦикла;
ПоказатьПрикрепленные файлы:
ПарсерТекстаЗапроса.epf
(17)Попробовал вашу обработку, на объединениях добавляет:
а исходный текст запроса:
ДОКТ
СЧЕТДТ
СЧЕТКТ
Поле1
Поле2
Поле3
..........
.........
.........
СЧЕТДТ
СЧЕТКТ
Поле1
Поле2
Поле3
..........
.........
.........
а исходный текст запроса:
ВЫБРАТЬ
Типовой.Регистратор КАК Докт,
Типовой.СчетДт КАК СчетДт,
Типовой.СчетКт КАК СчетКт
ИЗ
РегистрБухгалтерии.Типовой КАК Типовой
ГДЕ
Типовой.СчетДт В ИЕРАРХИИ(&СчетДт6хх)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Типовой.Регистратор,
Типовой.СчетДт,
Типовой.СчетКт
ИЗ
РегистрБухгалтерии.Типовой КАК Типовой
ГДЕ
Типовой.СчетКт В ИЕРАРХИИ(&СчетДт6хх)
...........................
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)