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