Вопрос!
Имеем 2 таблицы значений. пр. (ТЗ_1) и (ТЗ_2)
Сначала необходимо найти одинаковые строки в первой таблице (ТЗ_1) и сплюсовать их по определенному значению например "Сумма", далее найти одинаковые строки во второй таблице (ТЗ_2) и сплюсовать их по определенному значению "Сумма", а далее найти одинаковые строки второй таблицы с первой таблицей и если имеются одинаковые строки по найденым строкам то сплюсовать их так же по "Сумма". Каков может быть пример реализации в таком случае?
---
```1c
    ВЫБРАТЬ
    ТЗ1.Поле1,
    ТЗ1.Поле2,
    ТЗ1.Сумма1
    ПОМЕСТИТЬ ВТ_1
    ИЗ
    ТЗ1 КАК ТЗ1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_1.Поле1,
    ВТ_1.Поле2,
    СУММА(ВТ_1.Сумма1) КАК Сумма1
    ПОМЕСТИТЬ ВТ_1_Группировка
    ИЗ
    ВТ_1 КАК ВТ_1

    СГРУППИРОВАТЬ ПО
    ВТ_1.Поле1,
    ВТ_1.Поле2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ТЗ2.Поле21,
    ТЗ2.Поле22,
    ТЗ2.Сумма2
    ПОМЕСТИТЬ ВТ_2
    ИЗ
    ТЗ2 КАК ТЗ2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_2.Поле21,
    ВТ_2.Поле22,
    СУММА(ВТ_2.Сумма2) КАК Сумма2
    ПОМЕСТИТЬ ВТ_2_Группировка
    ИЗ
    ВТ_2 КАК ВТ_2

    СГРУППИРОВАТЬ ПО
    ВТ_2.Поле21,
    ВТ_2.Поле22
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_1_Группировка.Поле1,
    ВТ_1_Группировка.Поле2,
    ВТ_1_Группировка.Сумма1,
    1 КАК НомерТаблицы
    ПОМЕСТИТЬ ВТ_Объединенные
    ИЗ
    ВТ_1_Группировка КАК ВТ_1_Группировка

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ВТ_2_Группировка.Поле21,
    ВТ_2_Группировка.Поле22,
    ВТ_2_Группировка.Сумма2,
    2
    ИЗ
    ВТ_2_Группировка КАК ВТ_2_Группировка
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Объединенные.Поле1,
    ВТ_Объединенные.Поле2,
    СУММА(ВТ_Объединенные.Сумма1) КАК Сумма1,
    СУММА(ВТ_Объединенные.НомерТаблицы) КАК НомерТаблицы
    ПОМЕСТИТЬ Вариант1
    ИЗ
    ВТ_Объединенные КАК ВТ_Объединенные

    СГРУППИРОВАТЬ ПО
    ВТ_Объединенные.Поле2,
    ВТ_Объединенные.Поле1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЕСТЬNULL(ВТ_1_Группировка.Поле1, ВТ_2_Группировка.Поле21) КАК Поле1,
    ЕСТЬNULL(ВТ_1_Группировка.Поле2, ВТ_2_Группировка.Поле22) КАК Поле2,
    СУММА(ЕСТЬNULL(ВТ_1_Группировка.Сумма1, 0) + ЕСТЬNULL(ВТ_2_Группировка.Сумма2, 0)) КАК Сумма,
    ВЫБОР
    КОГДА НЕ ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    И НЕ ВТ_2_Группировка.Поле21 ЕСТЬ NULL
    ТОГДА 3
    КОГДА ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    ТОГДА 2
    ИНАЧЕ 1
    КОНЕЦ КАК НомерТаблицы
    ПОМЕСТИТЬ Варинат2
    ИЗ
    ВТ_1_Группировка КАК ВТ_1_Группировка
    ПОЛНОЕ СОЕДИНЕНИЕ ВТ_2_Группировка КАК ВТ_2_Группировка
    ПО ВТ_1_Группировка.Поле1 = ВТ_2_Группировка.Поле21
    И ВТ_1_Группировка.Поле2 = ВТ_2_Группировка.Поле22

    СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ВТ_1_Группировка.Поле1, ВТ_2_Группировка.Поле21),
    ЕСТЬNULL(ВТ_1_Группировка.Поле2, ВТ_2_Группировка.Поле22),
    ВЫБОР
    КОГДА НЕ ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    И НЕ ВТ_2_Группировка.Поле21 ЕСТЬ NULL
    ТОГДА 3
    КОГДА ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    ТОГДА 2
    ИНАЧЕ 1
    КОНЕЦ
```
---
Каков может быть пример реализаци

```1c
    ТЗ = Новый ТаблицаЗначени;
    ТЗ.Свернуть();
```

ТаблицаЗначений (ValueTable)
Свернуть (GroupBy)
Синтаксис:
Свернуть(<КолонкиГруппировок>, <КолонкиСуммирования>)
Параметры:
<КолонкиГруппировок> (обязательный)
Тип: Строка.
Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.
<КолонкиСуммирования> (необязательный)
Тип: Строка.
Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
Описание:
Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
Важно! Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
Пример:
ТаблицаЦен.Свернуть("Товар, Валюта", "Цена");

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

Поиск можно так сделать

```1c
    СтруктОтбора = Новый Структура();
    СтруктОтбора.Вставить("Номенклатура", Строчка.Товар);
    СтруктОтбора.Вставить("ХарактеристикаНоменклатуры", ?(Не Строчка.Характеристика = Null, Строчка.Характеристика, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка()));
    СтруктОтбора.Вставить("СтавкаНДС", Строчка.СтавкаНДС);
    СтруктОтбора.Вставить("Цена", Строчка.Цена);
    СтрТЧСделки = ОбработкаТабличныхЧастей.НайтиСтрокуТабЧасти(ДанныеДляПечати.ТЧСделки, СтруктОтбора);
```

где НайтиСтрокуТабЧасти()

```1c
    // Функция выполняет поиск первой, удовлетворяющей условию поика, строки табличной части.
    //
    // Параметры:
    // ТабличнаяЧасть - табличная часть документа, в которой осуществляется поиск,
    // СтруктураОтбора - структура - задает условие поиска.
    //
    // Возвращаемое значение:
    // Строка табличной части - найденная строка табличной части,
    // Неопределено - строка табличной части не найдена.
    //
    Функция НайтиСтрокуТабЧасти(ТабличнаяЧасть, СтруктураОтбора) Экспорт

    СтрокаТабличнойЧасти = Неопределено;
    МассивНайденныхСтрок = ТабличнаяЧасть.НайтиСтроки(СтруктураОтбора);
    Если МассивНайденныхСтрок.Количество() > 0 Тогда

    // Нашли. Вернем первую найденную строку.
    СтрокаТабличнойЧасти = МассивНайденныхСтрок[0];
    КонецЕсли;

    Возврат СтрокаТабличнойЧасти;

    КонецФункции // НайтиСтрокуТабЧасти()
```

Для типизации таблиц можно так

```1c
    МассивКолво = Новый Массив; МассивКолво.Добавить(Тип("Число")); КвЧКолво = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Любой); ОпТипКолво = Новый ОписаниеТипов(МассивКолво, , , КвЧКолво);
    МассивСум = Новый Массив; МассивСум.Добавить(Тип("Число")); КвЧСум = Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой); ОпТипСум = Новый ОписаниеТипов(МассивСум, , , КвЧСум);
    ТЗСверкиТовары = Новый ТаблицаЗначений;
    ТЗСверкиТовары = Источник.Товары.ВыгрузитьКолонки("Номенклатура, ЕдиницаИзмерения, Коэффициент");
    ТЗСверкиТовары.Колонки.Добавить("Количество", ОпТипКолво, "Количество", 10);
    ТЗСверкиТовары.Колонки.Добавить("Сумма", ОпТипСум, "Сумма", 10);
    ТЗСверкиТовары.Колонки.Добавить("СуммаНДС", ОпТипСум, "СуммаНДС", 10);
    //Поступление товаров и услуг Упр
    ТЗСверкиТоварыПТиУ = Новый ТаблицаЗначений;
    ТЗСверкиТоварыПТиУ = ТЗСверкиТовары.СкопироватьКолонки();
```
---
по вашей версии, он сначала должен все таблицы разобрать по типам и строкам, проанализировать их (по сути - вручную), а потом объединять-искать-проверять строки на повтор.
А если строки и так уже будут искомые (известные) - зачем их автоматически еще раз анализировать?
---
по вашей версии, он сначала должен все таблицы разобрать по типам и строкам, проанализировать их (по сути - вручную), а потом объединять-искать-проверять строки на повтор.
т.с пишет
Сначала необходимо найти одинаковые строки в первой таблице (ТЗ_1) и сплюсовать их по определенному значению например "Сумма"
значит

```1c
    ТЗ_1.Свернуть("Значение1", "Сумма");
    ТЗ_1.Сортировать("Значение1 Возр");
```

затем
 далее найти одинаковые строки во второй таблице (ТЗ_2) и сплюсовать их по определенному значению "Сумма"
значит

```1c
    ТЗ_2.Свернуть("Значение1", "Сумма");
    ТЗ_2.Сортировать("Значение1 Возр");
```

затем, с начала не вчитался и упустил
Как сравнить две таблицы значений
для типизованных таблиц

```1c
    Если ЗначениеВСтрокуВнутр(ТЗ_1) <> ЗначениеВСтрокуВнутр(ТЗ_2) Тогда
```

типизация нужна перед созданием и наполнением таблиц, допустип для того чтобы значения сумма могла принимать отрицательное значение. В вопросе мало что описано, может и поиск пригодится...
В общем нужно больше данных, ведь не понятно что будет с таблицами на выходе???
---
Запрос к первой ТЗ с группировкой, результат во временную таблицу.
Запрос ко второй ТЗ с группировкой, результат во временную таблицу2.
Запрос с объединением ВТ1 и ВТ2 с группировкой.
Примерно так.
---
Судя по условию задачи и одинаковости полей везде, можно и сразу получить данные из обоих таблиц объединением и сгруппировать их со всеми полями групповыми кроме "суммы".
Я не помню какое там ограничение на операции при непосредственном помещении данных из внешнего источника, возможно все таки 3 временных таблицы нужно будет деалть. Но группировки достаточно будет и одной.
---
Я не помню какое там ограничение на операции при непосредственном помещении данных из внешнего источникабудут в тех типах, которые объявлены в запросе.
---
```1c
    &НаСервере
    Функция РазницаТаблицЗначений(Таблица0, Таблица1, ВыбранноеЗначение) Экспорт

    Запрос = новый Запрос("ВЫБРАТЬ
    | &КолонкиТЗ1
    |ПОМЕСТИТЬ ВТ1
    |ИЗ
    | &ПерваяТаблица КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | &КолонкиТЗ2
    |ПОМЕСТИТЬ ВТ2
    |ИЗ
    | &ВтораяТаблица КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | &НовыеКолонкиТЗ1 ,
    | &НовыеКолонкиТЗ2 ,
    | isnull(&Условие , ложь) КАК СтрокаРавна
    |ПОМЕСТИТЬ ВТ_Данные
    |ИЗ
    | ВТ1 КАК ВТ1
    | ПОЛНОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
    | ПО (&Связь)
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_Данные.*
    |ИЗ
    | ВТ_Данные КАК ВТ_Данные
    |ГДЕ
    | НЕ ВТ_Данные.СтрокаРавна");
    //| Истина");

    СтрКолонкиТЗ1 = ПолучитьСписокПолей(Таблица0,","ТЗ");
    СтрКолонкиТЗ2 = ПолучитьСписокПолей(Таблица1,","ТЗ");

    СтрНовыеКолонкиТЗ1 = ПолучитьСписокПолей(Таблица0,"ТЗ1_","ВТ1");
    СтрНовыеКолонкиТЗ2= ПолучитьСписокПолей(Таблица1,"ТЗ2_","ВТ2");

    МассивУсловий = новый Массив;
    для каждого х из Таблица0.колонки цикл
    МассивУсловий.Добавить("ВТ1."+х.Имя+" = "+"ВТ2."+х.имя);
    КонецЦикла;

    МассивСвязей = новый Массив;
    для каждого х из Таблица0.колонки цикл
    Если Найти(х.Имя,"_КлючСвязи") = 0 тогда
    Продолжить;
    КонецЕсли;
    МассивСвязей.Добавить("ВТ1."+х.Имя+" = "+"ВТ2."+х.имя);
    КонецЦикла;

    СтрокаУсловие = СтрСоединить(МассивУсловий," И ");
    СтрокаСвязи = СтрСоединить(МассивСвязей," И ");

    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&КолонкиТЗ1",СтрКолонкиТЗ1);
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&КолонкиТЗ2",СтрКолонкиТЗ2);
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&НовыеКолонкиТЗ1",СтрНовыеКолонкиТЗ1);
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&НовыеКолонкиТЗ2",СтрНовыеКолонкиТЗ2);
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Условие",СтрокаУсловие);
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Связь",СтрокаСвязи);

    Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("ПерваяТаблица",Таблица0);
    Запрос.УстановитьПараметр("ВтораяТаблица",Таблица1);

    Возврат Запрос.Выполнить().Выгрузить();

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

Ключсвязи дописать тем полям которые являются ключевыми
---
ты щас серьзено?

```1c
    Запрос.УстановитьПараметр("ПерваяТаблица",ТЗ1.Выгрузить());
    Запрос.УстановитьПараметр("ВтораяТаблица",ТЗ2.Выгрузить());
```
 религия не позволяет использовать?
---
А чуть подробнее мысль разверни. Не понял - в чем

```1c
    Запрос.УстановитьПараметр("ПерваяТаблица",Таблица0);
    Запрос.УстановитьПараметр("ВтораяТаблица",Таблица1);
```

хуже чем

```1c
    Запрос.УстановитьПараметр("ПерваяТаблица",ТЗ1.Выгрузить());
    Запрос.УстановитьПараметр("ВтораяТаблица",ТЗ2.Выгрузить());
```
---
а где у него вообще "ТЗ1-32", и почему к этой переменной сразу ".Выгрузить()"?
Откуда берется, что выгружается?
Притом, что изначально "Таблица0" и "Таблица0" - это аргументы функции, входящие параметры. И вообще неизвестно, что там передается.
---
или просто перебором.
свернуть таблицы потом циклами пробежаться. не оптимально, подойдет если плохо знакомы с запросами .
---
```1c
    ВЫБРАТЬ
    ТЗ1.Поле1,
    ТЗ1.Поле2,
    ТЗ1.Сумма1
    ПОМЕСТИТЬ ВТ_1
    ИЗ
    ТЗ1 КАК ТЗ1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_1.Поле1,
    ВТ_1.Поле2,
    СУММА(ВТ_1.Сумма1) КАК Сумма1
    ПОМЕСТИТЬ ВТ_1_Группировка
    ИЗ
    ВТ_1 КАК ВТ_1

    СГРУППИРОВАТЬ ПО
    ВТ_1.Поле1,
    ВТ_1.Поле2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ТЗ2.Поле21,
    ТЗ2.Поле22,
    ТЗ2.Сумма2
    ПОМЕСТИТЬ ВТ_2
    ИЗ
    ТЗ2 КАК ТЗ2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_2.Поле21,
    ВТ_2.Поле22,
    СУММА(ВТ_2.Сумма2) КАК Сумма2
    ПОМЕСТИТЬ ВТ_2_Группировка
    ИЗ
    ВТ_2 КАК ВТ_2

    СГРУППИРОВАТЬ ПО
    ВТ_2.Поле21,
    ВТ_2.Поле22
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_1_Группировка.Поле1,
    ВТ_1_Группировка.Поле2,
    ВТ_1_Группировка.Сумма1,
    1 КАК НомерТаблицы
    ПОМЕСТИТЬ ВТ_Объединенные
    ИЗ
    ВТ_1_Группировка КАК ВТ_1_Группировка

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ВТ_2_Группировка.Поле21,
    ВТ_2_Группировка.Поле22,
    ВТ_2_Группировка.Сумма2,
    2
    ИЗ
    ВТ_2_Группировка КАК ВТ_2_Группировка
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Объединенные.Поле1,
    ВТ_Объединенные.Поле2,
    СУММА(ВТ_Объединенные.Сумма1) КАК Сумма1,
    СУММА(ВТ_Объединенные.НомерТаблицы) КАК НомерТаблицы
    ПОМЕСТИТЬ Вариант1
    ИЗ
    ВТ_Объединенные КАК ВТ_Объединенные

    СГРУППИРОВАТЬ ПО
    ВТ_Объединенные.Поле2,
    ВТ_Объединенные.Поле1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЕСТЬNULL(ВТ_1_Группировка.Поле1, ВТ_2_Группировка.Поле21) КАК Поле1,
    ЕСТЬNULL(ВТ_1_Группировка.Поле2, ВТ_2_Группировка.Поле22) КАК Поле2,
    СУММА(ЕСТЬNULL(ВТ_1_Группировка.Сумма1, 0) + ЕСТЬNULL(ВТ_2_Группировка.Сумма2, 0)) КАК Сумма,
    ВЫБОР
    КОГДА НЕ ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    И НЕ ВТ_2_Группировка.Поле21 ЕСТЬ NULL
    ТОГДА 3
    КОГДА ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    ТОГДА 2
    ИНАЧЕ 1
    КОНЕЦ КАК НомерТаблицы
    ПОМЕСТИТЬ Варинат2
    ИЗ
    ВТ_1_Группировка КАК ВТ_1_Группировка
    ПОЛНОЕ СОЕДИНЕНИЕ ВТ_2_Группировка КАК ВТ_2_Группировка
    ПО ВТ_1_Группировка.Поле1 = ВТ_2_Группировка.Поле21
    И ВТ_1_Группировка.Поле2 = ВТ_2_Группировка.Поле22

    СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ВТ_1_Группировка.Поле1, ВТ_2_Группировка.Поле21),
    ЕСТЬNULL(ВТ_1_Группировка.Поле2, ВТ_2_Группировка.Поле22),
    ВЫБОР
    КОГДА НЕ ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    И НЕ ВТ_2_Группировка.Поле21 ЕСТЬ NULL
    ТОГДА 3
    КОГДА ВТ_1_Группировка.Поле1 ЕСТЬ NULL
    ТОГДА 2
    ИНАЧЕ 1
    КОНЕЦ
```
---
Сам запрос сообщением выше.
ВТ_1 - первая ТЗ.
ВТ_2 - вторая ТЗ.
В конструкторе запроса необходимо описать все поля ТЗ. Наши ТЗ помещаем во временные таблицы.
После этого создаем еще по запросу для каждой ВТ и группируем из по полям и суммируем по сумме.
Далее два возможных варианта
1. Объединение
2. Полное соединение таблиц
В полном соединении связываем по всем полям кроме суммы.
В обоих вариантах группируем поля и суммируем сумму.
Также выведено дополнительное поле чтобы понимать 1 или 2 это таблица, если в результате получаем 3 то сумма из первой и второй таблицы, если 1 то только из первой, если 2 то из второй.

В запрос также не забываем передать параметры

```1c
    Запрос.УстановитьПараметр("ТЗ1",ТЗ1.Выгрузить());
    Запрос.УстановитьПараметр("ТЗ2",ТЗ2.Выгрузить());
```
---
Также выведено дополнительное поле чтобы понимать 1 или 2 это таблица, если в результате получаем 3 то сумма из первой и второй таблицы, если 1 то только из первой, если 2 то из второй.
 Это как раз мне подходит! Но как выбрать "Поле1" если при выполнении и выгрузке запроса мы имеем только колонку "Количество"?
---
Поле1 мы сами задаем в запросе. Описываем его явно.
Можно скриншот результата?
---
Взял за скелет ваш запрос, вставил поля из своих ТЗ. При выполнении и выгрузке запроса он выбирает только колонку "Количество"
---
А в конечном итоге необходимо получить значение поля "Сумма" из Варианта 2
---
Кажись понял
(13) Выполнял напрямую запрос без менеджера врем таблиц
---
Но все равно не совсем то что нужно.
---
Но все равно не совсем то что нужно. Так а что нужно? "Сравнить" (подразумевается только чтение таблиц) или "сплюсовать" (это уже их изменение)?

И что означает "найти одинаковые строки"? Какой критерий "одинаковости"? Совпадение одной колонки? Или нескольких колонок?
---
Есть первая ТЗ_1:

Значение1 Значение2 Значение3 ЧисловоеПоле
Значение1 Значение2 Значение3 ЧисловоеПоле
Значение1 Значение2 Значение3 ЧисловоеПоле

Есть вторая ТЗ_2:

Значение1 Значение2 Значение3 ЧисловоеПоле
Значение1 Значение2 Значение3 ЧисловоеПоле
Значение1 Значение2 Значение3 ЧисловоеПоле
Значение1 Значение2 Значение3 ЧисловоеПоле

В первой таблице могут быть одинаковые строки по трем значениям. Так же и во второй таблице могут быть одинаковые строки по трем значениям.
Во второй таблице могут совпадать строки с первой таблицей. Совпадающие строки должны быть суммированы по полю ЧисловоеПоле. В конечном итоге должно получиться Если совпадают строки то сумма ЧисловоеПоле по совпавшим, иначе для каждой из не совпавших собственное ЧисловоеПоле.
---
Можно взять за образец код отсюда: https://infostart.ru/public/317778/

```1c
    ТЗ1.Свернуть("Хар,Цвет,Пластик","Расход");
    ТЗ2.Свернуть("Хар,Цвет,Пластик","Расход");

    СтруктураОтбора = Новый Структура;

    Для Каждого СтрокаТЗ2 из ТЗ2 Цикл

    СтруктураОтбора.Очистить();
    СтруктураОтбора.Вставить("Хар", СтрокаТЗ2.Хар);
    СтруктураОтбора.Вставить("Цвет", СтрокаТЗ2.Цвет);
    СтруктураОтбора.Вставить("Пластик", СтрокаТЗ2.Пластик);

    Расход2 = СтрокаТЗ2.Расход;

    мНайденныеСтроки = ТЗ1.НайтиСтроки(СтруктураОтбора);

    Для Индекс = 0 По мНайденныеСтроки.Количество() - 1 Цикл
    СтрокаТЗ1 = мНайденныеСтроки[Индекс];
    СтрокаТЗ1.Расход = СтрокаТЗ1.Расход + Расход2;
    КонецЦикла;
    КонецЦикла;
```
---
НайденныйМассивСтрок = ТЗНоменклатуры.НайтиСтроки(СтруктураОтбора);
В этой строке о какой ТЗ речь?
---
В этой строке о какой ТЗ речь? Это из черновика, уже заметил и убрал. ;)
---
А какие колонки в ТЗ есть?
---
Подключиться посмотреть можно? в лс данные для подключения
---
Вот что я наваял:

```1c
    ЗапросВРТ=Новый Запрос;
    ЗапросВРТ.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    ЗапросВРТ.Текст =

    "ВЫБРАТЬ
    | ТЗ1.Хар,
    | ТЗ1.Цвет,
    | ТЗ1.Пластик,
    | ТЗ1.Расход
    |ПОМЕСТИТЬ ВТ_1
    |ИЗ
    | &ТЗ1 КАК ТЗ1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_1.Хар КАК Хар1,
    | ВТ_1.Цвет КАК Цвет1,
    | ВТ_1.Пластик КАК Пластик1,
    | СУММА(ВТ_1.Расход) КАК Расход1
    |ПОМЕСТИТЬ ВТ_1_Группировка
    |ИЗ
    | ВТ_1 КАК ВТ_1
    |
    |СГРУППИРОВАТЬ ПО
    | ВТ_1.Хар,
    | ВТ_1.Цвет,
    | ВТ_1.Пластик
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗ2.Хар,
    | ТЗ2.Цвет,
    | ТЗ2.Пластик,
    | ТЗ2.Расход
    |ПОМЕСТИТЬ ВТ_2
    |ИЗ
    | &ТЗ2 КАК ТЗ2
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_2.Хар КАК Хар2,
    | ВТ_2.Цвет КАК Цвет2,
    | ВТ_2.Пластик КАК Пластик2,
    | СУММА(ВТ_2.Расход) КАК Расход2
    |ПОМЕСТИТЬ ВТ_2_Группировка
    |ИЗ
    | ВТ_2 КАК ВТ_2
    |
    |СГРУППИРОВАТЬ ПО
    | ВТ_2.Хар,
    | ВТ_2.Цвет,
    | ВТ_2.Пластик
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_1_Группировка.Хар1,
    | ВТ_1_Группировка.Цвет1,
    | ВТ_1_Группировка.Пластик1,
    | ВТ_1_Группировка.Расход1,
    | 1 КАК НомерТаблицы
    |ПОМЕСТИТЬ ВТ_Объединенные
    |ИЗ
    | ВТ_1_Группировка КАК ВТ_1_Группировка
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ВТ_2_Группировка.Хар2,
    | ВТ_2_Группировка.Цвет2,
    | ВТ_2_Группировка.Пластик2,
    | ВТ_2_Группировка.Расход2,
    | 2
    |ИЗ
    | ВТ_2_Группировка КАК ВТ_2_Группировка
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_Объединенные.Хар1 КАК Хар,
    | ВТ_Объединенные.Цвет1 КАК Цвет,
    | ВТ_Объединенные.Пластик1 КАК Пластик,
    | СУММА(ВТ_Объединенные.Расход1) КАК Расход,
    | СУММА(ВТ_Объединенные.НомерТаблицы) КАК НомерТаблицы
    |ПОМЕСТИТЬ Варинат1
    |ИЗ
    | ВТ_Объединенные КАК ВТ_Объединенные
    |
    |СГРУППИРОВАТЬ ПО
    | ВТ_Объединенные.Хар1,
    | ВТ_Объединенные.Цвет1,
    | ВТ_Объединенные.Пластик1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ЕСТЬNULL(ВТ_1_Группировка.Хар1, ВТ_2_Группировка.Хар2) КАК Хар,
    | ЕСТЬNULL(ВТ_1_Группировка.Цвет1, ВТ_2_Группировка.Цвет2) КАК Цвет,
    | ЕСТЬNULL(ВТ_1_Группировка.Пластик1, ВТ_2_Группировка.Пластик2) КАК Пластик,
    | СУММА(ЕСТЬNULL(ВТ_1_Группировка.Расход1, 0) + ЕСТЬNULL(ВТ_2_Группировка.Расход2, 0)) КАК Расход,
    | ВЫБОР
    | КОГДА НЕ ВТ_1_Группировка.Хар1 ЕСТЬ NULL
    | И НЕ ВТ_2_Группировка.Хар2 ЕСТЬ NULL
    | ТОГДА 3
    | КОГДА ВТ_1_Группировка.Хар1 ЕСТЬ NULL
    | ТОГДА 2
    | ИНАЧЕ 1
    | КОНЕЦ КАК НомерТаблицы
    |ПОМЕСТИТЬ Варинат2
    |ИЗ
    | ВТ_1_Группировка КАК ВТ_1_Группировка
    | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_2_Группировка КАК ВТ_2_Группировка
    | ПО ВТ_1_Группировка.Хар1 = ВТ_2_Группировка.Хар2
    | И ВТ_1_Группировка.Цвет1 = ВТ_2_Группировка.Цвет2
    | И ВТ_1_Группировка.Пластик1 = ВТ_2_Группировка.Пластик2
    |
    |СГРУППИРОВАТЬ ПО
    | ЕСТЬNULL(ВТ_1_Группировка.Хар1, ВТ_2_Группировка.Хар2),
    | ЕСТЬNULL(ВТ_1_Группировка.Цвет1, ВТ_2_Группировка.Цвет2),
    | ЕСТЬNULL(ВТ_1_Группировка.Пластик1, ВТ_2_Группировка.Пластик2),
    | ВЫБОР
    | КОГДА НЕ ВТ_1_Группировка.Хар1 ЕСТЬ NULL
    | И НЕ ВТ_2_Группировка.Хар2 ЕСТЬ NULL
    | ТОГДА 3
    | КОГДА ВТ_1_Группировка.Хар1 ЕСТЬ NULL
    | ТОГДА 2
    | ИНАЧЕ 1
    | КОНЕЦ";
    ЗапросВРТ.УстановитьПараметр("ТЗ1",ТЧ.Выгрузить());
    ЗапросВРТ.УстановитьПараметр("ТЗ2",ТЧMultiFactura.Выгрузить());
    Рез = ЗапросВРТ.Выполнить();

    ////////////////////////////////////////////////////////////­//////////////////////

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = ЗапросВРТ.МенеджерВременныхТаблиц;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Варинат1.Хар КАК Хар,
    | Варинат1.Цвет,
    | Варинат1.Пластик,
    | Варинат1.Расход
    |ИЗ
    | Варинат1 КАК Варинат1";
    Рез1 = Запрос.Выполнить().Выгрузить();
    Для Каждого Стр из Рез1 Цикл
    Сообщить(" "+Стр.Хар+" "+Стр.Цвет+" "+Стр.Пластик+" = "+Стр.Расход);
    КонецЦикла;
