Есть внешняя тз, как добавить ее в скд разобрался, как связать с запросом в скд разобрался, но проблема в том, что после связи надо еще раз свернуть получившийся результат и часть полей просуммировать. Собственно, как это сделать, или как передать внешнюю тз в запрос в скд? Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал, просто интересно, можно ли без особых танцев с бубном передать внешнюю тз в запрос.
---
пока нельзя тз передать в запрос СКД без извращений.

посему Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал это единственный способ, который активно используют в современных конфигурациях.

Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.

Для простых тз я тоже делаю примерно так

```1c
    Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)

    ТзПериоды = ПармВставки.ТзПериоды;
    Если НЕ ТзПериоды.Количество() Тогда
    ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
    ВызватьИсключение ТекстИсключения;
    КонецЕсли;
    // ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}

    // Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
    мКолонки = Новый Массив;
    Для каждого тКолонка Из ТзПериоды.Колонки Цикл
    мКолонки.Добавить(тКолонка.Имя);
    КонецЦикла;
    СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
    ТзПериодыУник = ТзПериоды.Скопировать();
    ТзПериодыУник.Свернуть(СтрокаИменКолонок);
    ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");

    // Текст первой секции и пример второй из запроса-объединения в СКД.
    // Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
    // Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
    // формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
    // шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
    //
    // |.... голова пакетов запроса
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
    // | 0 КАК ДнейПериода,
    // | 0 КАК ДнейРабочих
    // |ПОМЕСТИТЬ ВтПериоды
    // |ГДЕ
    // | &ПараметрПериоды
    // |
    // |ОБЪЕДИНИТЬ ВСЕ
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(2017, 11, 1),
    // | ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
    // | 30,
    // | 22";

    ЗапросТекстВставка = ";
    ЗапросТекстШаблон1 = "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ДАТАВРЕМЯ(%1, %2, %3),
    | ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
    ЗапросТекстШаблон2 = "
    | %1,
    | %2";

    мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
    Для каждого СтрокаТз Из ТзПериодыУник Цикл

    НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
    НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
    КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");

    Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
    мУжеОбработано.Добавить(КлючИнтервала);
    Иначе
    Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
    КонецЕсли;

    ПараметрыЗамены1 = Новый Структура;
    ПараметрыЗамены1.Вставить("_1", Формат(Год (НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_4", Формат(Год (НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_7", "23");
    ПараметрыЗамены1.Вставить("_8", "59");
    ПараметрыЗамены1.Вставить("_9", "59");

    ПараметрыЗамены2 = Новый Структура;
    ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
    ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));

    ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1,
    ПараметрыЗамены1._1,
    ПараметрыЗамены1._2,
    ПараметрыЗамены1._3,
    ПараметрыЗамены1._4,
    ПараметрыЗамены1._5,
    ПараметрыЗамены1._6,
    ПараметрыЗамены1._7,
    ПараметрыЗамены1._8,
    ПараметрыЗамены1._9);

    ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2,
    ПараметрыЗамены2._1,
    ПараметрыЗамены2._2);

    ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;

    КонецЦикла;

    Возврат ЗапросТекстВставка;

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

    Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П­олучитьТекстВставки(ПармВставки)

    ТзПериоды = ПармВставки.ТзПериоды;
    Если НЕ ТзПериоды.Количество() Тогда
    ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
    ВызватьИсключение ТекстИсключения;
    КонецЕсли;
    // ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}

    ИмяКолонкиГраницыПериода = "ДатаОкончания";
    ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
    ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
    ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);

    // Текст первой секции и пример второй из запроса-объединения в СКД.
    // Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
    // Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
    // формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
    // шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
    //
    // Обратите внимание, что
    // - в качестве поля ДатаОкончания - выступает конец дня,
    // - в качестве параметра остатков - выступает начало следующего дня, что аналогично
    // ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления.
    //
    // |
    // |.... тут может быть выборка вложенных полей
    // | ПОМЕСТИТЬ ВтОстатки
    // |.... тут может быть соединение с другими таблицами
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
    // | СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
    // | СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
    // | СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
    // | СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
    // | ИЗ
    // | РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
    // | ГДЕ
    // | &ПараметрОстатки
    // |
    // |ОБЪЕДИНИТЬ ВСЕ
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
    // | СбТвОстатки.АналитикаУчетаНоменклатуры,
    // | СбТвОстатки.ВидЗапасов,
    // | СбТвОстатки.КоличествоОстаток,
    // | СбТвОстатки.СтоимостьОстаток
    // |ИЗ
    // | РегистрНакопления.СебестоимостьТоваров.Остатки(
    // | ДАТАВРЕМЯ(2017, 8, 1),
    // | АналитикаУчетаНоменклатуры В
    // | (ВЫБРАТЬ
    // | ВтАналитикаУчетаНоменклатуры.КлючАналитики
    // | ИЗ
    // | ВтАналитикаУчетаНоменклатуры)
    // | И ВидЗапасов В
    // | (ВЫБРАТЬ
    // | ВтВидыЗапасов.ВидЗапасов
    // | ИЗ
    // | ВтВидыЗапасов)) КАК СбТвОстатки";

    ЗапросТекстВставка = ";
    ЗапросТекстШаблон = "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
    | СбТвОстатки.АналитикаУчетаНоменклатуры,
    | СбТвОстатки.ВидЗапасов,
    | СбТвОстатки.КоличествоОстаток,
    | СбТвОстатки.СтоимостьОстаток
    |ИЗ
    | РегистрНакопления.СебестоимостьТоваров.Остатки(
    | ДАТАВРЕМЯ(%7, %8, %9),
    | АналитикаУчетаНоменклатуры В
    | (ВЫБРАТЬ
    | ВтАналитикаУчетаНоменклатуры.КлючАналитики
    | ИЗ
    | ВтАналитикаУчетаНоменклатуры)
    | И ВидЗапасов В
    | (ВЫБРАТЬ
    | ВтВидыЗапасов.ВидЗапасов
    | ИЗ
    | ВтВидыЗапасов)) КАК СбТвОстатки";

    мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
    Для каждого СтрокаТз Из ТзПериодыДатаК Цикл

    НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
    Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
    мУжеОбработано.Добавить(НачалоДняДатаОкончания);
    Иначе
    Продолжить; // Уже был такой день даты окончания
    КонецЕсли;
    НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;

    ПараметрыЗамены = Новый Структура;
    ПараметрыЗамены.Вставить("_1", Формат(Год (НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_4", "23");
    ПараметрыЗамены.Вставить("_5", "59");
    ПараметрыЗамены.Вставить("_6", "59");
    ПараметрыЗамены.Вставить("_7", Формат(Год (НачалоСледующегоДня), "ЧГ="));
    ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
    ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));

    ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон,
    ПараметрыЗамены._1,
    ПараметрыЗамены._2,
    ПараметрыЗамены._3,
    ПараметрыЗамены._4,
    ПараметрыЗамены._5,
    ПараметрыЗамены._6,
    ПараметрыЗамены._7,
    ПараметрыЗамены._8,
    ПараметрыЗамены._9);

    ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;

    КонецЦикла;

    Возврат ЗапросТекстВставка;

    КонецФункции
```
---
пока нельзя тз передать в запрос СКД без извращений.

посему Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал это единственный способ, который активно используют в современных конфигурациях.

Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.

Для простых тз я тоже делаю примерно так

```1c
    Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)

    ТзПериоды = ПармВставки.ТзПериоды;
    Если НЕ ТзПериоды.Количество() Тогда
    ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
    ВызватьИсключение ТекстИсключения;
    КонецЕсли;
    // ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}

    // Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
    мКолонки = Новый Массив;
    Для каждого тКолонка Из ТзПериоды.Колонки Цикл
    мКолонки.Добавить(тКолонка.Имя);
    КонецЦикла;
    СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
    ТзПериодыУник = ТзПериоды.Скопировать();
    ТзПериодыУник.Свернуть(СтрокаИменКолонок);
    ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");

    // Текст первой секции и пример второй из запроса-объединения в СКД.
    // Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
    // Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
    // формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
    // шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
    //
    // |.... голова пакетов запроса
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
    // | 0 КАК ДнейПериода,
    // | 0 КАК ДнейРабочих
    // |ПОМЕСТИТЬ ВтПериоды
    // |ГДЕ
    // | &ПараметрПериоды
    // |
    // |ОБЪЕДИНИТЬ ВСЕ
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(2017, 11, 1),
    // | ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
    // | 30,
    // | 22";

    ЗапросТекстВставка = ";
    ЗапросТекстШаблон1 = "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ДАТАВРЕМЯ(%1, %2, %3),
    | ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
    ЗапросТекстШаблон2 = "
    | %1,
    | %2";

    мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
    Для каждого СтрокаТз Из ТзПериодыУник Цикл

    НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
    НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
    КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");

    Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
    мУжеОбработано.Добавить(КлючИнтервала);
    Иначе
    Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
    КонецЕсли;

    ПараметрыЗамены1 = Новый Структура;
    ПараметрыЗамены1.Вставить("_1", Формат(Год (НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
    ПараметрыЗамены1.Вставить("_4", Формат(Год (НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
    ПараметрыЗамены1.Вставить("_7", "23");
    ПараметрыЗамены1.Вставить("_8", "59");
    ПараметрыЗамены1.Вставить("_9", "59");

    ПараметрыЗамены2 = Новый Структура;
    ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
    ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));

    ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1,
    ПараметрыЗамены1._1,
    ПараметрыЗамены1._2,
    ПараметрыЗамены1._3,
    ПараметрыЗамены1._4,
    ПараметрыЗамены1._5,
    ПараметрыЗамены1._6,
    ПараметрыЗамены1._7,
    ПараметрыЗамены1._8,
    ПараметрыЗамены1._9);

    ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2,
    ПараметрыЗамены2._1,
    ПараметрыЗамены2._2);

    ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;

    КонецЦикла;

    Возврат ЗапросТекстВставка;

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

    Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П­олучитьТекстВставки(ПармВставки)

    ТзПериоды = ПармВставки.ТзПериоды;
    Если НЕ ТзПериоды.Количество() Тогда
    ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
    ВызватьИсключение ТекстИсключения;
    КонецЕсли;
    // ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}

    ИмяКолонкиГраницыПериода = "ДатаОкончания";
    ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
    ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
    ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);

    // Текст первой секции и пример второй из запроса-объединения в СКД.
    // Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
    // Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
    // формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
    // шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
    //
    // Обратите внимание, что
    // - в качестве поля ДатаОкончания - выступает конец дня,
    // - в качестве параметра остатков - выступает начало следующего дня, что аналогично
    // ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления.
    //
    // |
    // |.... тут может быть выборка вложенных полей
    // | ПОМЕСТИТЬ ВтОстатки
    // |.... тут может быть соединение с другими таблицами
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
    // | СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
    // | СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
    // | СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
    // | СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
    // | ИЗ
    // | РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
    // | ГДЕ
    // | &ПараметрОстатки
    // |
    // |ОБЪЕДИНИТЬ ВСЕ
    // |
    // |ВЫБРАТЬ
    // | ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
    // | СбТвОстатки.АналитикаУчетаНоменклатуры,
    // | СбТвОстатки.ВидЗапасов,
    // | СбТвОстатки.КоличествоОстаток,
    // | СбТвОстатки.СтоимостьОстаток
    // |ИЗ
    // | РегистрНакопления.СебестоимостьТоваров.Остатки(
    // | ДАТАВРЕМЯ(2017, 8, 1),
    // | АналитикаУчетаНоменклатуры В
    // | (ВЫБРАТЬ
    // | ВтАналитикаУчетаНоменклатуры.КлючАналитики
    // | ИЗ
    // | ВтАналитикаУчетаНоменклатуры)
    // | И ВидЗапасов В
    // | (ВЫБРАТЬ
    // | ВтВидыЗапасов.ВидЗапасов
    // | ИЗ
    // | ВтВидыЗапасов)) КАК СбТвОстатки";

    ЗапросТекстВставка = ";
    ЗапросТекстШаблон = "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
    | СбТвОстатки.АналитикаУчетаНоменклатуры,
    | СбТвОстатки.ВидЗапасов,
    | СбТвОстатки.КоличествоОстаток,
    | СбТвОстатки.СтоимостьОстаток
    |ИЗ
    | РегистрНакопления.СебестоимостьТоваров.Остатки(
    | ДАТАВРЕМЯ(%7, %8, %9),
    | АналитикаУчетаНоменклатуры В
    | (ВЫБРАТЬ
    | ВтАналитикаУчетаНоменклатуры.КлючАналитики
    | ИЗ
    | ВтАналитикаУчетаНоменклатуры)
    | И ВидЗапасов В
    | (ВЫБРАТЬ
    | ВтВидыЗапасов.ВидЗапасов
    | ИЗ
    | ВтВидыЗапасов)) КАК СбТвОстатки";

    мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
    Для каждого СтрокаТз Из ТзПериодыДатаК Цикл

    НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
    Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
    мУжеОбработано.Добавить(НачалоДняДатаОкончания);
    Иначе
    Продолжить; // Уже был такой день даты окончания
    КонецЕсли;
    НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;

    ПараметрыЗамены = Новый Структура;
    ПараметрыЗамены.Вставить("_1", Формат(Год (НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
    ПараметрыЗамены.Вставить("_4", "23");
    ПараметрыЗамены.Вставить("_5", "59");
    ПараметрыЗамены.Вставить("_6", "59");
    ПараметрыЗамены.Вставить("_7", Формат(Год (НачалоСледующегоДня), "ЧГ="));
    ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
    ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));

    ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон,
    ПараметрыЗамены._1,
    ПараметрыЗамены._2,
    ПараметрыЗамены._3,
    ПараметрыЗамены._4,
    ПараметрыЗамены._5,
    ПараметрыЗамены._6,
    ПараметрыЗамены._7,
    ПараметрыЗамены._8,
    ПараметрыЗамены._9);

    ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;

    КонецЦикла;

    Возврат ЗапросТекстВставка;

    КонецФункции
```
---
код состряпан из 2 макетов, посмотрите может пригодиться
если выбросить все манипуляции с отбором параметрами и проч.

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    Схема=ПолучитьМакет("НастрокаКолонок");
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
    //-----------------------------------------------------
    КомпоновщикНастроек0=Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек0.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    КомпоновщикНастроек0.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    КомпоновщикНастроек0.ЗагрузитьПользовательскиеНастройки(КомпоновщикНастроек.ПользовательскиеНастройки); // Параметры
    // сортировка
    ГруппаДетальныеЗаписи=КомпоновщикНастроек0.Настройки.Структура[0].Структура[0];
    СтрокаУжеДобавилиВПорядок=";
    Для Каждого ЭлементПользовательскихНастроек Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    Если ТипЗнч(ЭлементПользовательскихНастроек)=Тип("ПорядокКомпоновкиДанных") Тогда
    Для Каждого ПользовательскийЭлементПорядка Из ЭлементПользовательскихНастроек.Элементы Цикл
    ИндексТочки=Найти(Строка(ПользовательскийЭлементПорядка.Поле),".");
    ПолеПорядка=Лев(Строка(ПользовательскийЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементПорядка.Поле))));
    Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
    И ПолеПорядка<>"Контрагент" Тогда
    НовыйЭлементПользовательскогоПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЗаполнитьЗначенияСвойств(НовыйЭлементПользовательскогоПорядка1,ПользовательскийЭлементПорядка);
    СтрокаУжеДобавилиВПорядок=?(ПользовательскийЭлементПорядка.Использование,Строка(ПользовательскийЭлементПорядка.Поле)+";"+СтрокаУжеДобавилиВПорядок,СтрокаУжеДобавилиВПорядок);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    Для Каждого ЭлементПорядка Из КомпоновщикНастроек.Настройки.Порядок.Элементы Цикл
    ИндексТочки=Найти(Строка(ЭлементПорядка.Поле),".");
    ПолеПорядка=Лев(Строка(ЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементПорядка.Поле))));
    Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
    И ПолеПорядка<>"Контрагент"
    И Найти(СтрокаУжеДобавилиВПорядок,Строка(ПользовательскийЭлементПорядка.Поле))=0 Тогда
    НовыйЭлементПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЗаполнитьЗначенияСвойств(НовыйЭлементПорядка1,ЭлементПорядка);
    КонецЕсли;
    КонецЦикла;
    // отбор
    СтрокаУжеДобавилиВОтбор=";
    Для Каждого ПользовательскийЭлементОтбора Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    Если ТипЗнч(ПользовательскийЭлементОтбора)=Тип("ЭлементОтбораКомпоновкиДанных") Тогда
    Если ПользовательскийЭлементОтбора.ЛевоеЗначение=Неопределено Тогда
    // в порядке эксперимента
    //ИД=КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора);
    // Отладчик : КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора) bb47871f-b5f6-4246-b6a2-ff32610fde41 ИдентификаторКомпоновкиДанных
    // Отладчик :КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ИдентификаторПользовательскойНастройки "bb47871f-b5f6-4246-b6a2-ff32610fde41" Строка
    //ТестНужныйЭлементОтбора=КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД);
    // Отладчик : КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД) Неопределено ?????
    // Так и не понял как это работает, просто пройдем циклом
    НужныйЭлементОтбора=Неопределено;
    Для Каждого НужныйЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    Если ПользовательскийЭлементОтбора.ИдентификаторПользовательскойНастройки=НужныйЭлементОтбора.ИдентификаторПользовательскойНастройки Тогда
    НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ПользовательскийЭлементОтбора);
    НовыйЭлементОтбора1.ЛевоеЗначение=НужныйЭлементОтбора.ЛевоеЗначение;
    СтрокаУжеДобавилиВОтбор=?(НовыйЭлементОтбора1.Использование,Строка(НужныйЭлементОтбора.ЛевоеЗначение)+";"+СтрокаУжеДобавилиВОтбор,СтрокаУжеДобавилиВОтбор);
    КонецЕсли;
    КонецЦикла;
    Иначе
    ИндексТочки=Найти(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),".");
    ПолеОтбора=Лев(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))));
    Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
    И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
    НовыйЭлементОтбора2=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора2,ПользовательскийЭлементОтбора);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    ИндексТочки=Найти(Строка(ЭлементОтбора.ЛевоеЗначение),".");
    ПолеОтбора=Лев(Строка(ЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементОтбора.ЛевоеЗначение))));
    Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
    И ЗначениеЗаполнено(ЭлементОтбора.ПравоеЗначение)
    И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
    НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ЭлементОтбора);
    КонецЕсли;
    КонецЦикла;
    Макет=КомпоновщикМакета.Выполнить(Схема,КомпоновщикНастроек0.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновки.Инициализировать(Макет);
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТаблицаЗаказы=Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаЗаказы);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Ё=ТаблицаЗаказы.Количество()-1;
    Пока Ё >= 0 Цикл
    Если Не ЗначениеЗаполнено(ТаблицаЗаказы[Ё].Заказ) Тогда
    ТаблицаЗаказы.Удалить(Ё);
    КонецЕсли;
    Ё=Ё-1;
    КонецЦикла;
    Сообщить("Количество записей в загруженной таблице значений = "+ ТаблицаЗаказы.Количество());
    // --------------------------------основная схема
    Макет=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки(),ДанныеРасшифровки);
    ПроцессорКомпоновки.Инициализировать(Макет,Новый Структура("ТаблицаЗаказы",ТаблицаЗаказы),ДанныеРасшифровки);
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    КонецПроцедуры
```
---
Может это поможет?
https://infostart.ru/public/658410/
---
тут, на сколько я понял, вывод результатов ИЗ скд, а мне нужно засунуть тз В скд и обработать ее в запросе.
---
Как-то так

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

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

    // Схема компоновки данных
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;

    Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    Источник.Имя = "ДанныеОбъекта";
    Источник.СтрокаСоединения = ";
    Источник.ТипИсточникаДанных = "Local";

    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "ДанныеОбъекта";
    НаборДанных.ИмяОбъекта = "ДанныеОбъекта";
    НаборДанных.ИсточникДанных = "ДанныеОбъекта";

    Для каждого Колонка из ДанныеОбъекта.Колонки Цикл
    ПолеДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеДанных.Поле = Колонка.Имя;
    ПолеДанных.ПутьКДанным = Колонка.Имя;
    ПолеДанных.ТипЗначения = Колонка.ТипЗначения;
    КонецЦикла;

    АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));

    // Параметры схемы
    НастройкиСхемы = УсловияОтбора.УсловияОтбора.Получить();
    Если НастройкиСхемы <> Неопределено Тогда
    КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиСхемы);

    ДетальныеЗаписи = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    ДетальныеЗаписи.Имя = "Детальные";
    ДетальныеЗаписи.Использование = Истина;

    ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Партнер");

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, Новый Структура("ДанныеОбъекта", ДанныеОбъекта));

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

    Результат = ТаблицаЗначений.ВыгрузитьКолонку("Партнер");
    КонецЕсли;
```