Пересечение периодов

1. sergqwert15 3 18.07.17 13:06 Сейчас в теме
Требуется помощь в решении задачи:
Составить обработку, которая проверяет пересечение периодов и вывести его, если есть. Входные параметры - НачПериода1,НачПериода2,КонПериода1, КонПериода2.
Выходной параметр - НачПериода, КонПериода; или Сообщение - "Пересечения нет". Условие - Если не заполнена начальная дата периода, то это означает "-бесконечность"; Если не заполнена конечная дата, то это означает "+бесконечность".

НачалоПересечения = Макс(НачПериода1,НачПериода2);
КонецПересечения = Макс(КонПериода1, КонПериода2);
Если НачалоПересечения > КонецПересечения Тогда
    Сообщить("Пересечения нет")
КонецЕсли;
Если Макс(НачПериода) <Макс(КонПериода) Тогда
Сообщить("Пересечение есть")
Иначе
Сообщить("Пересечения нет");
Если Не ЗначениеЗаполнено(НачПериода) Тогда
Сообщить("-бесконечность");
КонецЕсли;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. sergpogo 2 18.07.17 13:20 Сейчас в теме
(1) Гуглите про поиск пересения периодов с помощью функции Excel СУММПРОИЗВ

Реализуйте это на 1С.
Я так сделал!
4. Rain88 376 18.07.17 14:11 Сейчас в теме
(1) Я правильно понимаю, вам надо проверить не пересекаются ли интервалы НачПериода1-КонПериода1 с НачПериода2-КонПериода2 ? Не пойму правда, что должно быть в выходных параметрах НачПериода, КонПериода.
5. sergqwert15 3 18.07.17 14:14 Сейчас в теме
Да, нужно проверить не пересекаются ли интервалы НачПериода1-КонПериода1 с НачПериода2-КонПериода2
8. sergpogo 2 18.07.17 15:02 Сейчас в теме
(5) Нарисуйте на бумажке варианты пересечения двух периодов, их всего 4 и сразу будет понятно, что и с чем сравнивать.
Rain88; ResetAtreides; +2 Ответить
14. ShyThun 15.05.20 11:52 Сейчас в теме
(8) Вариантов непересечения всего 2. Проще их отсечь одним условием. "Один период закончился раньше, чем начался другой" для обоих периодов
2. ImHunter 318 18.07.17 13:17 Сейчас в теме
Гм... Лучшая помощь тут - это предоставить тебе возможность самому разобраться.
Ладно бы это касалось специфики 1С. А так... Нарисовать блок-схему и запрограммить. Лучше сам потренируйся.
6. Dream_kz 129 18.07.17 14:19 Сейчас в теме
Делал запросом проверку документа на пересечение его с интервалом

ВЫБОР
КОГДА &НачалоПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
							ИЛИ &КонецПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
						ТОГДА ИСТИНА
					КОГДА Документ.НачалоПериода >= &НачалоПериода
							ИЛИ Документ.КонецПериода <= &КонецПериода
						ТОГДА ИСТИНА
					ИНАЧЕ ЛОЖЬ
				КОНЕЦ
Показать
13. user1317438 27.11.19 11:13 Сейчас в теме
Скорее так?
КОГДА &НачалоПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
ИЛИ &КонецПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
ТОГДА ИСТИНА
КОГДА Документ.НачалоПериода >= &НачалоПериода
И Документ.КонецПериода <= &КонецПериода
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ[/IS-QUOTE]

(6)
ВЫБОР
КОГДА &НачалоПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
ИЛИ &КонецПериода МЕЖДУ Документ.НачалоПериода И Документ.КонецПериода
ТОГДА ИСТИНА
КОГДА Документ.НачалоПериода >= &НачалоПериода
ИЛИ Документ.КонецПериода <= &КонецПериода
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ
zavis11; 0ct0ber; +2 Ответить
7. Rain88 376 18.07.17 14:23 Сейчас в теме

Если КонПериод2 > КонПериод1 Тогда
	Если НачПерио2 > КонПериод1 Тогда
		Сообщить("Пересечения нет");
	Иначе
		Сообщить("Пересечение есть");
	КонецЕсли;
Иначе
	Если КонПериод2 < НачПериод1 Тогда
		Сообщить("Пересечения нет");
	Иначе
		Сообщить("Пересечение есть");
	КонецЕсли;
КонецЕсли;

Показать


Но тут правда без проверки на бесконечность. Думаю можно будет просто условия добавить, что если, например НачПериод1 не заполнен, то в любом случае, когда КонПериод2 < КонПериод1 будет пересечение.
Вроде ничего не упустила)
9. МихаилМ 19.07.17 02:38 Сейчас в теме
видел эту задачу в нескольких франчайзи 1с. в течении 10-12 лет.

но не помню, что она выясняет. толи оформление кода ,тк - примитив.
10. Andrekaa 31.08.18 20:27 Сейчас в теме
(9)ох какой шустрый
приведите тогда пример решения, но с учетом того что периодов не два :)
12. Andrekaa 01.09.18 20:58 Сейчас в теме
(11)
ну там явно не примитив :)
15. Obertone 76 02.02.22 15:27 Сейчас в теме
Как вариант, для проверки пересечения периодов подходит решение из этой обработки: https://infostart.ru/public/793701/
16. insurgut 207 08.08.23 09:09 Сейчас в теме
Встала задача объединить периоды, убрав лишние строки в таблице. Т.е. таблица вида

Дата начала Дата окончания
05.06.2023 17.06.2023
15.06.2023 25.06.2023

Должна стать такой:
05.06.2023 25.06.2023

Может кому-то пригодится:

ТаблицаПериодов = Новый ТаблицаЗначений;
ТаблицаПериодов.Колонки.Добавить("ДатаНачала", Новый ОписаниеТипов("Дата"));
ТаблицаПериодов.Колонки.Добавить("ДатаОкончания", Новый ОписаниеТипов("Дата"));

//+++ваш код заполнения таблицы+++
////////
//---ваш код заполнения таблицы---

Для Индекс = -ТаблицаПериодов.Количество() + 1 По 0 Цикл
	Если -Индекс > 1 Тогда
		
		ИндексОбъединения = Индекс + 1;
		
		Пока -ИндексОбъединения >= 0 Цикл
		
			ДатаНачала1 = ТаблицаПериодов[-Индекс].ДатаНачала;
			ДатаНачала2 = ТаблицаПериодов[-ИндексОбъединения].ДатаНачала;
			ДатаОкончания1 = ТаблицаПериодов[-Индекс].ДатаОкончания;
			ДатаОкончания2 = ТаблицаПериодов[-ИндексОбъединения].ДатаОкончания;
			
			Если Макс(ДатаНачала1, ДатаНачала2) <= Мин(ДатаОкончания1, ДатаОкончания2) Тогда         
				//при пересечении периодов оставляем просуммированный интервал
				ТаблицаПериодов[-ИндексОбъединения].ДатаНачала = Мин(ДатаНачала1, ДатаНачала2);
				ТаблицаПериодов[-ИндексОбъединения].ДатаОкончания = Макс(ДатаОкончания1, ДатаОкончания2);
				
				ТаблицаПериодов.Удалить(-Индекс);
				Прервать;
			КонецЕсли;
			
			ИндексОбъединения = ИндексОбъединения + 1;
			
		КонецЦикла;
		
	КонецЕсли;
КонецЦикла;

ТаблицаПериодов.Свернуть("ДатаНачала, ДатаОкончания");
Показать
Оставьте свое сообщение

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