Имя: Пароль:
1C
 
Соединение с виртуальными таблицами в запросе
0 yuran9393
 
26.11.24
17:44
Добрый день!
Есть запрос:

ВЫБРАТЬ
    Контрагенты_Свойства.Руководитель КАК Руководитель,
    Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер,
    Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук,
    Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух
ИЗ
    Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Контрагенты_Характеристики.СрезПоследних КАК Контрагенты_ХарактеристикиСрезПоследних
        ПО Контрагенты_Свойства.Владелец = Контрагенты_ХарактеристикиСрезПоследних.Контрагент
ГДЕ
    Контрагенты_Свойства.Владелец = &Контрагент
    И Контрагенты_Свойства.ПометкаУдаления = ЛОЖЬ
подскажите как в данном запросе правильно исправить ошибку "Не следует использовать соединения с виртуальными таблицами"? или где можно почитать доп инфу?
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С:Предприятия (например, РегистрНакопления.Товары.Остатки) и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.
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
(0) (3) Тебе сонар правильно выдает
Из виртуальной таблицы СрезПоследних(Период, Отборы) отбираешь что надо и помещаешь во временную таблицу
Затем уже полученную ВТ соединяй с чем еще
8 Garykom
 
гуру
26.11.24
18:33
Кстати для Временных Таблиц принято сокращение/префикс ВТ/Вт
Какое отличающееся сокращение лучше использовать для Виртуальных Таблиц?
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.Контрагент = Контрагенты_Свойства.Владелец

Вопрос, получаю верные данные, но корректно ли написан запрос и всегда ли требуется во временной таблице указывать параметр "Период"? если да, то какой период там указываем?
13 yuran9393
 
26.11.24
23:34
Конечный вариант:
ВЫБРАТЬ
    Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук,
    Контрагенты_ХарактеристикиСрезПоследних.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух,
    Контрагенты_ХарактеристикиСрезПоследних.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_ПодписывающиеЛицаБухРук
ИЗ
    РегистрСведений.Контрагенты_Характеристики.СрезПоследних(&Дата, Контрагент = &Контрагент) КАК Контрагенты_ХарактеристикиСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ПодписывающиеЛицаБухРук.ЛицоПодписывающееАктыРук КАК ЛицоПодписывающееАктыРук,
    ВТ_ПодписывающиеЛицаБухРук.ЛицоПодписывающееАктыБух КАК ЛицоПодписывающееАктыБух,
    Контрагенты_Свойства.ГлавныйБухгалтер КАК ГлавныйБухгалтер,
    Контрагенты_Свойства.Руководитель КАК Руководитель
ИЗ
    ВТ_ПодписывающиеЛицаБухРук КАК ВТ_ПодписывающиеЛицаБухРук
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты_Свойства КАК Контрагенты_Свойства
        ПО ВТ_ПодписывающиеЛицаБухРук.Контрагент = Контрагенты_Свойства.Владелец
14 osa1C
 
26.11.24
23:41
(12) Нормальный запрос, для тебя в данном случае пойдет. Единственное, что заметил беглым взглядом (хотя в данном случае это и не надо, потому как из виртуальной таблицы выбирается один контрагент), что нет индексирования. На будущее - поля в запросе, по которым проводятся соединения таблиц рекомендуется индексировать. Но в данном запросе это не надо.
15 yuran9393
 
26.11.24
23:43
понял, спасибо большое за ОС
16 osa1C
 
27.11.24
00:29
(15) Ещё. Ты берешь из справочника Руководителя и Главного бухгалтера. Если потом ты будешь использовать не ссылки, а наименования этих полей, то дополнительно в запросе надо выводить ПРЕДСТАВЛЕНИЕ. Иначе обращение к полям запроса ВыборкаДетальныхЗаписей.Руководитель.Наименование приводит к появлению ещё одного неявного запроса к базе данных, хотя всё это можно получить в этом запросе вот так:

Представление(Контрагенты_Свойства.Руководитель) КАК РуководительИмя
2 + 2 = 3.9999999999999999999999999999999...