|
Соединение с виртуальными таблицами в запросе | ☑ | ||
---|---|---|---|---|
0
yuran9393
26.11.24
✎
17:44
|
Добрый день!
Есть запрос: ВЫБРАТЬ Контрагенты_Свойства.Руководитель КАК Руководитель, Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух ИЗ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Контрагенты_Характеристики.СрезПоследних КАК Контрагенты_ХарактеристикиСрезПоследних ПО Контрагенты_Свойства.Владелец = Контрагенты_ХарактеристикиСрезПоследних.Контрагент ГДЕ Контрагенты_Свойства.Владелец = &Контрагент И Контрагенты_Свойства.ПометкаУдаления = ЛОЖЬ подскажите как в данном запросе правильно исправить ошибку "Не следует использовать соединения с виртуальными таблицами"? или где можно почитать доп инфу? |
1 2 4 7 |
||
1
osa1C
26.11.24
✎
17:58
|
(0) Данные виртуальной таблицы поместить во временную и проиндексировать по полям соединения
|
|||
2
Мультук
гуру
26.11.24
✎
17:59
|
(0)
1) В твоем запросе ты говоришь: -- 1С сделай мне срез последних по ВСЕМ контрагентам. Да, мне нужен только один, а ты 1С выберешь 1 МЛН записей, но что делать сервер должен страдать Гораздо продуктивнее получит срез последних СРАЗУ вводя отборы. 2) Ошибку выдаёт какой-нибудь Fresh ? Возможно он хочет чтобы ты ко всему прочему, завернул результат среза последних во временную таблицу ВЫБРАТЬ Контрагенты_Свойства.Руководитель КАК Руководитель, Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух ИЗ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Контрагенты_Характеристики.СрезПоследних(, Контрагент = &Контрагент) КАК Контрагенты_ХарактеристикиСрезПоследних ПО Контрагенты_Свойства.Владелец = Контрагенты_ХарактеристикиСрезПоследних.Контрагент ГДЕ Контрагенты_Свойства.Владелец = &Контрагент И Контрагенты_Свойства.ПометкаУдаления = ЛОЖЬ |
|||
3
yuran9393
26.11.24
✎
18:07
|
Ошибку выдает сонар, с пояснением:
При написании запросов не следует использовать соединения с виртуальными таблицами. Следует соединять друг с другом только объекты метаданных или временные таблицы. Если в запросе используется соединение с виртуальной таблицей языка запросов 1С:Предприятия (например, РегистрНакопления.Товары.Остатки) и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице. |
5 6 7 |
||
4
Мимохожий Однако
26.11.24
✎
18:10
|
(0) Опиши конечную цель запроса
|
|||
5
Somebody
26.11.24
✎
18:11
|
(3) так в пояснении всё и расписано
|
|||
6
Волшебник
26.11.24
✎
18:16
|
(3) Фи, Сонар какой-то. Пошли его нах
|
|||
7
Garykom
гуру
26.11.24
✎
18:32
|
||||
8
Garykom
гуру
26.11.24
✎
18:33
|
Кстати для Временных Таблиц принято сокращение/префикс ВТ/Вт
Какое отличающееся сокращение лучше использовать для Виртуальных Таблиц? |
9 |
||
9
Волшебник
26.11.24
✎
19:20
|
(8) их надо именовать по смыслу информации
|
|||
10
yuran9393
26.11.24
✎
23:01
|
Garykom мог бы пример привести пожалуйста?
Из виртуальной таблицы СрезПоследних(Период, Отборы) отбираешь что надо и помещаешь во временную таблицу Затем уже полученную ВТ соединяй с чем еще не догоняю не мног... |
|||
11
yuran9393
26.11.24
✎
23:27
|
Получилось что то подобное:
ВЫБРАТЬ Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух, Контрагенты_ХарактеристикиСрезПоследних.Контрагент КАК Контрагент ПОМЕСТИТЬ ВТ_1 ИЗ РегистрСведений.Контрагенты_Характеристики.СрезПоследних(, Контрагент = &Контрагент) КАК Контрагенты_ХарактеристикиСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_1.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук2, ВТ_1.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух2, Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер, Контрагенты_Свойства.Руководитель КАК Руководитель ИЗ ВТ_1 КАК ВТ_1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства ПО ВТ_1.Контрагент = Контрагенты_Свойства.Владелец |
|||
12
yuran9393
26.11.24
✎
23:29
|
Подправил:
ВЫБРАТЬ Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух, Контрагенты_ХарактеристикиСрезПоследних.Контрагент КАК Контрагент ПОМЕСТИТЬ ВТ_1 ИЗ РегистрСведений.Контрагенты_Характеристики.СрезПоследних(, Контрагент = &Контрагент) КАК Контрагенты_ХарактеристикиСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_1.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, ВТ_1.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух, Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер, Контрагенты_Свойства.Руководитель КАК Руководитель ИЗ ВТ_1 КАК ВТ_1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства ПО ВТ_1.Контрагент = Контрагенты_Свойства.Владелец Вопрос, получаю верные данные, но корректно ли написан запрос и всегда ли требуется во временной таблице указывать параметр "Период"? если да, то какой период там указываем? |
14 |
||
13
yuran9393
26.11.24
✎
23:34
|
Конечный вариант:
ВЫБРАТЬ Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух, Контрагенты_ХарактеристикиСрезПоследних.Контрагент КАК Контрагент ПОМЕСТИТЬ ВТ_ПодписывающиеЛицаБухРук ИЗ РегистрСведений.Контрагенты_Характеристики.СрезПоследних(&Дата, Контрагент = &Контрагент) КАК Контрагенты_ХарактеристикиСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ПодписывающиеЛицаБухРук.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук, ВТ_ПодписывающиеЛицаБухРук.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух, Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер, Контрагенты_Свойства.Руководитель КАК Руководитель ИЗ ВТ_ПодписывающиеЛицаБухРук КАК ВТ_ПодписывающиеЛицаБухРук ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства ПО ВТ_ПодписывающиеЛицаБухРук.Контрагент = Контрагенты_Свойства.Владелец |
|||
14
osa1C
26.11.24
✎
23:41
|
(12) Нормальный запрос, для тебя в данном случае пойдет. Единственное, что заметил беглым взглядом (хотя в данном случае это и не надо, потому как из виртуальной таблицы выбирается один контрагент), что нет индексирования. На будущее - поля в запросе, по которым проводятся соединения таблиц рекомендуется индексировать. Но в данном запросе это не надо.
|
|||
15
yuran9393
26.11.24
✎
23:43
|
понял, спасибо большое за ОС
|
16 |
||
16
osa1C
27.11.24
✎
00:29
|
(15) Ещё. Ты берешь из справочника Руководителя и Главного бухгалтера. Если потом ты будешь использовать не ссылки, а наименования этих полей, то дополнительно в запросе надо выводить ПРЕДСТАВЛЕНИЕ. Иначе обращение к полям запроса ВыборкаДетальныхЗаписей.Руководитель.Наименование приводит к появлению ещё одного неявного запроса к базе данных, хотя всё это можно получить в этом запросе вот так:
Представление(Контрагенты_Свойства.Руководитель) КАК РуководительИмя |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |