|   |   | 
| 
 | Соединение с виртуальными таблицами в запросе | ☑ | ||
|---|---|---|---|---|
| 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) Ещё. Ты берешь из справочника Руководителя и Главного бухгалтера. Если потом ты будешь использовать не ссылки, а наименования этих полей, то дополнительно в запросе надо выводить ПРЕДСТАВЛЕНИЕ. Иначе обращение к полям запроса ВыборкаДетальныхЗаписей.Руководитель.Наименование приводит к появлению ещё одного неявного запроса к базе данных, хотя всё это можно получить в этом запросе вот так: 
 Представление(Контрагенты_Свойства.Руководитель) КАК РуководительИмя | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |