Всем привет, прошу помощи у знающих. Хочу написать запрос, но пока идей нет.
Есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.
Теперь на примере, имеется таблица с колонками
Номенклатура, ДатаУстановки, СрокПолезногоИспользования (в месяцах)
Данные:
Номенклатура1, 01.01.2021, 3
Из этих данных хочу получить таблицу, указав в параметрах период
Номенклатура, ДатаПлановойЗамены
Например, если период указан с 01.01.2021 по 31.12.2012, то должно получиться:
Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
Есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.
Теперь на примере, имеется таблица с колонками
Номенклатура, ДатаУстановки, СрокПолезногоИспользования (в месяцах)
Данные:
Номенклатура1, 01.01.2021, 3
Из этих данных хочу получить таблицу, указав в параметрах период
Номенклатура, ДатаПлановойЗамены
Например, если период указан с 01.01.2021 по 31.12.2012, то должно получиться:
Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
По теме из базы знаний
- Полезные сведения о языке запросов 1С 8.2
- Запрос определения даты наступления события в рабочих днях
- Заметки про запросы. Коллекция
- Заметки по SQL: Генерация ряда дат и данные из периодических регистров на каждый день
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
Найденные решения
(22) Есть такой вариант
Таблица календаря - можете получить как угодно (я из существующего РС)
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
ПОМЕСТИТЬ Календарь
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсходнаяТаблица.Номенклатура КАК Номенкатура,
ВЫРАЗИТЬ(ИсходнаяТаблица.ДатаУстановки КАК ДАТА) КАК ДатаУстановки,
ВЫРАЗИТЬ(ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0)) КАК СрокПолезногоИспользования
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
&ИсходнаяТаблица КАК ИсходнаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсходнаяТаблица.Номенклатура,
ИсходнаяТаблица.ДатаУстановки,
ИсходнаяТаблица.СрокПолезногоИспользования,
Календарь.Месяц
ИЗ
ИсходнаяТаблица КАК ИсходнаяТаблица,
Календарь КАК Календарь
ГДЕ
РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0
ПоказатьТаблица календаря - можете получить как угодно (я из существующего РС)
ВЫБРАТЬ РАЗЛИЧНЫЕ
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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.Ном = мТаб.Ном
ПоказатьВЫБРАТЬ
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.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
ПоказатьЕсли кому интересно вот ещё мой вариант
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)В первом приближении необходимо сгенерировать таблицу месяцев по заданному периоду с 01.01.2021 по 31.12.2012.
Далее выполнять соединение исходной таблицы с таблицей периодов так, чтобы ДобавитьКДате(ИсходнаяТаблица.Период, МЕСЯЦ, ИсходнаяТаблица.КоличествоМесяцев) было <= &КонецПериода.
Генерация таблицы с датами в типовых выполняется так:
Далее выполнять соединение исходной таблицы с таблицей периодов так, чтобы ДобавитьКДате(ИсходнаяТаблица.Период, МЕСЯЦ, ИсходнаяТаблица.КоличествоМесяцев) было <= &КонецПериода.
Генерация таблицы с датами в типовых выполняется так:
ВЫБРАТЬ
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), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ
;
Показать
(11)
Ну что то не сработало
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втТаблица1.Номенклатура КАК Номенклатура,
втТаблица1.ДатаУстановки КАК ДатаУстановки,
втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
втПериоды.Период КАК Период,
ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) КАК ДатаПланЗамены
ИЗ
втТаблица1 КАК втТаблица1
ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК втПериоды
ПО (ДОБАВИТЬКДАТЕ(втТаблица1.ДатаУстановки, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) <= &КонецПериода)
ПоказатьНу что то не сработало
Прикрепленные файлы:
(17) Не внимательно сделал связь, сейчас поправил, но результат все равно не тот
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втТаблица1.Номенклатура КАК Номенклатура,
втТаблица1.ДатаУстановки КАК ДатаУстановки,
втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
втПериоды.Период КАК Период,
ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) КАК ДатаПланЗамены
ИЗ
втТаблица1 КАК втТаблица1
ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК втПериоды
ПО (ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) <= &КонецПериода)
ПоказатьПрикрепленные файлы:
(17)Одним запросом - не сработает, нужны еще итерации соединения, чтобы получить срок полезного использования нарастающим итогом.
Второй итерацией соединяйте результат сам с собой по полю "Период" так, чтобы пронумеровать строки(я не использую Автономерзаписи() сознательно, чтобы не зависело от платформы)
Третьей итерацией умножайте номер строки на срок полезного использования.
Четвертой итерацией получите результат.
Второй итерацией соединяйте результат сам с собой по полю "Период" так, чтобы пронумеровать строки(я не использую Автономерзаписи() сознательно, чтобы не зависело от платформы)
Третьей итерацией умножайте номер строки на срок полезного использования.
Четвертой итерацией получите результат.
(22) Есть такой вариант
Таблица календаря - можете получить как угодно (я из существующего РС)
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
ПОМЕСТИТЬ Календарь
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсходнаяТаблица.Номенклатура КАК Номенкатура,
ВЫРАЗИТЬ(ИсходнаяТаблица.ДатаУстановки КАК ДАТА) КАК ДатаУстановки,
ВЫРАЗИТЬ(ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0)) КАК СрокПолезногоИспользования
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
&ИсходнаяТаблица КАК ИсходнаяТаблица
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсходнаяТаблица.Номенклатура,
ИсходнаяТаблица.ДатаУстановки,
ИсходнаяТаблица.СрокПолезногоИспользования,
Календарь.Месяц
ИЗ
ИсходнаяТаблица КАК ИсходнаяТаблица,
Календарь КАК Календарь
ГДЕ
РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0
ПоказатьТаблица календаря - можете получить как угодно (я из существующего РС)
(30) Теоретически увеличение возможно только в N-раз (N - количество месяцев в выбранном периоде), т.е. вряд ли даже до 2х порядков дойдет. Но автор хотел же запросом, а так и циклом может решить. В итоге, конечно, проверять будет автор на своих данных и своих мощностях)
(34) Вы про связь с календарем? Это означает все со всеми (вместо цикла). А потом отбор.
Можно попробовать сделать в связи отбор. Т.е. из ГДЕ условие перенести в соединение
Но я не уверен, быстрее ли это будет. Надо тестировать. А так да, надо еще подумать в сторону доп ограничений. Это если данных много будет и период большой. Рад, что дал направление)
Можно попробовать сделать в связи отбор. Т.е. из ГДЕ условие перенести в соединение
ИсходнаяТаблица КАК ИсходнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь
ПО (РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0)
Но я не уверен, быстрее ли это будет. Надо тестировать. А так да, надо еще подумать в сторону доп ограничений. Это если данных много будет и период большой. Рад, что дал направление)
(7) В теме с примером, сформулирую просто на словах, есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.
ВЫБРАТЬ РАЗЛИЧНЫЕ
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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.Ном = мТаб.Ном
ПоказатьВЫБРАТЬ
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.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
ПоказатьЕсли кому интересно вот ещё мой вариант
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот