Имя: Пароль:
1C
1С v8
Объединить две ТЗ запросом
0 abask
 
23.12.22
18:03
Всех с пятницей !!!

пытаюсь объединить две ТЗ с неизвестной, но одинаковой структурой без цикла

с заданной структурой разобрался

Написал вот такую функцию

Функция СклеитьТЗ(ТЗ_1, ТЗ_2)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТЗ_1.Период КАК Период
        |ПОМЕСТИТЬ ВТ_1
        |ИЗ
        |    &ТЗ_1 КАК ТЗ_1
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ТЗ_2.Период КАК Период
        |ПОМЕСТИТЬ ВТ_2
        |ИЗ
        |    &ТЗ_2 КАК ТЗ_2
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_1.Период КАК Период
        |ИЗ
        |    ВТ_1 КАК ВТ_1
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    ВТ_2.Период
        |ИЗ
        |    ВТ_2 КАК ВТ_2";
    
    
    Запрос.УстановитьПараметр("ТЗ_1", ТЗ_1);
    Запрос.УстановитьПараметр("ТЗ_2", ТЗ_2);

    РезультирующаяТЗ = Запрос.Выполнить().Выгрузить();
    
    Возврат РезультирующаяТЗ;

КонецФункции

Если вместо Период указываю * не работает

есть смысл в эту сторону копать?
1 RomanYS
 
23.12.22
18:06
(0) ну перебери колонки ТЗ и сформируй текст запроса с полями. Есть ли смысл - тебе виднее.
Обычно просто циклом строки добавляют
2 Timon1405
 
23.12.22
18:07
может нет типизации колонок при передаче в запрос
3 abask
 
23.12.22
18:09
(1) Если цикл делать, тогда проще использовать ЗаполнитьЗначенияСвойств
4 RomanYS
 
23.12.22
18:55
(3) так и делают. В БСП наверняка это есть
5 Chai Nic
 
23.12.22
19:26
(0) Это ты зря. Без цикла, но с передачей данных на sql-сервер туда-сюда.
6 ass1c
 
23.12.22
19:38
ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("ДемоБанковскиеСчета", Новый ОписаниеТипов("СправочникСсылка._ДемоБанковскиеСчета"));
    ТЗ.Колонки.Добавить("ДемоКассы"          , Новый ОписаниеТипов("СправочникСсылка._ДемоКассы"));
    
    Строка = ТЗ.Добавить();
    Строка.ДемоБанковскиеСчета = Справочники._ДемоБанковскиеСчета.ПустаяСсылка();
    Строка.ДемоКассы           = Справочники._ДемоКассы.ПустаяСсылка();
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ";
    Запрос.УстановитьПараметр("ТЗ", ТЗ);
    Запрос.Выполнить();
    
    
    ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("ДемоБанковскиеСчета", Новый ОписаниеТипов("СправочникСсылка._ДемоБанковскиеСчета"));
    ТЗ2.Колонки.Добавить("ДемоКассы"       , Новый ОписаниеТипов("СправочникСсылка._ДемоКассы"));
    
    Строка = ТЗ2.Добавить();
    Строка.ДемоБанковскиеСчета = Справочники._ДемоБанковскиеСчета.ПустаяСсылка();
    Строка.ДемоКассы           = Справочники._ДемоКассы.ПустаяСсылка();
    
    Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ2 ИЗ &ТЗ КАК ТЗ";
    Запрос.УстановитьПараметр("ТЗ", ТЗ);
    Запрос.Выполнить();
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    *
    |ИЗ
    |    ТЗ КАК ВТ_1
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |    ТЗ2 КАК ВТ_2";
    
    ТЗИтог = Запрос.Выполнить().Выгрузить();
7 SleepyHead
 
гуру
24.12.22
08:04
(3) Это очень медленно, так как каждый раз выполняется сравнение состава колонок таблиц.
Если всего одно поле, как у автора, лучше добавлять строку и присваивать значение периода "китайским кодом".
8 rudnitskij
 
24.12.22
12:37
Для Каждого Стр Из Таб2 Цикл
НовСТр = Таб1.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, Стр);
КонецЦикла;
---------------------------
Этот вариант совсем неприемлемый? Или обязательно нужно чтоб это делал сервер SQL?
9 abask
 
24.12.22
12:44
(8) вопрос более академический, чем прикладной