Имя: Пароль:
1C
 
Помогите объединить две таблицы.
0 konstanciy
 
18.05.11
10:24
Всем доброго дня! Появилась необходимость объединить две таблицы значений. Для примера, создали обработку с двумя реквизитами Документ1 и Документ2. И будем объединять их табличные части. В модуле:

&НаКлиенте
Процедура СлитьДоки(Команда)
   СлитьДокиНаСервере(Объект.Документ1, Объект.Документ2);
КонецПроцедуры

&НаСервере
Процедура СлитьДокиНаСервере(Д1, Д2)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
           "ВЫБРАТЬ
       |    Док1.Номенклатура,
       |    Док1.Количество,
       |    Док1.Цена
       |ИЗ
       |    Док1 КАК Док1
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Док2 КАК Док2
       |        ПО Док1.Номенклатура = Док2.Номенклатура
       |ГДЕ
       |    Док1 = &Док1
       |    Док2 = &Док2";
       
       Запрос.УстановитьПараметр("Док1",Д1.Товары);
       Запрос.УстановитьПараметр("Док2",Д2.Товары);

   Результат = Запрос.Выполнить();

   ВыборкаДетальныеЗаписи = Результат.Выбрать();

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       // Вставить обработку выборки ВыборкаДетальныеЗаписи
   КонецЦикла;        
КонецПроцедуры

Запрос не выполняется. Ругается на Параметры. Вложенные запросы и т.д не предлагать. Смысл - в запрос передать две таблицы и там их оъединить. Если такое возможно, конечно.
Заранее всем спасибо.
1 ДенисЧ
 
18.05.11
10:26
Запрос.Текст =
           "ВЫБРАТЬ
       |    Док1.Номенклатура,
       |    Док1.Количество,
       |    Док1.Цена
       |ИЗ
       |    Док1 КАК Док1.Товары
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Док2.Товары КАК Док2
       |        ПО Док1.Номенклатура = Док2.Номенклатура
       |ГДЕ
       |    Док1 = &Док1
       |    Док2 = &Док2";


Так не предлагать?
2 azernot
 
18.05.11
10:33
ВЫБРАТЬ
   Объединение.Номенклатура,
   СУММА(Объединение.Количество) КАК Количество,
   Объединение.Цена
ИЗ
   (ВЫБРАТЬ
       Док1.Номенклатура КАК Номенклатура,
       Док1.Количество КАК Количество,
       Док1.Цена КАК Цена
   ИЗ
       Документ.РеализацияТоваровУслуг.Товары КАК Док1
   ГДЕ
       Док1.Ссылка = &Док1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Док1.Номенклатура,
       Док1.Количество,
       Док1.Цена
   ИЗ
       Документ.РеализацияТоваровУслуг.Товары КАК Док1
   ГДЕ
       Док1.Ссылка = &Док2) КАК Объединение

СГРУППИРОВАТЬ ПО
   Объединение.Номенклатура,
   Объединение.Цена

Так тоже не предлагать?
3 Fatum1980
 
18.05.11
10:46
так табличные части документов объединить или таблицы значений. имхо это несколько разными путями делается :)
4 azernot
 
18.05.11
10:50
Дано
ТЗ1 и ТЗ2 (одинаковой структуры колонок)

Функция ОбъединитьДвеТЗ(ТЗ1, ТЗ2)

Для каждого СтрокаТЗ2 Из ТЗ2 Цикл
  НоваяСтрокаТЗ1 = ТЗ1.Добавить();
  ЗаполнитьЗначенияСвойств(НоваяСтрокаТЗ1 , СтрокаТЗ2);
КонецЦикла;

Возврат ТЗ1;
КонецФункции;
5 konstanciy
 
18.05.11
10:51
Нет, ребят. Так не подходит. Смысл - объединить две таблицы значений переданные из вне в качестве параметров. То что я беру два документа, это только для того чтобы воспользаваться их табличными частями. В строках:
       Запрос.УстановитьПараметр("Док1",Д1.Товары);
       Запрос.УстановитьПараметр("Док2",Д2.Товары);
Товары - Это табличная часть документа! Поэтому в запросе уже нет никаких документов. Только таблицы :))
6 Нуф-Нуф
 
18.05.11
10:52
ээээ
7 73
 
18.05.11
10:54
(5) Почитай в справке про временные таблицы, внешний источник, пакетные запросы...
8 azernot
 
18.05.11
10:59
(5) Чем не устраивает вариант (4)?
Зачем такие слодности с запросами?


Запрос.УстановитьПараметр("Док1",Д1.Товары.Выгрузить());
Вот так параметры указываются в твоём случае..
9 73
 
18.05.11
11:04
(8) В его случае запрос другой нужен.
10 Fatum1980
 
18.05.11
11:06
может не оптимально но:
Менеджер = Новый МенеджерВременныхТаблиц;
ВременнаяТаблица = Новый Запрос;
ВременнаяТаблица.МенеджерВременныхТаблиц = Менеджер;
ТекстЗапроса = "ВЫБРАТЬ
                     | *
                     |ПОМЕСТИТЬ врЛист1
                     |ИЗ
                     |    &ТЗЛист1 КАК ТЗЛист1";
ВременнаяТаблица.УстановитьПараметр("ТЗЛист1", ТЗЛист1);
ВременнаяТаблица.Текст = ТекстЗапроса;
ВременнаяТаблица.Выполнить();
   
ТекстЗапроса = "ВЫБРАТЬ
                  |    *
                  |ПОМЕСТИТЬ врЛист2
                  |ИЗ
                  |    &ТЗЛист2 КАК ТЗЛист2";
ВременнаяТаблица.УстановитьПараметр("ТЗЛист2", ТЗЛист2);
ВременнаяТаблица.Текст = ТекстЗапроса;
ВременнаяТаблица.Выполнить();

Дальше две таблицы врЛист1 и ВрЛист2 объединяешь по нужным тебе полям

ВременнаяТаблица.Текст = "Выбрать Лист1.*
|   из врЛист1 как Лист1
|   Внутреннее соединение врЛист2 как лист2
|   по Лист1.Поле=Лист2.Поле ";
РезультатЗапроса = ВременнаяТаблица.Выполнить();
Результат = РезультатЗапроса.Выбрать();    

как то так наверное
11 azernot
 
18.05.11
11:11
ЗапросДляОбъединения = Новый Запрос;
   
   Менеджер = Новый МенеджерВременныхТаблиц;
   ЗапросДляОбъединения.МенеджерВременныхТаблиц = Менеджер;
   ЗапросДляОбъединения.Текст =
   "ВЫБРАТЬ
   |    Док1.Номенклатура КАК Номенклатура,
   |    Док1.Количество КАК Количество,
   |    Док1.Цена КАК Цена
   |ПОМЕСТИТЬ ТЗ1
   |ИЗ
   |    &Док1 КАК Док1
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    Док2.Номенклатура КАК Номенклатура,
   |    Док2.Количество КАК Количество,
   |    Док2.Цена КАК Цена
   |ПОМЕСТИТЬ ТЗ2
   |ИЗ
   |    &Док2 КАК Док2
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    Объединение.Номенклатура,
   |    СУММА(Объединение.Количество) КАК Количество,
   |    Объединение.Цена
   |ИЗ
   |    (ВЫБРАТЬ
   |        Док1.Номенклатура КАК Номенклатура,
   |        Док1.Количество КАК Количество,
   |        Док1.Цена КАК Цена
   |    ИЗ
   |        ТЗ1 КАК Док1
   |    
   |    ОБЪЕДИНИТЬ ВСЕ
   |    
   |    ВЫБРАТЬ
   |        Док1.Номенклатура,
   |        Док1.Количество,
   |        Док1.Цена
   |    ИЗ
   |        ТЗ2 КАК Док1) КАК Объединение
   |
   |СГРУППИРОВАТЬ ПО
   |    Объединение.Номенклатура,
   |    Объединение.Цена";
   ЗапросДляОбъединения.УстановитьПараметр("Док1", Док1.Товары.Выгрузить());
   ЗапросДляОбъединения.УстановитьПараметр("Док2", Док2.Товары.Выгрузить());
   
   ОбъединеннаяТаблица = ЗапросДляОбъединения.Выполнить().Выгрузить();
   Менеджер.Закрыть();
12 73
 
18.05.11
11:12
Запрос = Новый Запрос("
|Выбрать * Поместить ТЧ1 Из &ТЧ1 КАК ТЧ1
|;
|Выбрать * Поместить ТЧ2 Из &ТЧ2 КАК ТЧ2
|;
|Выбрать * ИЗ ТЧ1 //тут для примера
|Объединить все
|Выбрать * ИЗ ТЧ2
|");
Запрос.УстановитьПараметр("ТЧ1", ТЧ1);
Запрос.УстановитьПараметр("ТЧ2", ТЧ2);
13 azernot
 
18.05.11
11:13
+(11) Хотя в данном случае, даже менеджер временных таблиц не нужен..
14 konstanciy
 
18.05.11
11:21
Всем спасибо!
Рабочим решением на поставленную задачу является в посте (12). Т.е. по сути это функция, которая получает две таблицы значений и объединяет их. Спасибо большое 73.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший