Запрос с датами

1. Mahon83 13 26.10.21 07:36 Сейчас в теме
Всем привет, прошу помощи у знающих. Хочу написать запрос, но пока идей нет.

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

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

Из этих данных хочу получить таблицу, указав в параметрах период
Номенклатура, ДатаПлановойЗамены
Например, если период указан с 01.01.2021 по 31.12.2012, то должно получиться:
Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
26. ДмитрийС 26.10.21 09:01 Сейчас в теме +2 $m
(22) Есть такой вариант
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
ПОМЕСТИТЬ Календарь
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания

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

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

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


Таблица календаря - можете получить как угодно (я из существующего РС)
32. homer_ 78 26.10.21 09:23 Сейчас в теме +1 $m
ВЫБРАТЬ РАЗЛИЧНЫЕ
	НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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.Ном = мТаб.Ном
Показать
37. Mahon83 13 26.10.21 10:07 Сейчас в теме
ВЫБРАТЬ
	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.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
Показать

Если кому интересно вот ещё мой вариант
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. 1CKEBO 26.10.21 07:50 Сейчас в теме
(1) Если идей совсем нет, то бегом на курс по запросам
Озвучь, в чем сложность то..?
3. Mahon83 13 26.10.21 07:50 Сейчас в теме
4. Mahon83 13 26.10.21 07:51 Сейчас в теме
(2)Если у Вас есть идеи, то Вы очень сильно облегчите мне жизнь
11. nomad_irk 72 26.10.21 08:05 Сейчас в теме
(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), МЕСЯЦ) ТОГДА &ОкончаниеИнтервалаПредставленияПериоды ИНАЧЕ &КонецПериода КОНЕЦ
;
Показать
17. Mahon83 13 26.10.21 08:17 Сейчас в теме
(11)
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТаблица1.Номенклатура КАК Номенклатура,
	втТаблица1.ДатаУстановки КАК ДатаУстановки,
	втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
	втПериоды.Период КАК Период,
	ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) КАК ДатаПланЗамены
ИЗ
	втТаблица1 КАК втТаблица1
		ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК втПериоды
		ПО (ДОБАВИТЬКДАТЕ(втТаблица1.ДатаУстановки, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) <= &КонецПериода)
Показать

Ну что то не сработало
Прикрепленные файлы:
19. Mahon83 13 26.10.21 08:22 Сейчас в теме
(17) Не внимательно сделал связь, сейчас поправил, но результат все равно не тот
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втТаблица1.Номенклатура КАК Номенклатура,
	втТаблица1.ДатаУстановки КАК ДатаУстановки,
	втТаблица1.СрокПолезногоИспользования КАК СрокПолезногоИспользования,
	втПериоды.Период КАК Период,
	ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) КАК ДатаПланЗамены
ИЗ
	втТаблица1 КАК втТаблица1
		ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК втПериоды
		ПО (ДОБАВИТЬКДАТЕ(втПериоды.Период, МЕСЯЦ, втТаблица1.СрокПолезногоИспользования) <= &КонецПериода)
Показать
Прикрепленные файлы:
20. ДмитрийС 26.10.21 08:24 Сейчас в теме
(19) СрокПолезногоИспользования - обязательно целочисленный?
23. Mahon83 13 26.10.21 08:31 Сейчас в теме
(20) да, периодичность именно в месяцах
33. ДмитрийС 26.10.21 09:23 Сейчас в теме
(23) Надо призвать автора))
24. nomad_irk 72 26.10.21 08:33 Сейчас в теме
(19)Еще раз: результат верный, но одним запросом - не сделать. См (22)
22. nomad_irk 72 26.10.21 08:29 Сейчас в теме
(17)Одним запросом - не сработает, нужны еще итерации соединения, чтобы получить срок полезного использования нарастающим итогом.

Второй итерацией соединяйте результат сам с собой по полю "Период" так, чтобы пронумеровать строки(я не использую Автономерзаписи() сознательно, чтобы не зависело от платформы)
Третьей итерацией умножайте номер строки на срок полезного использования.
Четвертой итерацией получите результат.
26. ДмитрийС 26.10.21 09:01 Сейчас в теме +2 $m
(22) Есть такой вариант
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
ПОМЕСТИТЬ Календарь
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания

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

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

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


Таблица календаря - можете получить как угодно (я из существующего РС)
27. nomad_irk 72 26.10.21 09:04 Сейчас в теме
(26)Я же в (11) уже кинул вариант получения таблицы календаря без привязки к РС.
29. ДмитрийС 26.10.21 09:10 Сейчас в теме
(27) да, я видел) я считаю, что получение календаря не должно отвлекать автора от конечной цели. Поэтому и сделал приписку, что календарь, можно получить любым способом, это на усмотрение автора))

