В Парсере запросов, точнее функции VLF есть весьма оригинальный глюк. Вопрос задаю на случай, может кто что подскажет.
Если VLF() вызывается в любом модуле, например,
Запрос.Текст = "******";
Запрос.Выполнить();
СтруктураРезультат = VLF(Запрос);
то в СтруктураРезультата находится нормальный ответ.
Если VLF(Запрос) вызывается в табло ( а так отладить код по шагам нельзя), то появляется очень оригинальный глюк.
Запрос +
--- Объединение +
---- Запа4451213с425232213423+
------ Запр7сс6723ааааа
Подветка "ТекстЗапроса" (смотри далее) вообще не добавляется.
И так до бесконечности, как будто в структуру с ключем "ЗапрУИД" добавляется структура с ключем "ЗапрУИД2" в нее следующая, в нее следующая .... Постоянно генерируется новый УИД.
При выходе релиза 2.10 причина ошибки условно была найдена.
Вложенная структура создается кодом
// До
ВложСтруктура = новый Структура;
ВложСтруктура.Вставить("ТекстЗапроса",ТекстЗапроса);
// в 2.10
ВложСтруктура = новый Структура("ТекстЗапроса",ТекстЗапроса);
Но это заработало только на тестовом примере.
В реальной базе глюк повторяется. Еще раз повторю, ТекстЗапроса даже в 2.10 НЕ ДОБАВЛЯЕТСЯ!
Попытался сделать так
ВложСтруктура = новый Структура;
ВложСтруктура.Вставить("ТекстЗапроса",ТекстЗапроса);
ВложСтруктура.Вставить("Тест",СтрокаТаблицыЗначений);
И тут платформа честно призналась, что это ее глюк
А именно, когда просматриваешь, в табло указывается, что "Тест" - это строка таблицы значений. Как только пытаешься ее просмотреть - она вдруг становится бесконечно вложенной структурой, на очередном ее уровне, тест - строка таблицы значений, при попытке ее просмотреть - становится структурой и т.д.
Характерно, что этот глюк появляется только в ветке "Объединение" и почти всегда. Ветка "Вложенные" формируется этим же фрагментом программного кода, но в ней глюка нет.
Я попытался "Объединение" переименовать в "Я_Объединение" - результата не дало. Попытался именовать ключ не
в виде "Запр + СтрЗаменить(УИД, "-","")", а в виде "Запр + СтрЗаменить(УИД, "-","nnnn")" - результата не принесло, хотя в каждом новом вложении УИД генерируется по алгоритму "Запр + СтрЗаменить(УИД, "-","nnnn")".
НО ! код в ветке "Объединение" в принципе не рекурсивный
Напоследок привожу сам код
Если НомерФункции = 4 Тогда // Разбор и выполнение подзапросов
Для каждого Подзапроса Цикл
Название = "Запр"+СтрЗаменить(Новый УникальныйИдентификатор,"-","");
УпрощенныйТекстЗапроса = ДатьУпрощеныйТекстЗапроса(Подзапрос);
ДекоративныйТекстЗапроса = ДатьДекоративныйТекстЗапроса(Подзапрос);
ВложСтруктура = Новый Структура("ТекстЗапроса",ДекоративныйТекстЗапроса);
Если НЕ ПустаяСтрока(УпрощеныйТекстЗапроса) Тогда
Запрос.Текст = УпрощеныйТекстЗапроса;
Попытка
ТЗ = Запрос.Выполнить().Выгрузить();
ВложСтруктура.Вставить("Результат_Кол_"+
Формат(ТЗ.Колонки.Количество(),"ЧЦ=3; ЧГ=0")+
"_Стр_"+
?(ТЗ.Количество()=100,"более99",Формат(ТЗ.Количество(),"ЧЦ=3; ЧН=Пусто; ЧГ=0")), ТЗ);
Исключение
ВложСтруктура.Вставить("ОшибкаВыполненияЗапроса",ОписаниеОшибки());
ВложСтруктура.Вставить("ФактическиВыполняемыйЗапрос",УпрощеныйТекстЗапроса);
КонецПопытки;
КонецЕсли;
// упрощено для случая - 1 подзапрос:
Если Подзапрос.ТипБлока = _Вложенный Тогда
ТекВеткаСтруктуры.Вставить("Вложенные", Новый Структура(Название,ВложСтруктура));
Библиотека(4,стр,ВложСтруктура,Запрос,***); // вызываем себя
Возврат 0;
ИначеЕсли Подзапрос.ТипБлока = _Объединение Тогда
ТекВеткаСтруктуры.Вставить("Объединение", Новый Структура(Название, ВложСтруктура));
Возврат 0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Показать
Еще раз напоминаю, что весь код при вызове НЕ В ТАБЛО, отрабатывается БЕЗ ОШИБОК. Поэтому прошу не искать ИМЕННО ОШИБОК в коде вверху. Это сильно упрощенный пример, необходимый для демонстрации ЛОГИКИ работы кода.