Можно использовать ТЗ для группирования результата, а можно при переборе значений первого запроса получать результаты из второго методом Получить(), позиционируясь на товаре первого запроса.
Примерно второй вариант выглядит так:
Запрос1 = СоздатьОбъект("Запрос");
ТекстЗапроса1 =
"//{{ЗАПРОС(Запрос1)
|Период с ВыбНачПериода по ВыбКонПериода;
|Товар = Регистр.ОстаткиТоваров.Товар;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция НачОстТовара = НачОст(ОстатокТовара);
...
|Группировка Товар;
|"//}}ЗАПРОС
;
Если Запрос1.Выполнить(ТекстЗапроса1) = 0 Тогда
Возврат;
КонецЕсли;
Дата1=ДобавитьМесяц(ВыбНачПериода,-12);
Дата2=ДобавитьМесяц(ВыбКонПериода,-12);
Запрос2 = СоздатьОбъект("Запрос");
ТекстЗапроса2 =
"//{{ЗАПРОС(Запрос2)
|Период с Дата1 по Дата2;
|Товар = Регистр.ОстаткиТоваров.Товар;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|ФлагУчета=Регистр.ОстаткиТоваров.ФлагУчета;
|Функция НачОстТовара = НачОст(ОстатокТовара);
...
|Группировка Товар Все;
|"//}}ЗАПРОС
;
Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос1.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("Товар|Запрос1");
Запрос2.Получить(Запрос1.Товар);
Таб.ПрисоединитьСекцию("Товар|Запрос2");
КонецЦикла;
Добавлю. Если нужно выводить и те товары, которые в текущем периоде не имели остатков/оборотов, а в прошлогоднем имели, то в первом запросе также необходимо для группировки указать ключевое слово Все. Чтобы избежать вывода строк с товарами, которые не имели итогов ни в каком периоде, можно добавить условие при формировании таблицы.