gifts2017

Запрос 1С возвращает не то, что вы ожидали? Тогда вам сюда!

Опубликовал Валерий Гайдабура (director04) в раздел Программирование - Практика программирования

В своей работе мне постоянно приходится работать с запросами сложной, многоуровневой структуры.
Поиск ошибок запроса превращается в сложную задачу. Но есть до банального простое и на 110% эффективное решение.

Все самое эффективное всегда лежит на поверхности. Просто его нужно увидеть…

Для решения предлагаю вам в любом серверном модуле разместить вот такую простенькую процедуру. 

// Функция - Получить результат выполнения временной таблицы
//
// Параметры:
// Запрос - Тип Запрос - Запрос, временную таблицу которого необходимо посмотреть
// ИмяВременнойТаблицы - Тип Строка - Например: "ВТ_Исходная"
// Возвращаемое значение:
// -
Функция ПолучитьРезультатВыполненияВременнойТаблицы(Запрос, ИмяВременнойТаблицы) Экспорт
    
    ТекстЗапроса = Запрос.Текст; // После выполнения функции, в рабочий запрос надо вернуть прежний текст запроса
    
    Попытка
        Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы;  // Отладка
        РезультатЗапроса = Запрос.Выполнить().Выгрузить();
        
        Запрос.Текст = ТекстЗапроса;
        
        Возврат РезультатЗапроса;
        
    Исключение
        Запрос.Текст = ТекстЗапроса;
        
        ВызватьИсключение;
    КонецПопытки;
    
КонецФункции 

 

И теперь вы в любое время можете получить результат выполнения любой временной таблицы.  Для этого достаточно в отладчике вычислить выражение:

РезультатЗапроса = МодульОтладки.ПолучитьРезультатВыполненияВременнойТаблицы(Запрос, "ВТ_ИскомаяВременнаяТаблица");

И что самое важное - вам не потребуется снимать с поддержки ни одного модуля, по которому делаете отладку!

 

зы: Публикация поставляется под брендом "Баян". Троллям вход воспрещен... ))))

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Aleksandr Shilov (Magnastrag) 02.09.15 09:10
2. Валерий Гайдабура (director04) 02.09.15 09:35
(1) Magnastrag, Да, аналогичная штукень. Только я передаю не Менеджер временных таблиц (он может быть вообще не определен), а сам запрос.
Ну по ИС я не лазил. Потому выложил то, чем сам уже давно пользуюсь. ....
3. anry mc (AnryMc) 02.09.15 09:45
4. Ярослав Радкевич (WKBAPKA) 02.09.15 10:04
Согласен с автором.
Статья по ссылке предполагает наличие менеджера ВТ, который не всегда обязателен. У автора статьи код более компактнее и универсальние.
director04; +1 Ответить
5. Антонио (Fragster) 02.09.15 10:36
Удобнее всего сделано в Инструментах разработчика http://infostart.ru/public/15126/ , в отладчике говоришь "вычислить выражение" "От(Запрос)" и открывается консоль запросов, в которой можно поэтапно посмотреть все временные таблицы, не нужно знать их имена, можно поменять запрос и т.п. https://youtu.be/QqM8qXGcUVU
6. Валерий Гайдабура (director04) 02.09.15 10:43
(5) Fragster, вполне возможно что вы и правы. Я даже скачивал эту консоль, но, к сожалению, так и не осилил ее.... Очень похожа на кабину летчика.

Используемый мной метод вполне меня устраивает. Потому что я просто иду по коду вместе с отладчиком и просто просматриваю сформированные временные таблицы.
Если кому то это неудобно -то не беда. Будет пользоваться другими инструментами. Я всего лишь предложил один из вариантов.

За ссылку еще раз спасибо.
Designer1C; +1 Ответить 1
7. Канат Джумадылов (Fox-trot) 02.09.15 11:06
(6) director04,
1. Знач Запрос - это для чего? все равно ж Знач не будет работать
2. Запрос.Текст = ТекстЗапроса; - а это тогда зачем? если уже пытались указать Знач
вроде и код не многословный, но и не краткий
8. Валерий Гайдабура (director04) 02.09.15 11:33
(7) Fox-trot,
1. Знач Запрос - это для чего? все равно ж Знач не будет работать
2. Запрос.Текст = ТекстЗапроса; - а это тогда зачем? если уже пытались указать Знач
вроде и код не многословный, но и не краткий


"Знач" и не работает )))) - скорее дань привычке. Можете удалить его.
Потому и нужна строка 2. Запрос.Текст = ТекстЗапроса;
Именно эта строка возвращает "на место" текст исходного запроса, временно измененный нами (в данной функции)
9. Пишу код как картины (yurii_host) 02.09.15 12:42
Можно не дорабатывать конфигурацию и поместить эту функцию во внешнюю обработку. Тогда вызов будет следующий
ВнешниеОбработки.Создать("путь_к_обработке", Ложь).ПолучитьРезультатВыполненияВременнойТаблицы(Запрос, "ИмяВременнойТаблицы")
k4rimov; iodine; maldinitaly; klinval; Designer1C; +5 Ответить
10. Игорь Фелькер (Brawler) 02.09.15 19:26
Вставлю и свои 5 копеек ко всему прочему.
Нужно обязательно обработать возможные ошибки!
Например можно во время отладки косякнуть и неправильно написать имя временной таблицы, в итоге вывалится ошибка, текст запроса изначального будет утрачен, дальше программа нормально не выполнится

// Функция - Получить результат выполнения временной таблицы
//
// Параметры:
//  Запрос               - Тип  Запрос - Запрос, временную таблицу которого необходимо посмотреть
//  ИмяВременнойТаблицы  - Тип  Строка - Например: "ВТ_Исходная"
// Возвращаемое значение:
//   -
Функция ПолучитьРезультатВыполненияВременнойТаблицы(Знач Запрос, ИмяВременнойТаблицы) Экспорт
	
	ТекстЗапроса = Запрос.Текст; // После выполнения функции, в рабочий запрос надо вернуть прежний текст запроса
	
	Попытка
		Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы;  // Отладка
		РезультатЗапроса = Запрос.Выполнить().Выгрузить();
		
		Запрос.Текст = ТекстЗапроса;
		
		Возврат РезультатЗапроса;
		
	Исключение
		Запрос.Текст = ТекстЗапроса;
		
		ВызватьИсключение;
	КонецПопытки;
	
КонецФункции
...Показать Скрыть
director04; +1 Ответить 2
11. Валерий Гайдабура (director04) 03.09.15 06:54
(10) Brawler, Да, спасибо, дельное дополнение.
12. Валерий Гайдабура (director04) 03.09.15 07:49
(10) Brawler, с вашего позволения выложу именно ваш вариант. Действительно ценное дополнение.
13. Игорь Фелькер (Brawler) 03.09.15 07:58
14. Игорь Макаренко (Kashemir) 04.09.15 13:16
Возможно будет полезно - используемые временные таблицы извлекаются автоматически, путем анализа текста сообщения об ошибке
http://infostart.ru/public/78001/

Избавляет от кучи головняка при работе с теми же зарплатными запросами с тысячью и одной временной таблицей :)
15. Владимир Чаклин (vec435) 14.09.15 09:21
(14) Kashemir, присоединяюсь: лучше распарсить текст запроса
16. Александр Хомяк (logarifm) 15.09.15 08:18
Я для таких вещей ведусвой блог и вот аналог того что вы сюда написали, прям не знаю, что и думать...

ВЫВОД РЕЗУЛЬТАТА МЕНЕДЖЕРА ВРЕМЕННЫХ ТАБЛИЦ В ТАБЛИЦУ ЗНАЧЕНИЙ (ОТЛАДКА ДАННЫХ МВТ)
Иногда предстоит отлаживать запросы которые содержат менеджеры временных таблиц. И чтобы увидеть результат менеджера необходим еще один запрос к этому менеджеру. Пример функции которая выводит результат менеджера в таблицу значений:

Функция ВывестиРезультатМенеджераВременныхТаблиц(МенеджерВременныхТаблиц, ИмяТаблицы) Экспорт

    //Получаем таблицу из менеджера временных таблиц запроса
    Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ "+ИмяТаблицы);
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
...Показать Скрыть


ВЫВОД ДОПОЛНИТЕЛЬНЫХ ПОЛЕЙ МВТ.
Подобная функция, только в третий параметр передаются дополнительные поля. При необходимости увидеть для целей отладки какой-то реквизит после точки.
В параметр ДополнительныеПоля передаем например "Номенклатура.Поставщик, Номенклатура.Менеджер" и т.д.

Функция ВывестиРезультатМенеджераВременныхТаблиц(МенеджерВременныхТаблиц, ИмяТаблицы, ДополнительныеПоля="") Экспорт

    //Получаем таблицу из менеджера временных таблиц запроса
    Запрос = Новый Запрос("ВЫБРАТЬ *"+?(Не ПустаяСтрока(ДополнительныеПоля), ", "+ДополнительныеПоля, "")+" ИЗ "+ИмяТаблицы);
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
...Показать Скрыть
17. Валерий Гайдабура (director04) 15.09.15 12:47
(16) logarifm, ну что же сказать по данному поводу: в истории не мало случаев когда разные люди изобретают один и тот-же велосипед. Поэтому я и написал, что это возможно "баян". Так как способ лежит на поверхности.
Выложил лишь по той причине, чтоб кому либо облегчить труд (кто еще сам не придумал этого). Так как ранее постоянно мучался при отладке сложных запросов.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа