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

02.09.15

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

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

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

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

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

 

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

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

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

 

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

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

См. также

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Для группировки данных в языке запросов 1С существуют конструкции СГРУППИРОВАТЬ ПО [ГРУППИРУЮЩИМ НАБОРАМ], ИТОГИ ПО [ОБЩИЕ]. Для новичков назначение этих конструкций не всегда очевидно, попробуем разобраться на примерах, для чего предназначена каждая из них и в чем отличие от аналогичных конструкций в языке SQL.

19.09.2019    119492    sertak    17    

103

Запросы Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Один запрос, который довольно часто пригождался.

05.09.2019    31191    json    43    

112

Запросы Программист Платформа 1С v8.3 Абонемент ($m)

Если Вам часто приходится просматривать в отладчике сложные пакетные запросы с большим количеством временных таблиц, то эта статья для Вас.

1 стартмани

27.08.2019    24107    ids79    25    

133

Запросы Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Алгоритм формирования контрольной цифры штрих-кода EAN-13 с помощью запроса 1С:Предприятия

24.08.2019    7566    vadver    5    

25

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    36106    7    m-rv    92    

21

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

В этой статье приведен пример неочевидной "оптимизации" запроса, которая противоречит всем правилам, описанным в книгах для подготовки к сертификации "1С:Эксперт по технологическим вопросам", а также преподаваемым на курсах подготовки экспертов.

02.07.2019    16839    igordynets    120    

63

Запросы Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Правила запроса, которые описаны в книге "Настольная книга 1С:Эксперта по технологическим вопросам". Актуальность темы связана с тем, что современные программисты не очень любят читать и даже не знакомы с этими рекомендациями.

17.06.2019    21525    Lucifer93    70    

91

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

Другие статьи на эту тему объясняют, что такое план выполнения запроса, но не рассказывают о том, как его получить. Эта заметка призвана заполнить этот пробел. Её цель - популяризировать общедоступные инструменты получения плана запроса среди разработчиков, которые ещё не начали их использовать.

10.06.2019    12281    DataReducer    12    

54
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Magnastrag 02.09.15 09:10 Сейчас в теме
2. director04 3663 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 1154 02.09.15 10:36 Сейчас в теме
Удобнее всего сделано в Инструментах разработчика http://infostart.ru/public/15126/ , в отладчике говоришь "вычислить выражение" "От(Запрос)" и открывается консоль запросов, в которой можно поэтапно посмотреть все временные таблицы, не нужно знать их имена, можно поменять запрос и т.п. https://youtu.be/QqM8qXGcUVU
6. director04 3663 02.09.15 10:43 Сейчас в теме
(5) Fragster, вполне возможно что вы и правы. Я даже скачивал эту консоль, но, к сожалению, так и не осилил ее.... Очень похожа на кабину летчика.

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

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


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

// Функция - Получить результат выполнения временной таблицы
//
// Параметры:
//  Запрос               - Тип  Запрос - Запрос, временную таблицу которого необходимо посмотреть
//  ИмяВременнойТаблицы  - Тип  Строка - Например: "ВТ_Исходная"
// Возвращаемое значение:
//   -
Функция ПолучитьРезультатВыполненияВременнойТаблицы(Знач Запрос, ИмяВременнойТаблицы) Экспорт
	
	ТекстЗапроса = Запрос.Текст; // После выполнения функции, в рабочий запрос надо вернуть прежний текст запроса
	
	Попытка
		Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы;  // Отладка
		РезультатЗапроса = Запрос.Выполнить().Выгрузить();
		
		Запрос.Текст = ТекстЗапроса;
		
		Возврат РезультатЗапроса;
		
	Исключение
		Запрос.Текст = ТекстЗапроса;
		
		ВызватьИсключение;
	КонецПопытки;
	
КонецФункции
Показать
director04; +1 Ответить
11. director04 3663 03.09.15 06:54 Сейчас в теме
(10) Brawler, Да, спасибо, дельное дополнение.
12. director04 3663 03.09.15 07:49 Сейчас в теме
(10) Brawler, с вашего позволения выложу именно ваш вариант. Действительно ценное дополнение.
13. Brawler 461 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 1126 15.09.15 08:18 Сейчас в теме
Я для таких вещей ведусвой блог и вот аналог того что вы сюда написали, прям не знаю, что и думать...

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

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

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

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


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

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

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

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