Есть две таблички с одинаковыми колонками - Контрагент и количество, одна таблица за предыдущий период, вторая за текущий - анализ продаж такой себе. Как так сделать табличку - один столбик все контрагенты, второй с цифрами за предыдущий период, третья колонка с цифрами за текущий период. Не хватает пока что знаний для реализации. Спасибо
---
Можно двумя вариантами (предполагаю, что таблицы называются ТЗТекущая и ТЗПредыдущая):
1) перебор (проще, но медленнее, и работает в том числе на Клиенте с небольшими изменениями)

```1c
    ТЗПредыдущая = Новый ТаблицаЗначений;
    ТЗТекущая = Новый ТаблицаЗначений;
    ТЗОбъединенная = Новый ТаблицаЗначений;
    ТЗОбъединенная.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    ТЗОбъединенная.Колонки.Добавить("КоличествоПредыдущее",Новый ОписаниеТипов("Число"));
    ТЗОбъединенная.Колонки.Добавить("КоличествоТекущее",Новый ОписаниеТипов("Число"));
    Для Каждого Строка1 Из ТЗПредыдущая Цикл
    НС = ТЗОбъединенная.Добавить();
    НС.Контрагент = Строка1.Контрагент;
    НС.КоличествоПредыдущее = Строка1.Количество;
    Строка2 = ТЗТекущая.Найти(Строка1.Контрагент,"Контрагент");
    Если Строка2<>Неопределено Тогда
    НС.КоличествоТекущее = Строка2.Количество;
    Иначе
    НС.КоличествоТекущее = 0;
    КонецЕсли;
    КонецЦикла;
    Для Каждого Строка2 Из ТЗТекущая Цикл
    Строка1 = ТЗПредыдущая.Найти(Строка2.Контрагент,"Контрагент");
    Если Строка1=Неопределено Тогда
    НС = ТЗОбъединенная.Добавить();
    НС.Контрагент = Строка2.Контрагент;
    НС.КоличествоПредыдущее = 0;
    НС.КоличествоТекущее = Строка2.Количество;
    КонецЕсли;
    КонецЦикла;
```

2) запрос (сложнее, но быстрее)

```1c
    ЗапросТЗ = Новый Запрос;
    ЗапросТЗ.Текст = "ВЫБРАТЬ
    | ТЗПредыдущая.Контрагент КАК Контрагент,
    | ТЗПредыдущая.Количество
    |ПОМЕСТИТЬ ТЗПредыдущая
    |ИЗ
    | &ТЗПредыдущая КАК ТЗПредыдущая
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Контрагент
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗТекущая.Контрагент КАК Контрагент,
    | ТЗТекущая.Количество
    |ПОМЕСТИТЬ ТЗТекущая
    |ИЗ
    | &ТЗТекущая КАК ТЗТекущая
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Контрагент
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ЕСТЬNULL(ТЗПредыдущая.Контрагент, ТЗТекущая.Контрагент) КАК Контрагент,
    | ЕСТЬNULL(ТЗПредыдущая.Количество, 0) КАК КоличествоПредыдущее,
    | ЕСТЬNULL(ТЗТекущая.Количество, 0) КАК КоличествоТекущее
    |ИЗ
    | ТЗПредыдущая КАК ТЗПредыдущая
    | ПОЛНОЕ СОЕДИНЕНИЕ ТЗТекущая КАК ТЗТекущая
    | ПО (ТЗПредыдущая.Контрагент = ТЗТекущая.Контрагент)";
    ЗапросТЗ.УстановитьПараметр("ТЗТекущая",ТЗТекущая);
    ЗапросТЗ.УстановитьПараметр("ТЗПредыдущая",ТЗПредыдущая);
    ТЗОбъединенная = ЗапросТЗ.Выполнить().Выгрузить();
```

В этом запросе объединяются обе таблицы, причём "пустых" значений null не получается: если по контрагенту в одной из таблиц отсутствуют сведения, то в результате в соответствующей колонке будет 0. Это Вам поможет потом обрабатывать. Ну, и мелкие оптимизации вроде индексов, чтобы работало быстрее...
---
запишитесь на курсы по запросам. Можно сразу на курс 10774
---
```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | тзПрошлыйПериод.Контрагент,
    | тзПрошлыйПериод.Количество КАК КоличествоЗаПрошлыйПериод
    |ПОМЕСТИТЬ ВТ_ПрошлыйПериод
    |ИЗ
    | &тзПрошлыйПериод КАК тзПрошлыйПериод
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | тзТекущийПериод.Контрагент,
    | тзТекущийПериод.Количество КАК КоличествоЗаТекущийПериод
    |ПОМЕСТИТЬ ВТ_ТекущийПериод
    |ИЗ
    | &тзТекущийПериод КАК тзТекущийПериод
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВложенныйЗапрос.Контрагент,
    | СУММА(ВложенныйЗапрос.КоличествоЗаПрошлыйПериод) КАК КоличествоЗаПрошлыйПериод,
    | СУММА(ВложенныйЗапрос.КоличествоЗаТекущийПериод) КАК КоличествоЗаТекущийПериод
    |ИЗ
    | (ВЫБРАТЬ
    | ВТ_ПрошлыйПериод.Контрагент КАК Контрагент,
    | ВТ_ПрошлыйПериод.КоличествоЗаПрошлыйПериод КАК КоличествоЗаПрошлыйПериод,
    | 0 КАК КоличествоЗаТекущийПериод
    | ИЗ
    | ВТ_ПрошлыйПериод КАК ВТ_ПрошлыйПериод
    |
    | ОБЪЕДИНИТЬ ВСЕ
    |
    | ВЫБРАТЬ
    | ВТ_ТекущийПериод.Контрагент,
    | 0,
    | ВТ_ТекущийПериод.КоличествоЗаТекущийПериод
    | ИЗ
    | ВТ_ТекущийПериод КАК ВТ_ТекущийПериод) КАК ВложенныйЗапрос
    |
    |СГРУППИРОВАТЬ ПО
    | ВложенныйЗапрос.Контрагент";

    Запрос.УстановитьПараметр("тзПрошлыйПериод", тзЗаПрошлыйПериод);
    Запрос.УстановитьПараметр("тзТекущийПериод", тзЗаТекущийПериод);
    тзРезультат = Запрос.Выполнить().Выгрузить();
```
---
я бы сделал так
1) обе таблицы загнал в MXL
2) передал их параметрами в запрос

```1c
    ВЫБРАТЬ
    Внешний.Контрагент,
    Внешний.СуммаПред
    ПОМЕСТИТЬ врТЗВнеш
    ИЗ
    &ВнешнийИсточник КАК Внешний
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Внешний2.Контрагент,
    Внешний2.СуммТекущ
    ПОМЕСТИТЬ врТЗВнеш2
    ИЗ
    &ВнешнийИсточник2 КАК Внешний2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    врТЗВнеш.Контрагент,
    врТЗВнеш.СуммаПред,
    врТЗВнеш2.СуммТекущ
    ИЗ
    врТЗВнеш КАК врТЗВнеш
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ врТЗВнеш2 КАК врТЗВнеш2
    ПО врТЗВнеш.Контрагент = врТЗВнеш2.Контрагент
```

3) Результатом будет соединение двух таблиц в одну по наименованию контрагента

Скриншоты во вложениях
---
Всем спасибо, получилось. Теперь буду знать, я как то не могу всё это познать вместе по отдельности делаю , а слепить не хватает знаний. Курсы по запросам, было бы неплохо, только не понял что такое " Можно сразу на курс 10774"
(4) Это уже круто вообще , только не понял зачем выгружать
Всё спасибо всем, по сути все одно и тоже предлагают и ОНО правильно - запросом с ВТ.
---
(4) Это уже круто вообще Увы, нет. Круто и корректно - это как в (2), (5), (6).
---
а если контрагенты разные ,точнее в этом году есть такой контрагент а в прошлом не было
---
Правильно. А ещё неплохо бы в этом случае не получать Null в качестве суммы! Ну, и чтобы запрос быстрее отрабатывал...
---
Как-то так, наверно. Помещаешь свои таблицы в запрос и соединяешь их

```1c
    "ВЫБРАТЬ
    | ТЗ1.Контрагент,
    | ТЗ1.КоличествоПредыдущийМесяц
    |ПОМЕСТИТЬ ВТ_ПредыдущийМесяц
    |ИЗ
    | &ТЗ1 КАК ТЗ1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗ2.Контрагент,
    | ТЗ2.КоличествоТекущийМесяц
    |ПОМЕСТИТЬ ВТ_ТекущийМесяц
    |ИЗ
    | &ТЗ2 КАК ТЗ2
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_ПредыдущийМесяц.Контрагент,
    | ВТ_ПредыдущийМесяц.КоличествоПредыдущийМесяц,
    | ВТ_ТекущийМесяц.КоличествоТекущийМесяц,
    | ВТ_ТекущийМесяц.Контрагент КАК Контрагент1
    |ИЗ
    | ВТ_ПредыдущийМесяц КАК ВТ_ПредыдущийМесяц
    | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ТекущийМесяц КАК ВТ_ТекущийМесяц
    | ПО ВТ_ПредыдущийМесяц.Контрагент = ВТ_ТекущийМесяц.Контрагент"
```
---
Можно двумя вариантами (предполагаю, что таблицы называются ТЗТекущая и ТЗПредыдущая):
1) перебор (проще, но медленнее, и работает в том числе на Клиенте с небольшими изменениями)

```1c
    ТЗПредыдущая = Новый ТаблицаЗначений;
    ТЗТекущая = Новый ТаблицаЗначений;
    ТЗОбъединенная = Новый ТаблицаЗначений;
    ТЗОбъединенная.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    ТЗОбъединенная.Колонки.Добавить("КоличествоПредыдущее",Новый ОписаниеТипов("Число"));
    ТЗОбъединенная.Колонки.Добавить("КоличествоТекущее",Новый ОписаниеТипов("Число"));
    Для Каждого Строка1 Из ТЗПредыдущая Цикл
    НС = ТЗОбъединенная.Добавить();
    НС.Контрагент = Строка1.Контрагент;
    НС.КоличествоПредыдущее = Строка1.Количество;
    Строка2 = ТЗТекущая.Найти(Строка1.Контрагент,"Контрагент");
    Если Строка2<>Неопределено Тогда
    НС.КоличествоТекущее = Строка2.Количество;
    Иначе
    НС.КоличествоТекущее = 0;
    КонецЕсли;
    КонецЦикла;
    Для Каждого Строка2 Из ТЗТекущая Цикл
    Строка1 = ТЗПредыдущая.Найти(Строка2.Контрагент,"Контрагент");
    Если Строка1=Неопределено Тогда
    НС = ТЗОбъединенная.Добавить();
    НС.Контрагент = Строка2.Контрагент;
    НС.КоличествоПредыдущее = 0;
    НС.КоличествоТекущее = Строка2.Количество;
    КонецЕсли;
    КонецЦикла;
```

2) запрос (сложнее, но быстрее)

```1c
    ЗапросТЗ = Новый Запрос;
    ЗапросТЗ.Текст = "ВЫБРАТЬ
    | ТЗПредыдущая.Контрагент КАК Контрагент,
    | ТЗПредыдущая.Количество
    |ПОМЕСТИТЬ ТЗПредыдущая
    |ИЗ
    | &ТЗПредыдущая КАК ТЗПредыдущая
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Контрагент
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗТекущая.Контрагент КАК Контрагент,
    | ТЗТекущая.Количество
    |ПОМЕСТИТЬ ТЗТекущая
    |ИЗ
    | &ТЗТекущая КАК ТЗТекущая
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Контрагент
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ЕСТЬNULL(ТЗПредыдущая.Контрагент, ТЗТекущая.Контрагент) КАК Контрагент,
    | ЕСТЬNULL(ТЗПредыдущая.Количество, 0) КАК КоличествоПредыдущее,
    | ЕСТЬNULL(ТЗТекущая.Количество, 0) КАК КоличествоТекущее
    |ИЗ
    | ТЗПредыдущая КАК ТЗПредыдущая
    | ПОЛНОЕ СОЕДИНЕНИЕ ТЗТекущая КАК ТЗТекущая
    | ПО (ТЗПредыдущая.Контрагент = ТЗТекущая.Контрагент)";
    ЗапросТЗ.УстановитьПараметр("ТЗТекущая",ТЗТекущая);
    ЗапросТЗ.УстановитьПараметр("ТЗПредыдущая",ТЗПредыдущая);
    ТЗОбъединенная = ЗапросТЗ.Выполнить().Выгрузить();
```

В этом запросе объединяются обе таблицы, причём "пустых" значений null не получается: если по контрагенту в одной из таблиц отсутствуют сведения, то в результате в соответствующей колонке будет 0. Это Вам поможет потом обрабатывать. Ну, и мелкие оптимизации вроде индексов, чтобы работало быстрее...