Как правильно выбрать значимый минимум или максимум даты в запросе 1С, исключив пустые значения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто при работе с регистрами сведений в 1С мы сталкиваемся с ситуацией, когда данные в полях ДатаНачала или ДатаОкончания могут быть не заполнены, то есть содержать значение 01.01.0001. Если мы используем стандартные агрегатные функции МИНИМУМ() или МАКСИМУМ(), эти «пустые» даты попадают в выборку, что приводит к некорректным результатам — система всегда отдает 01.01.0001 как минимальное значение. Давайте разберем, как научить запрос «видеть» только значимые даты.

Метод 1: Использование конструкции ВЫБОР и NULL

Суть данного метода заключается в том, чтобы на этапе формирования выборки заменить все пустые даты на значение NULL. Это работает идеально, потому что агрегатные функции МИНИМУМ() и МАКСИМУМ() в 1С при расчетах полностью игнорируют NULL. Таким образом, пустые значения просто «выпадут» из процесса сравнения, и система выберет наиболее раннюю (или позднюю) из заполненных дат.

Рассмотрим, как это реализовать в коде запроса:


ВЫБРАТЬ
    МИНИМУМ(ВЫБОР 
        КОГДА Таблица.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1) ТОГДА NULL 
        ИНАЧЕ Таблица.ДатаНачала 
    КОНЕЦ) КАК ДатаНачала
ИЗ
    РегистрСведений.Периоды КАК Таблица
ГДЕ
    Таблица.Сотрудник = &Сотрудник
    И Таблица.Регистратор В(&МассивДокументов)

В этом примере мы используем функцию ДАТАВРЕМЯ(1, 1, 1) для идентификации пустой даты. Если условие выполняется, запрос возвращает NULL, который благополучно игнорируется функцией МИНИМУМ().

Метод 2: Обработка результата с помощью ЕСТЬNULL()

Если после выполнения агрегации мы хотим получить «красивый» результат даже в том случае, если все записи в группе содержали пустые даты (или если данных не было вовсе), нам поможет функция ЕСТЬNULL(). Она позволяет задать значение по умолчанию, если итоговый результат агрегации оказался NULL.

Давайте дополним наш запрос для обеспечения безопасности данных:


ВЫБРАТЬ
    ЕСТЬNULL(
        МИНИМУМ(
            ВЫБОР 
                КОГДА Таблица.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1) ТОГДА NULL 
                ИНАЧЕ Таблица.ДатаНачала 
            КОНЕЦ
        ), 
        ДАТАВРЕМЯ(1, 1, 1)
    ) КАК ДатаНачала
ИЗ
    РегистрСведений.Периоды КАК Таблица
ГДЕ
    Таблица.Сотрудник = &Сотрудник

Теперь запрос работает надежно:

  1. Мы очищаем данные от пустых значений, превращая их в NULL.
  2. Агрегатная функция вычисляет минимум только среди реально существующих дат.
  3. Если в результате всех действий мы получили NULL (например, все даты были пустыми), функция ЕСТЬNULL() вернет нам 01.01.0001, сохранив тип данных Дата в результирующей выборке.

Важные замечания по работе с NULL

При работе с такими конструкциями полезно помнить несколько правил, которые помогут вам избежать ошибок:

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

← На главную