Часто при работе с регистрами сведений в 1С мы сталкиваемся с ситуацией, когда данные в полях ДатаНачала или ДатаОкончания могут быть не заполнены, то есть содержать значение 01.01.0001. Если мы используем стандартные агрегатные функции МИНИМУМ() или МАКСИМУМ(), эти «пустые» даты попадают в выборку, что приводит к некорректным результатам — система всегда отдает 01.01.0001 как минимальное значение. Давайте разберем, как научить запрос «видеть» только значимые даты.
Суть данного метода заключается в том, чтобы на этапе формирования выборки заменить все пустые даты на значение NULL. Это работает идеально, потому что агрегатные функции МИНИМУМ() и МАКСИМУМ() в 1С при расчетах полностью игнорируют NULL. Таким образом, пустые значения просто «выпадут» из процесса сравнения, и система выберет наиболее раннюю (или позднюю) из заполненных дат.
Рассмотрим, как это реализовать в коде запроса:
ВЫБРАТЬ
МИНИМУМ(ВЫБОР
КОГДА Таблица.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1) ТОГДА NULL
ИНАЧЕ Таблица.ДатаНачала
КОНЕЦ) КАК ДатаНачала
ИЗ
РегистрСведений.Периоды КАК Таблица
ГДЕ
Таблица.Сотрудник = &Сотрудник
И Таблица.Регистратор В(&МассивДокументов)
В этом примере мы используем функцию ДАТАВРЕМЯ(1, 1, 1) для идентификации пустой даты. Если условие выполняется, запрос возвращает NULL, который благополучно игнорируется функцией МИНИМУМ().
Если после выполнения агрегации мы хотим получить «красивый» результат даже в том случае, если все записи в группе содержали пустые даты (или если данных не было вовсе), нам поможет функция ЕСТЬNULL(). Она позволяет задать значение по умолчанию, если итоговый результат агрегации оказался NULL.
Давайте дополним наш запрос для обеспечения безопасности данных:
ВЫБРАТЬ
ЕСТЬNULL(
МИНИМУМ(
ВЫБОР
КОГДА Таблица.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1) ТОГДА NULL
ИНАЧЕ Таблица.ДатаНачала
КОНЕЦ
),
ДАТАВРЕМЯ(1, 1, 1)
) КАК ДатаНачала
ИЗ
РегистрСведений.Периоды КАК Таблица
ГДЕ
Таблица.Сотрудник = &Сотрудник
Теперь запрос работает надежно:
NULL.NULL (например, все даты были пустыми), функция ЕСТЬNULL() вернет нам 01.01.0001, сохранив тип данных Дата в результирующей выборке.При работе с такими конструкциями полезно помнить несколько правил, которые помогут вам избежать ошибок:
NULL — это не то же самое, что пустая дата или пустая ссылка. Это «отсутствие значения». Обычное сравнение = NULL в 1С всегда вернет Ложь. Поэтому всегда используйте ЕСТЬ NULL для проверки.МИНИМУМ и МАКСИМУМ пропускают NULL, что делает их очень удобным инструментом для фильтрации «мусорных» данных в отчетах.ЕСТЬNULL(Выражение, Замена) следите за тем, чтобы тип данных аргумента Замена соответствовал типу данных Выражения, иначе запрос может выдать ошибку приведения типов.Используя эти методы, вы сможете корректно обрабатывать интервалы в регистрах сведений даже в самых сложных случаях, когда данные приходят из разных регистраторов и имеют разную степень заполненности.