При разработке прикладных решений на платформе 1С:Предприятие мы часто сталкиваемся с необходимостью контролировать временные интервалы. Это может быть проверка периодов действия договоров, графиков отпусков, аренды или регистрации сведений в регистрах. Одной из частых задач является проверка: входит ли один период в другой или пересекаются ли они. Давайте разберем, как реализовать эту логику корректно и избежать досадных ошибок.
Зачастую при написании условий мы путаемся в логических операторах И и ИЛИ. Давайте проанализируем задачу «от обратного». Нам проще определить ситуацию, когда периоды не пересекаются, чем пытаться вычислить их точное вхождение напрямую.
Представим два периода:
Спр.ДатаНачала – Спр.ДатаКонцаНачДата – КонДатаПериоды гарантированно не пересекаются, если один из них полностью заканчивается до начала другого. То есть:
Для реализации этой проверки в коде 1С мы используем оператор ИЛИ, так как нам достаточно выполнения хотя бы одного из условий, чтобы констатировать отсутствие пересечения.
Если Спр.ДатаНачала > КонДата ИЛИ Спр.ДатаКонца < НачДата Тогда
// Периоды не пересекаются, можем продолжить выполнение цикла
Продолжить;
КонецЕсли;
В ходе работы мы часто ошибочно используем И вместо ИЛИ. Давайте выясним, почему это приводит к нерабочему коду. Если мы напишем условие (Спр.ДатаНачала > КонДата) И (Спр.ДатаКонца < НачДата), то логическое выражение будет истинным только в том случае, если период одновременно начинается после конца второго и заканчивается до его начала. Математически это невозможно, так как начало периода не может быть позже его же конца. Таким образом, код внутри условия никогда не выполнится, и программа будет работать некорректно.
При проверке интервалов важно помнить про «границу». Если ваши периоды могут соприкасаться (например, один заканчивается в ту же секунду, когда начинается другой), необходимо учитывать равенство.
Если по условиям вашей задачи такие «стыковочные» периоды считаются пересекающимися, используйте операторы сравнения без знака «равно». Если же ситуация, при которой конец одного периода совпадает с началом другого, является допустимой, или наоборот, требует обработки — обязательно добавьте проверку на равенство:
// Пример с учетом граничных значений
Если Спр.ДатаНачала >= КонДата ИЛИ Спр.ДатаКонца <= НачДата Тогда
// Обработка случая с учетом совпадения границ
КонецЕсли;
ИЛИ.ДатаНачала и ДатаКонца действительно содержат значения типа Дата, а не Null или пустые значения, иначе сравнение может привести к неожиданным результатам.НачалоМесяца(), КонецМесяца(), НачалоГода() и т.д. Это избавит вас от проблем с «забытыми» секундами внутри даты.Применяя данные подходы, вы сможете легко управлять логикой временных интервалов в 1С. Помните, что чистота кода и правильное использование логических операторов — залог отсутствия ошибок в сложных алгоритмах обработки данных.