в остальном запрос работоспособен?
30. nomad_irk 72 26.10.21 09:16 Сейчас в теме
(29)ваш вариант не проверял, но ИМХО, выполнять кросс-соединение - такое себе, может быть очень много записей в результате
31. ДмитрийС 26.10.21 09:22 Сейчас в теме
(30) Теоретически увеличение возможно только в N-раз (N - количество месяцев в выбранном периоде), т.е. вряд ли даже до 2х порядков дойдет. Но автор хотел же запросом, а так и циклом может решить. В итоге, конечно, проверять будет автор на своих данных и своих мощностях)
34. Mahon83 13 26.10.21 09:43 Сейчас в теме
(26) ну вариант рабочий, спасибо, только смущает что нет связи, надо тестировать) Я думаю тему можно закрывать, + у меня тоже теперь появились кое какие идеи, буду пробовать
36. ДмитрийС 26.10.21 09:52 Сейчас в теме
(34) Вы про связь с календарем? Это означает все со всеми (вместо цикла). А потом отбор.
Можно попробовать сделать в связи отбор. Т.е. из ГДЕ условие перенести в соединение
ИсходнаяТаблица КАК ИсходнаяТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь
		ПО (РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования - (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ИсходнаяТаблица.ДатаУстановки, Календарь.Месяц, МЕСЯЦ) / ИсходнаяТаблица.СрокПолезногоИспользования КАК ЧИСЛО(10, 0))) = 0)

Но я не уверен, быстрее ли это будет. Надо тестировать. А так да, надо еще подумать в сторону доп ограничений. Это если данных много будет и период большой. Рад, что дал направление)
5. 1CKEBO 26.10.21 07:52 Сейчас в теме
Нет идеи как писать запросы или что? Либо я пока не понял задачу
6. Mahon83 13 26.10.21 07:53 Сейчас в теме
(5)Как из исходной таблицы получить таблицу

Номенклатура1, 01.04.2021
Номенклатура1, 01.07.2021
Номенклатура1, 01.10.2021
7. 1CKEBO 26.10.21 07:56 Сейчас в теме
В (1) указано про одну исходную таблицу. Сформулируйте корректнее, глядишь и идея появится
8. Mahon83 13 26.10.21 07:58 Сейчас в теме
(7)в теме и так максимально корректно сформулировано, вам ответил про две таблицы, но после поправил.
9. Mahon83 13 26.10.21 07:59 Сейчас в теме
(7) В теме с примером, сформулирую просто на словах, есть таблица в которой имеется номенклатура (то бишь запчасть), дата установки и срок полезного использования в месяцах. Мне необходимо посчитать, в каких месяцах необходимо будет произвести замену данной запчасти.
14. 1CKEBO 26.10.21 08:07 Сейчас в теме
(9) Есть понятный вопрос - сразу есть и ответы!
15. 1CKEBO 26.10.21 08:12 Сейчас в теме
(9) Полагаю, параметр "СрокПолезногоИспользования" должен быть назван иначе, например "ПериодичностьЗамены"?
Иначе решение натыкается на новые вопросы..
16. nomad_irk 72 26.10.21 08:14 Сейчас в теме
(15)Пусть будет Х......не, X - мало.....пусть будет - Y! © анекдот с бородой
18. Mahon83 13 26.10.21 08:17 Сейчас в теме
(15)Какой смысл вы пишете ерунду?
21. 1CKEBO 26.10.21 08:27 Сейчас в теме
(18) Какой вопрос, такие и ответы )
Мой комментарий был, скорее, к сообщениям (12) (13)
25. nomad_irk 72 26.10.21 08:36 Сейчас в теме
(21)не важно как называется параметр, если нужно понять принцип.
10. provadyuga 99 26.10.21 08:04 Сейчас в теме
ТекстЗапроса = "ВЫБРАТЬ Номенклатура,
	|ДОБАВИТЬКДАТЕ(ДатаУстановки, МЕСЯЦ, СрокПолезногоИспользования) КАК ДатаПлановойЗамены
|ИЗ НекаяТаблица";
12. nomad_irk 72 26.10.21 08:06 Сейчас в теме
(10)как следующую запись получить?
13. ДмитрийС 26.10.21 08:06 Сейчас в теме
(10) добавка будет только одного периода. А ему надо из одной строки сделать несколько.
28. provadyuga 99 26.10.21 09:05 Сейчас в теме
(1) Весь код обязательно должен умещаться в запросе ?
32. homer_ 78 26.10.21 09:23 Сейчас в теме +1 $m
ВЫБРАТЬ РАЗЛИЧНЫЕ
	НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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.Ном = мТаб.Ном
Показать
35. Mahon83 13 26.10.21 09:50 Сейчас в теме
(32)Ваш вариант тоже работает, но на первый взгляд для понимания сложный) Спасибо!
37. Mahon83 13 26.10.21 10:07 Сейчас в теме
ВЫБРАТЬ
	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.ПовторенийЗаПериод >= втЧислоПовторений.ЧислоПовторений)
Показать

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот