Временные таблицы, отбор по нескольким составным ключам в запросе.

19.05.10

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

Иногда возникает потребность отбора в запросе по составному ключу – типа партия, серия, номенклатура – при одном значении ключа проблем нет, а вот когда значений ключа несколько возникает проблема

Иногда возникает потребность отбора по составному ключу - типа партия, серия, номенклатура - при одном значении ключа проблем нет, просто в запросе ставим условие партия =... и серия =... и номенклатура=..., а вот когда значений ключа несколько возникает проблема. Например имеется таблица значений с набором таких ключей. Один из вариантов динамически сгенерировать запрос через «или» - но и запрос может вырасти до огромных размеров и параметров немеряно... некрасиво. Для решения задачи можно воспользоваться Временными таблицами, вдобавок там источниками данных может быть таблица значений. Ниже пример: нужно найти в каких документах фигурировали партии из таблицы значений позднее определенной даты(на практике смотрим фигурировали ли партии в документах позднее текущего...)

Упс - таблица значений с полями: Номенклатура, ДокументОприходования, Серия

МенеджерВТ   =Новый МенеджерВременныхТаблиц;
               
Запрос =Новый Запрос;

               
Запрос.МенеджерВременныхТаблиц              =МенеджерВТ;
               
Запрос.Текст    =" Выбрать ДокументОприходования, Серия, Номенклатура
                |Поместить ВТ
                |Из &ТаблЗнач Как ТаблЗнач
                |;
                |ВЫБРАТЬ
                |ПартииОтветХранНаСкладахОбороты.Регистратор,
                |ПРЕДСТАВЛЕНИЕ(ПартииОтветХранНаСкладахОбороты.Регистратор)
                |ИЗ
                |ВТ КАК ВТ
                |ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииОтветХранНаСкладах.Обороты(&ДатаНач, , Регистратор, ) КАК ПартииОтветХранНаСкладахОбороты
                |ПО ВТ.Номенклатура = ПартииОтветХранНаСкладахОбороты.Номенклатура
                |И ВТ.ДокументОприходования = ПартииОтветХранНаСкладахОбороты.ДокументОприходования
                |И ВТ.Серия = ПартииОтветХранНаСкладахОбороты.Серия"
;

                              
Запрос.УстановитьПараметр("ТаблЗнач",Упс);
                              
Запрос.УстановитьПараметр("ДатаНач", Дата);
                              
тз            =Запрос.Выполнить().Выгрузить();
МенеджерВТ   =Неопределено;

1.Создаем менеджер временных таблиц
2.Создаем новый запрос (здесь пакет запросов)
3.Первым запросом помещаем во временную таблицу таблицу значений
4.Вторым запросом делаем выборку из регистра установив условия связи.
5.На выходе получаем результат запроса.

Подробно о временных таблицах можно почитать в дополнении к описанию в каталоге Readme или AddDoc программы

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

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

16500 руб.

02.09.2020    242875    1325    419    

1118

Инструментарий разработчика Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.

1 стартмани

16.05.2025    9264    129    zup_dev    30    

82

Инструментарий разработчика Запросы Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)

В данной публикации рассказывается о решении, которое позволяет находить сразу все ошибки в тексте запроса за раз, а не только самую первую.

2 стартмани

05.03.2025    5687    19    XilDen    12    

29

Обновление 1С Запросы Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)

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

3 стартмани

06.02.2025    5086    30    XilDen    26    

42

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

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    11432    artemusII    11    

27

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

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

18.10.2024    21136    sergey279    18    

74

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

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

11.10.2024    15941    XilDen    38    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. e.kogan 1904 29.04.10 17:04 Сейчас в теме
Вообще-то составной ключ возможен и в виде "(ДокументОприходования,Серия,Номенклатура) В (Выбрать ДокументОприходования, Серия, Номенклатура ИЗ ВТ))". Причём сразу в параметрах виртуальной таблицы.

Что это, Бэрримор? Статья? Нет. Овсянка, сэр.

Скучно. Очевидно. Плохо оформлено.
2. DoctorRoza 30.04.10 12:10 Сейчас в теме
ИМХО .. использование вложенного запроса не так наглядно, как применение временных таблиц и пакетного запроса. Конечно, что лучше .. покажет опытный эксперимент на быстродействие того или иного вида запроса!
P.s. Приведенный пример хорош и нагляден для начинающих программистов, поэтому, за то, что можно поучиться и .. чайникам .. плюсану! ;)
3. Ivon 676 05.05.10 09:56 Сейчас в теме
(2). Запрос с вложенными запросами выполняется быстрее, чем запрос с временными таблицами. Это факт. На 2-х временных таблицах не заметно, а когда результат содержит 1000 строк по 20 колонок и используется 15 временных таблиц - заметно очень сильно.
4. Ivon 676 05.05.10 09:57 Сейчас в теме
Автору:
Правильно будет
МенеджерВТ.Закрыть();

И еще, в данном примере менеджер временных таблиц абсолютно не нужен. Для проверки можешь закомментировать строки, с ним связанные и увидишь, что все отработает. МВТ нужен для передачи временных таблиц между разными запросами. Хорошо использовать МВТ для организации расшифровок в отчетах, чтобы не выбирать данные повторно.
Smert-nik; A_kryl; artmicro; Spitfire; +4 Ответить
5. A_kryl 162 18.05.10 13:57 Сейчас в теме
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=539689#539689
если комуто интересно - мнение 1С по использованию вложенных запросов и временных таблиц
Для отправки сообщения требуется регистрация/авторизация