```
---
Сейчас посмотрю
---
Вот что навоял во внешней обработке, все собирает корректно. с соединением isnull некорректно отрабатывает

```1c
    тзн1 = Новый ТаблицаЗначений;
    тзн1.Колонки.Добавить("Хар",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Цвет",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Пластик",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Расход",Новый ОписаниеТипов("Число"));
    тзн2 = Новый ТаблицаЗначений;
    тзн2.Колонки.Добавить("Хар",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Цвет",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Пластик",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Расход",Новый ОписаниеТипов("Число"));

    стртзн1 = тзн1.Добавить();
    стртзн1.Хар = "Жесткий";
    стртзн1.Цвет = "Красный";
    стртзн1.Пластик = "Ребристый";
    стртзн1.Расход = 10;

    стртзн1 = тзн1.Добавить();
    стртзн1.Хар = "Мягкий";
    стртзн1.Цвет = "Синий";
    стртзн1.Пластик = "Гладкий";
    стртзн1.Расход = 5;

    стртзн2 = тзн2.Добавить();
    стртзн2.Хар = "Мягкий";
    стртзн2.Цвет = "Синий";
    стртзн2.Пластик = "Гладкий";
    стртзн2.Расход = 6;

    ЗапросВРТ=Новый Запрос;

    ЗапросВРТ.Текст =

    "ВЫБРАТЬ
    | ТЗ1.Хар,
    | ТЗ1.Цвет,
    | ТЗ1.Пластик,
    | ТЗ1.Расход
    |ПОМЕСТИТЬ ВТ_1
    |ИЗ
    | &ТЗ1 КАК ТЗ1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВЫРАЗИТЬ(ВТ_1.Хар КАК СТРОКА(100)) КАК Хар1,
    | ВЫРАЗИТЬ(ВТ_1.Цвет КАК СТРОКА(100)) КАК Цвет1,
    | ВЫРАЗИТЬ(ВТ_1.Пластик КАК СТРОКА(100)) КАК Пластик1,
    | СУММА(ВТ_1.Расход) КАК Расход1
    |ПОМЕСТИТЬ ВТ_1_Группировка
    |ИЗ
    | ВТ_1 КАК ВТ_1
    |
    |СГРУППИРОВАТЬ ПО
    | ВЫРАЗИТЬ(ВТ_1.Хар КАК СТРОКА(100)),
    | ВЫРАЗИТЬ(ВТ_1.Цвет КАК СТРОКА(100)),
    | ВЫРАЗИТЬ(ВТ_1.Пластик КАК СТРОКА(100))
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗ2.Хар,
    | ТЗ2.Цвет,
    | ТЗ2.Пластик,
    | ТЗ2.Расход
    |ПОМЕСТИТЬ ВТ_2
    |ИЗ
    | &ТЗ2 КАК ТЗ2
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВЫРАЗИТЬ(ВТ_2.Хар КАК СТРОКА(100)) КАК Хар2,
    | ВЫРАЗИТЬ(ВТ_2.Цвет КАК СТРОКА(100)) КАК Цвет2,
    | ВЫРАЗИТЬ(ВТ_2.Пластик КАК СТРОКА(100)) КАК Пластик2,
    | СУММА(ВТ_2.Расход) КАК Расход2
    |ПОМЕСТИТЬ ВТ_2_Группировка
    |ИЗ
    | ВТ_2 КАК ВТ_2
    |
    |СГРУППИРОВАТЬ ПО
    | ВЫРАЗИТЬ(ВТ_2.Хар КАК СТРОКА(100)),
    | ВЫРАЗИТЬ(ВТ_2.Цвет КАК СТРОКА(100)),
    | ВЫРАЗИТЬ(ВТ_2.Пластик КАК СТРОКА(100))
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_1_Группировка.Хар1,
    | ВТ_1_Группировка.Цвет1,
    | ВТ_1_Группировка.Пластик1,
    | ВТ_1_Группировка.Расход1,
    | 1 КАК НомерТаблицы
    |ПОМЕСТИТЬ ВТ_Объединенные
    |ИЗ
    | ВТ_1_Группировка КАК ВТ_1_Группировка
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ВТ_2_Группировка.Хар2,
    | ВТ_2_Группировка.Цвет2,
    | ВТ_2_Группировка.Пластик2,
    | ВТ_2_Группировка.Расход2,
    | 2
    |ИЗ
    | ВТ_2_Группировка КАК ВТ_2_Группировка
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_Объединенные.Хар1 КАК Хар,
    | ВТ_Объединенные.Цвет1 КАК Цвет,
    | ВТ_Объединенные.Пластик1 КАК Пластик,
    | СУММА(ВТ_Объединенные.Расход1) КАК Расход,
    | СУММА(ВТ_Объединенные.НомерТаблицы) КАК НомерТаблицы
    |ПОМЕСТИТЬ Варинат1
    |ИЗ
    | ВТ_Объединенные КАК ВТ_Объединенные
    |
    |СГРУППИРОВАТЬ ПО
    | ВТ_Объединенные.Хар1,
    | ВТ_Объединенные.Цвет1,
    | ВТ_Объединенные.Пластик1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Варинат1.Хар,
    | Варинат1.Цвет,
    | Варинат1.Пластик,
    | Варинат1.Расход,
    | Варинат1.НомерТаблицы
    |ИЗ
    | Варинат1 КАК Варинат1";
    ЗапросВРТ.УстановитьПараметр("ТЗ1",тзн1);
    ЗапросВРТ.УстановитьПараметр("ТЗ2",тзн2);
    Рез = ЗапросВРТ.Выполнить().Выгрузить();
```
---
Не нравится мне напрасно мучить сервер)

```1c
    тзн1 = Новый ТаблицаЗначений;
    тзн1.Колонки.Добавить("Поле1");
    тзн1.Колонки.Добавить("Сумма");
    тзн2 = Новый ТаблицаЗначений;
    тзн2.Колонки.Добавить("Поле1");
    тзн2.Колонки.Добавить("Сумма");
    стртзн1 = тзн1.Добавить();
    стртзн1.Поле1 = "Кря";
    стртзн1.Сумма = 1;
    стртзн1 = тзн1.Добавить();
    стртзн1.Поле1 = "Ква";
    стртзн1.Сумма = 1;
    стртзн1 = тзн1.Добавить();
    стртзн1.Поле1 = "Кря";
    стртзн1.Сумма = 2;
    стртзн1 = тзн1.Добавить();
    стртзн1.Поле1 = "Ква";
    стртзн1.Сумма = 2;
    стртзн2 = тзн2.Добавить();
    стртзн2.Поле1 = "Ква";
    стртзн2.Сумма = 3;
    тзн1.Свернуть("Поле1","Сумма");
    тзн2.Свернуть("Поле1","Сумма");
    Для Каждого стртзн из тзн1 Цикл
    мв = тзн2.НайтиСтроки(Новый Структура("Поле1", стртзн.Поле1));
    Если мв.Количество()>0 Тогда
    стртзн.Сумма = стртзн.Сумма + мв[0].Сумма;
    КонецЕсли;
    КонецЦикла;
    ОткрытьЗначение(тзн1);
```
---
я может немного не допонял условие задачи.
Но нельзя ли просто в первую таблицу добавить другую (или в копию первой) и вызвать старый добрый Свернуть?
---
Скопировать по отбору?
---
можно. Я просто сначала свернул, потом добавил, чтоб добавлять меньше. Из 25 комментария следует, что так лучше топикстартеру, поскольку так не теряются строчки, которые есть только во второй таблице. Из изначальной постановки было непонятно, что они нужны.
---
Из изначальной постановки было непонятно, что они нужны.он сразу написал, что еще нужно сравнить обе ТЗ и между собой.
---
Но в таком случае некоторые уникальные строки из ТЗ_2 суммируются со строками из ТЗ_1 по полю "Расход" А необходимо чтобы если строка уникальна то она имела свой "Расход" а не сплюсованный со строкой из ТЗ_1
---
не очень понял. В условии по колонке "Сумма" пример:

Вот таблица А (Ключ, Сумма):
А, 1
Б, 2
В, 3

Вот таблица Б (Ключ, Сумма):
Б, 3
В, 5
Г, 6

Какой результат должен быть и как он формируется?
---
Тогда использовать связи(второй вариант) но избавиться от isnull
---
вам проще свернуть таблицы значений
---
Сворачиваем первую тз, вторую тз тоже сворачиваем.

ЗначениеВСтрокуВНутр обе тз и сравниваем строку
---
действительно, как вам не раз подсказали таблицы значений можно просто свернуть
---
```1c
    тзн1 = Новый ТаблицаЗначений;
    тзн1.Колонки.Добавить("Хар",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Цвет",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Пластик",Новый ОписаниеТипов("Строка"));
    тзн1.Колонки.Добавить("Расход",Новый ОписаниеТипов("Число"));
    тзн2 = Новый ТаблицаЗначений;
    тзн2.Колонки.Добавить("Хар",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Цвет",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Пластик",Новый ОписаниеТипов("Строка"));
    тзн2.Колонки.Добавить("Расход",Новый ОписаниеТипов("Число"));

    стртзн1 = тзн1.Добавить();
    стртзн1.Хар = "Жесткий";
    стртзн1.Цвет = "Красный";
    стртзн1.Пластик = "Ребристый";
    стртзн1.Расход = 10;

    стртзн1 = тзн1.Добавить();
    стртзн1.Хар = "Мягкий";
    стртзн1.Цвет = "Синий";
    стртзн1.Пластик = "Гладкий";
    стртзн1.Расход = 5;

    стртзн2 = тзн2.Добавить();
    стртзн2.Хар = "Мягкий";
    стртзн2.Цвет = "Синий";
    стртзн2.Пластик = "Гладкий";
    стртзн2.Расход = 6;
    Для Каждого стртзн2 Из тзн2 Цикл
    стртзн1 = тзн1.Добавить();
    ЗаполнитьЗначенияСвойств(стртзн1, стртзн2);
    КонецЦикла;
    тзн1.Свернуть("Хар,Цвет,Пластик","Расход");
    ОткрытьЗначение(тзн1);
```
---
Вообще кстати в условии не говорится, что таблица типизирована. Поэтому вариантом решения без запроса будет свертывание по полям ресурсов, затем в цикле перебор строк и поиск методом НайтиСтроки в таблице по структуре полей, затем добавление суммы к сумме в строке суммами из найденных строк.
---
НайтиСтроки ищет строки целиком.
А все, почему-то, забывают, что у ТС в разных таблицах - может быть что угодно в одинаково названных полях. Вплоть до разных типов данных, кстати.
---
Вот так:

```1c
    ТЗ_1.Свернуть("<Поля группировки>", "Сумма");
    ТЗ_2.Свернуть("<Поля группировки>", "Сумма");
    Для каждого Стр из ТЗ_1 Цикл
    МассивСтрокТЗ_2 = ТЗ_2.НайтиСтроки(Новый Структура("<Поля группировки>", <Значения полей>));
    Для Каждого Эл из МассивСтрокТЗ_2 Цикл
    Стр.Сумма = Стр.Сумма + Эл.Сумма;
    КонецЦикла;
    КонецЦикла;
```
---
тогда делается колонка Источник со значением 1 в первой таблице и 2 в другой.
Таблицы сливаются в одну с суммой по Сумма.
Далее по колонке Источник определяется, есть ли строка в первой таблице (1) или в другой (2) или в обоих (3). Экономнее и быстрее.
---
в смысле, как определяется? У ТС не указано, какое поле - ключевое, и определяет "эта строка равна той строке".
Там может быть все, что угодно, сравнивать по такой постановке задачи - нужно целиком строка-к-строке, по каждому полю.
---
у вас таблицы должны быть однозначно типизированы, плюс - определены ключевые поля, которые должны совпадать в обеих таблицах, и быть обязательно заполнены.
Да еще и все <Значения полей> (т.е. предугадать, какие значения - повторные; иначе - грузите все-ко-всему для сравнения) нужно жестко определить и передать.
Т.е. по сути - сравнивается одна и та же таблица сама к себе. Что может в корне отличаться от "авторского" замысла.
Не говоря уже про производительность - на реальных таблицах от тысяч строк все встанет колом (соединение "все-ко-всему").
---
про производительность посмеялся. Не всегда работа идет с большими таблицами.
да, запросом правильно, но иногда можно и сворачивать.
---
Варианта
"Сворачиваем ТЗ1, сворачиваем ТЗ2, добавляем строки ТЗ2 - в ТЗ1, сворачиваем ТЗ1" - не было?
---
здесь право нужно топить за массив
Функция ИсключающееИЛИ(Массив1, Массив2)
 Результат = Новый Массив;
 Повтор = Новый Соответствие;
 Для каждого Элемент Из Массив1 Цикл
  Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина);
 КонецЦикла;
 Для каждого Элемент Из Массив2 Цикл
  Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина);
 КонецЦикла;
 Для каждого Элемент Из Повтор Цикл
  Если НЕ Элемент.Значение Тогда
   Результат.Добавить(Элемент.Ключ);
  КонецЕсли
 КонецЦикла;
 Возврат Результат;//массив
КонецФункции