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

02.09.15

Разработка - Запросы

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

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

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

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

 

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

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

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

 

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

Поиск ошибок запроса временные таблицы

См. также

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

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169274    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11394    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9068    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

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

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

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

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

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


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

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

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

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

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

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

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


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

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

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

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