Главная страница » 1с как проверить что периоды пересекаются

1с как проверить что периоды пересекаются

В 1С проверить, пересекаются ли два периода, можно несколькими способами. Выбор конкретного способа зависит от того, как представлены периоды: в виде двух дат (начало и конец) или в виде объектов, содержащих даты начала и окончания.

Способ 1: Проверка пересечения периодов, заданных датами (самый распространенный):

Функция ПериодыПересекаются(ДатаНачала1, ДатаОкончания1, ДатаНачала2, ДатаОкончания2)

// Проверяем, что даты начала и окончания периодов заполнены

Если Не ЗначениеЗаполнено(ДатаНачала1) Или Не ЗначениеЗаполнено(ДатаОкончания1) Или Не ЗначениеЗаполнено(ДатаНачала2) Или Не ЗначениеЗаполнено(ДатаОкончания2) Тогда

Возврат Ложь; // Если хотя бы одна дата не заполнена, считаем, что периоды не пересекаются

КонецЕсли;

// Проверяем, что дата окончания больше или равна дате начала для обоих периодов

Если ДатаОкончания1 < ДатаНачала1 Или ДатаОкончания2 < ДатаНачала2 Тогда

Возврат Ложь; // Некорректные периоды (дата окончания раньше даты начала), считаем, что не пересекаются

КонецЕсли;

// Проверяем, что период 1 заканчивается до начала периода 2 ИЛИ период 2 заканчивается до начала периода 1

Если ДатаОкончания1 < ДатаНачала2 ИЛИ ДатаОкончания2 < ДатаНачала1 Тогда

Возврат Ложь; // Периоды не пересекаются

Иначе

Возврат Истина; // Периоды пересекаются

КонецЕсли;

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

//Пример использования:

ДатаНачала1 = Дата(2024, 11, 01);

ДатаОкончания1 = Дата(2024, 11, 15);

ДатаНачала2 = Дата(2024, 11, 10);

ДатаОкончания2 = Дата(2024, 11, 20);

Если ПериодыПересекаются(ДатаНачала1, ДатаОкончания1, ДатаНачала2, ДатаОкончания2) Тогда

Сообщить("Периоды пересекаются");

Иначе

Сообщить("Периоды не пересекаются");

КонецЕсли;

Объяснение:

Функция ПериодыПересекаются принимает четыре параметра: даты начала и окончания двух периодов.

Сначала проверяется, заполнены ли все даты. Если хотя бы одна дата не заполнена, считается, что периоды не пересекаются.

Затем проверяется, что дата окончания не раньше даты начала для обоих периодов.

Функция возвращает Истина, если периоды пересекаются, и Ложь, если не пересекаются.

Основная логика проверки: периоды не пересекаются, если период 1 заканчивается раньше, чем начинается период 2, ИЛИ период 2 заканчивается раньше, чем начинается период 1. В противном случае периоды пересекаются.

Способ 2: Более краткая запись той же логики:

Функция ПериодыПересекаются(ДатаНачала1, ДатаОкончания1, ДатаНачала2, ДатаОкончания2)

// Проверка на заполненность и корректность (опущено для краткости, рекомендуется добавить)

Возврат Не (ДатаОкончания1 < ДатаНачала2 ИЛИ ДатаОкончания2 < ДатаНачала1);

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

Способ 3: Проверка пересечения периодов, представленных объектами (например, элементами справочника):

Предположим, у вас есть справочник “Периоды”, у которого есть реквизиты “ДатаНачала” и “ДатаОкончания”.

Функция ПериодыОбъектовПересекаются(Объект1, Объект2)

ДатаНачала1 = Объект1.ДатаНачала;

ДатаОкончания1 = Объект1.ДатаОкончания;

ДатаНачала2 = Объект2.ДатаНачала;

ДатаОкончания2 = Объект2.ДатаОкончания;

// Проверка на заполненность и корректность (опущено для краткости, рекомендуется добавить)

Возврат Не (ДатаОкончания1 < ДатаНачала2 ИЛИ ДатаОкончания2 < ДатаНачала1);

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

//Пример использования:

Если ПериодыОбъектовПересекаются(ОбъектПериода1, ОбъектПериода2) Тогда

Сообщить("Периоды объектов пересекаются");

Иначе

Сообщить("Периоды объектов не пересекаются");

КонецЕсли;

Объяснение:

Функция ПериодыОбъектовПересекаются принимает два объекта в качестве параметров.

Из каждого объекта извлекаются даты начала и окончания.

Далее используется логика, аналогичная способу 1, для проверки пересечения периодов.

Способ 4: Использование запроса (например, для проверки пересечения периодов в регистре):

Этот способ подходит, если нужно проверить пересечение периодов для нескольких записей в регистре или другом источнике данных.

Запрос = Новый Запрос;

Запрос. Текст =

"ВЫБРАТЬ

| ЕСТЬNULL(Период1.Ссылка, ЗНАЧЕНИЕ(Справочник. Периоды. ПустаяСсылка)) КАК Период1,

| ЕСТЬNULL(Период2.Ссылка, ЗНАЧЕНИЕ(Справочник. Периоды. ПустаяСсылка)) КАК Период2,

| ВЫБОР

| КОГДА Период1.ДатаОкончания < Период2.ДатаНачала

| ИЛИ Период2.ДатаОкончания < Период1.ДатаНачала

| ТОГДА ЛОЖЬ

| ИНАЧЕ ИСТИНА

| КОНЕЦ КАК Пересекаются

|ИЗ

| Справочник. Периоды КАК Период1

| ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ Справочник. Периоды КАК Период2

|ГДЕ

| Период1.Ссылка = &Период1

| И Период2.Ссылка = &Период2";

Запрос. УстановитьПараметр("Период1", СсылкаНаПериод1);

Запрос. УстановитьПараметр("Период2", СсылкаНаПериод2);

Результат = Запрос. Выполнить();

Выборка = Результат. Выбрать();

Если Выборка. Следующий() Тогда

Пересекаются = Выборка. Пересекаются;

Сообщить("Пересекаются: " + Пересекаются);

КонецЕсли;

Рекомендации:

Всегда проверяйте заполненность дат.

Убедитесь, что дата окончания не раньше даты начала.

Выберите способ, который лучше всего соответствует вашим требованиям и типу данных.

Тщательно протестируйте функцию или запрос, чтобы убедиться в ее правильной работе.

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх