Всем привет, прошу помощи у знающих. Хочу написать запрос, но пока идей нет.

Есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.

Теперь на примере, имеется таблица с колонками
Номенклатура, ДатаУстановки, СрокПолезногоИспользования (в месяцах)
Данные:
Номенклатура1, 01.01.2021, 3

Из этих данных хочу получить таблицу, указав в параметрах период
Номенклатура, ДатаПлановойЗамены
Например, если период указан с 01.01.2021 по 31.12.2012, то должно получиться:
Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
---
Есть такой вариант

```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
    ПОМЕСТИТЬ Календарь
    ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания

    СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ИсходнаяТаблица.Номенклатура КАК Номенкатура,
    ВЫРАЗИТЬ(ИсходнаяТаблица.ДатаУстановки КАК ДАТА) КАК ДатаУстановки,
    ВЫРАЗИТЬ(ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0)) КАК СрокПолезногоИспользования
    ПОМЕСТИТЬ ИсходнаяТаблица
    ИЗ
    &ИсходнаяТаблица КАК ИсходнаяТаблица
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ИсходнаяТаблица.Номенклатура,
    ИсходнаяТаблица.ДатаУстановки,
    ИсходнаяТаблица.СрокПолезногоИспользования,
    Календарь.Месяц
    ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица,
    Календарь КАК Календарь
    ГДЕ
    РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0
```

Таблица календаря - можете получить как угодно (я из существующего РС)
---
```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d), МЕСЯЦ) КАК ПериодДень
    ПОМЕСТИТЬ мКалендарь
    ИЗ
    (ВЫБРАТЬ
    0 КАК a

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК aa,
    (ВЫБРАТЬ
    0 КАК b

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК bb,
    (ВЫБРАТЬ
    0 КАК c

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК cc,
    (ВЫБРАТЬ
    0 КАК d

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК dd
    ГДЕ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) <= &КонецПериода
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мКалендарь.ПериодДень
    ПОМЕСТИТЬ мМесяц
    ИЗ
    мКалендарь КАК мКалендарь
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "Ном1" КАК Ном,
    ДАТАВРЕМЯ(2021, 2, 2) КАК Дата,
    3 КАК Срок
    ПОМЕСТИТЬ мТаб

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

    ВЫБРАТЬ
    "Ном2",
    ДАТАВРЕМЯ(2021, 1, 2),
    2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб.Ном,
    НАЧАЛОПЕРИОДА(мТаб.Дата, МЕСЯЦ) КАК ДатаМесяц,
    мТаб.Срок,
    мТаб.Дата
    ПОМЕСТИТЬ мТаб1
    ИЗ
    мТаб КАК мТаб
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб1.Ном КАК Ном,
    мМесяц.ПериодДень КАК ПериодДень,
    мТаб1.Срок,
    1 КАК Поле1
    ПОМЕСТИТЬ мТаб21
    ИЗ
    мТаб1 КАК мТаб1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мМесяц КАК мМесяц
    ПО мТаб1.ДатаМесяц <= мМесяц.ПериодДень
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб21.Ном,
    СУММА(мТаб21.Поле1) КАК Поле1,
    мТаб211.ПериодДень,
    мТаб21.Срок
    ПОМЕСТИТЬ мТаб2
    ИЗ
    мТаб21 КАК мТаб21
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб21 КАК мТаб211
    ПО мТаб21.Ном = мТаб211.Ном
    И мТаб21.ПериодДень <= мТаб211.ПериодДень

    СГРУППИРОВАТЬ ПО
    мТаб21.Ном,
    мТаб211.ПериодДень,
    мТаб21.Срок
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Ном,
    (мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК Поле1,
    мТаб2.ПериодДень
    ПОМЕСТИТЬ мТаб3
    ИЗ
    мТаб2 КАК мТаб2
    ГДЕ
    (ВЫРАЗИТЬ((мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК ЧИСЛО(10, 2))) = (ВЫРАЗИТЬ((мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК ЧИСЛО(10, 0)))
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб.Ном,
    мТаб.Дата,
    мТаб3.ПериодДень КАК ДатаПлановойЗамены
    ИЗ
    мТаб3 КАК мТаб3
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб КАК мТаб
    ПО мТаб3.Ном = мТаб.Ном
```
---
```1c
    ВЫБРАТЬ
    1 КАК ЧислоПовторений
    ПОМЕСТИТЬ втЧислоПовторений

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

    ВЫБРАТЬ
    2

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

    ВЫБРАТЬ
    3

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

    ВЫБРАТЬ
    4

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

    ВЫБРАТЬ
    5

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

    ВЫБРАТЬ
    6

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

    ВЫБРАТЬ
    7

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

    ВЫБРАТЬ
    8

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

    ВЫБРАТЬ
    9

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

    ВЫБРАТЬ
    10

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

    ВЫБРАТЬ
    11

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

    ВЫБРАТЬ
    12
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Таблица1.Номенклатура КАК Номенклатура,
    Таблица1.ДатаУстановки КАК ДатаУстановки,
    Таблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) / Таблица1.СрокПолезногоИспользования - 0.5 КАК ЧИСЛО(10, 0)) КАК ПовторенийЗаПериод
    ПОМЕСТИТЬ втТаблица1
    ИЗ
    &Таблица1 КАК Таблица1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    втТаблица1.Номенклатура КАК Номенклатура,
    втТаблица1.ДатаУстановки КАК ДатаУстановки,
    втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
    втЧислоПовторений.ЧислоПовторений КАК ЧислоПовторений,
    ДОБАВИТЬКДАТЕ(втТаблица1.ДатаУстановки, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования * втЧислоПовторений.ЧислоПовторений) КАК ДатаЗамены
    ИЗ
    втТаблица1 КАК втТаблица1
    ЛЕВОЕ СОЕДИНЕНИЕ втЧислоПовторений КАК втЧислоПовторений
    ПО (втТаблица1.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
```

Если кому интересно вот ещё мой вариант
---
Если идей совсем нет, то бегом на курс по запросам
Озвучь, в чем сложность то..?
---
Нет идеи
---
Если у Вас есть идеи, то Вы очень сильно облегчите мне жизнь
---
В первом приближении необходимо сгенерировать таблицу месяцев по заданному периоду с 01.01.2021 по 31.12.2012.
Далее выполнять соединение исходной таблицы с таблицей периодов так, чтобы ДобавитьКДате(ИсходнаяТаблица.Период, МЕСЯЦ, ИсходнаяТаблица.КоличествоМесяцев) было <= &КонецПериода.

Генерация таблицы с датами в типовых выполняется так:

```1c
    ВЫБРАТЬ
    0 КАК Цифра
    ПОМЕСТИТЬ ВТЦифры

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

    ВЫБРАТЬ
    1

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

    ВЫБРАТЬ
    2

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

    ВЫБРАТЬ
    3

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

    ВЫБРАТЬ
    4

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

    ВЫБРАТЬ
    5

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

    ВЫБРАТЬ
    6

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

    ВЫБРАТЬ
    7

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

    ВЫБРАТЬ
    8

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

    ВЫБРАТЬ
    9
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), МЕСЯЦ) КАК Период
    ПОМЕСТИТЬ ПредставленияПериоды
    ИЗ
    ВТЦифры КАК Цифры
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 9)
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 99)
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 999)
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 9999)
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 99999)
    ГДЕ
    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ, МЕСЯЦ), МЕСЯЦ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), МЕСЯЦ) МЕЖДУ ВЫБОР КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1) ТОГДА ДАТАВРЕМЯ(1980, 1, 1) ИНАЧЕ &НачалоПериода КОНЕЦ И ВЫБОР КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ
    ;
```
---
```1c
    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    втТаблица1.Номенклатура КАК Номенклатура,
    втТаблица1.ДатаУстановки КАК ДатаУстановки,
    втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
    втПериоды.Период КАК Период,
    ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) КАК ДатаПланЗамены
    ИЗ
    втТаблица1 КАК втТаблица1
    ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК втПериоды
    ПО (ДОБАВИТЬКДАТЕ(втТаблица1.ДатаУстановки, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) <= &КонецПериода)
```

Ну что то не сработало
---
Не внимательно сделал связь, сейчас поправил, но результат все равно не тот

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

Второй итерацией соединяйте результат сам с собой по полю "Период" так, чтобы пронумеровать строки(я не использую Автономерзаписи() сознательно, чтобы не зависело от платформы)
Третьей итерацией умножайте номер строки на срок полезного использования.
Четвертой итерацией получите результат.
---
Есть такой вариант

```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
    ПОМЕСТИТЬ Календарь
    ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания

    СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ИсходнаяТаблица.Номенклатура КАК Номенкатура,
    ВЫРАЗИТЬ(ИсходнаяТаблица.ДатаУстановки КАК ДАТА) КАК ДатаУстановки,
    ВЫРАЗИТЬ(ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0)) КАК СрокПолезногоИспользования
    ПОМЕСТИТЬ ИсходнаяТаблица
    ИЗ
    &ИсходнаяТаблица КАК ИсходнаяТаблица
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ИсходнаяТаблица.Номенклатура,
    ИсходнаяТаблица.ДатаУстановки,
    ИсходнаяТаблица.СрокПолезногоИспользования,
    Календарь.Месяц
    ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица,
    Календарь КАК Календарь
    ГДЕ
    РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0
```

Таблица календаря - можете получить как угодно (я из существующего РС)
---
Я же в (11) уже кинул вариант получения таблицы календаря без привязки к РС.
---
да, я видел) я считаю, что получение календаря не должно отвлекать автора от конечной цели. Поэтому и сделал приписку, что календарь, можно получить любым способом, это на усмотрение автора))

в остальном запрос работоспособен?
---
ваш вариант не проверял, но ИМХО, выполнять кросс-соединение - такое себе, может быть очень много записей в результате
---
Теоретически увеличение возможно только в N-раз (N - количество месяцев в выбранном периоде), т.е. вряд ли даже до 2х порядков дойдет. Но автор хотел же запросом, а так и циклом может решить. В итоге, конечно, проверять будет автор на своих данных и своих мощностях)
---
ну вариант рабочий, спасибо, только смущает что нет связи, надо тестировать) Я думаю тему можно закрывать, + у меня тоже теперь появились кое какие идеи, буду пробовать
---
Вы про связь с календарем? Это означает все со всеми (вместо цикла). А потом отбор.
Можно попробовать сделать в связи отбор. Т.е. из ГДЕ условие перенести в соединение

```1c
    ИсходнаяТаблица КАК ИсходнаяТаблица
    ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь
    ПО (РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0)
```

Но я не уверен, быстрее ли это будет. Надо тестировать. А так да, надо еще подумать в сторону доп ограничений. Это если данных много будет и период большой. Рад, что дал направление)
---
Нет идеи как писать запросы или что? Либо я пока не понял задачу
---
Как из исходной таблицы получить таблицу

Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
---
В (1) указано про одну исходную таблицу. Сформулируйте корректнее, глядишь и идея появится
---
в теме и так максимально корректно сформулировано, вам ответил про две таблицы, но после поправил.
---
В теме с примером, сформулирую просто на словах, есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.
---
Есть понятный вопрос - сразу есть и ответы!
---
Полагаю, параметр "СрокПолезногоИспользования" должен быть назван иначе, например "ПериодичностьЗамены"?
Иначе решение натыкается на новые вопросы..
---
Пусть будет Х......не, X - мало.....пусть будет - Y! © анекдот с бородой
---
Какой смысл вы пишете ерунду?
---
Какой вопрос, такие и ответы )
Мой комментарий был, скорее, к сообщениям (12) (13)
---
не важно как называется параметр, если нужно понять принцип.
---
```1c
    ТекстЗапроса = "ВЫБРАТЬ Номенклатура,
    |ДОБАВИТЬКДАТЕ(ДатаУстановки, МЕСЯЦ, СрокПолезногоИспользования) КАК ДатаПлановойЗамены
    |ИЗ НекаяТаблица";
```
---
как следующую запись получить?
---
добавка будет только одного периода. А ему надо из одной строки сделать несколько.
---
Весь код обязательно должен умещаться в запросе ?
---
```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d), МЕСЯЦ) КАК ПериодДень
    ПОМЕСТИТЬ мКалендарь
    ИЗ
    (ВЫБРАТЬ
    0 КАК a

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК aa,
    (ВЫБРАТЬ
    0 КАК b

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК bb,
    (ВЫБРАТЬ
    0 КАК c

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК cc,
    (ВЫБРАТЬ
    0 КАК d

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    9) КАК dd
    ГДЕ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) <= &КонецПериода
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мКалендарь.ПериодДень
    ПОМЕСТИТЬ мМесяц
    ИЗ
    мКалендарь КАК мКалендарь
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    "Ном1" КАК Ном,
    ДАТАВРЕМЯ(2021, 2, 2) КАК Дата,
    3 КАК Срок
    ПОМЕСТИТЬ мТаб

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

    ВЫБРАТЬ
    "Ном2",
    ДАТАВРЕМЯ(2021, 1, 2),
    2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб.Ном,
    НАЧАЛОПЕРИОДА(мТаб.Дата, МЕСЯЦ) КАК ДатаМесяц,
    мТаб.Срок,
    мТаб.Дата
    ПОМЕСТИТЬ мТаб1
    ИЗ
    мТаб КАК мТаб
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб1.Ном КАК Ном,
    мМесяц.ПериодДень КАК ПериодДень,
    мТаб1.Срок,
    1 КАК Поле1
    ПОМЕСТИТЬ мТаб21
    ИЗ
    мТаб1 КАК мТаб1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мМесяц КАК мМесяц
    ПО мТаб1.ДатаМесяц <= мМесяц.ПериодДень
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб21.Ном,
    СУММА(мТаб21.Поле1) КАК Поле1,
    мТаб211.ПериодДень,
    мТаб21.Срок
    ПОМЕСТИТЬ мТаб2
    ИЗ
    мТаб21 КАК мТаб21
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб21 КАК мТаб211
    ПО мТаб21.Ном = мТаб211.Ном
    И мТаб21.ПериодДень <= мТаб211.ПериодДень

    СГРУППИРОВАТЬ ПО
    мТаб21.Ном,
    мТаб211.ПериодДень,
    мТаб21.Срок
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Ном,
    (мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК Поле1,
    мТаб2.ПериодДень
    ПОМЕСТИТЬ мТаб3
    ИЗ
    мТаб2 КАК мТаб2
    ГДЕ
    (ВЫРАЗИТЬ((мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК ЧИСЛО(10, 2))) = (ВЫРАЗИТЬ((мТаб2.Поле1 + мТаб2.Срок - 1) / мТаб2.Срок КАК ЧИСЛО(10, 0)))
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб.Ном,
    мТаб.Дата,
    мТаб3.ПериодДень КАК ДатаПлановойЗамены
    ИЗ
    мТаб3 КАК мТаб3
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТаб КАК мТаб
    ПО мТаб3.Ном = мТаб.Ном
```
---
Ваш вариант тоже работает, но на первый взгляд для понимания сложный) Спасибо!
---
```1c
    ВЫБРАТЬ
    1 КАК ЧислоПовторений
    ПОМЕСТИТЬ втЧислоПовторений

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

    ВЫБРАТЬ
    2

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

    ВЫБРАТЬ
    3

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

    ВЫБРАТЬ
    4

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

    ВЫБРАТЬ
    5

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

    ВЫБРАТЬ
    6

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

    ВЫБРАТЬ
    7

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

    ВЫБРАТЬ
    8

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

    ВЫБРАТЬ
    9

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

    ВЫБРАТЬ
    10

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

    ВЫБРАТЬ
    11

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

    ВЫБРАТЬ
    12
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Таблица1.Номенклатура КАК Номенклатура,
    Таблица1.ДатаУстановки КАК ДатаУстановки,
    Таблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) / Таблица1.СрокПолезногоИспользования - 0.5 КАК ЧИСЛО(10, 0)) КАК ПовторенийЗаПериод
    ПОМЕСТИТЬ втТаблица1
    ИЗ
    &Таблица1 КАК Таблица1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    втТаблица1.Номенклатура КАК Номенклатура,
    втТаблица1.ДатаУстановки КАК ДатаУстановки,
    втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
    втЧислоПовторений.ЧислоПовторений КАК ЧислоПовторений,
    ДОБАВИТЬКДАТЕ(втТаблица1.ДатаУстановки, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования * втЧислоПовторений.ЧислоПовторений) КАК ДатаЗамены
    ИЗ
    втТаблица1 КАК втТаблица1
    ЛЕВОЕ СОЕДИНЕНИЕ втЧислоПовторений КАК втЧислоПовторений
    ПО (втТаблица1.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
```

Если кому интересно вот ещё мой вариант