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

02.09.15

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

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

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

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

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

 

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

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

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

 

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

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

См. также

SALE! 20%

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122170    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5746    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6285    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16186    skovpin_sa    14    

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

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

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


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

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

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

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

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

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

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


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

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

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

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