При работе с типовым механизмом УниверсальныйОтчет в конфигурациях на обычных формах разработчики часто сталкиваются с ситуацией, когда запрос, казалось бы, настроен верно, но Результат.Выгрузить возвращает данные без учета установленных дат. Давайте разберем по шагам, как выявить причину и заставить отчет корректно фильтровать данные.
Первым делом важно убедиться, действительно ли отчет игнорирует параметры, или проблема кроется в структуре данных. Как показывает практика, часто кажется, что фильтр не работает, хотя на самом деле запрос просто выводит записи, которые соответствуют условиям или вообще не зависят от периода (например, если используется неверная виртуальная таблица).
Шаг 1: Проверка регистра данных. Перед тем как переписывать код, проверьте, какие именно данные хранятся в регистре. В сообщении 18 из нашей темы выяснилось, что автор ошибочно полагал, будто отчет «не работает», хотя в реальности записи регистра накопления ВзаиморасчетыСКонтрагентами попадали в выборку по иным причинам, не связанным с периодом. Убедитесь, что запрос обращается именно к тем полям, которые ограничены вашими параметрами.
Если вы убедились, что проблема не в данных, необходимо принудительно задать параметры в ПостроительОтчета. Типовой метод СформироватьОтчет выполняет множество действий автоматически, но если вы работаете с результатами напрямую, лучше контролировать процесс установки параметров самостоятельно.
Для корректной работы с датами, особенно при использовании виртуальных таблиц вида ОстаткиИОбороты, рекомендуется использовать объект Граница. Это позволяет избежать проблем с включением или исключением крайних моментов времени.
Рассмотрим пример кода для корректной установки параметров перед формированием отчета:
// Установка параметров с использованием Границ для точного попадания
УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаНач", ?(УниверсальныйОтчет.ДатаНач = Дата('00010101000000'), УниверсальныйОтчет.ДатаНач, Новый Граница(НачалоДня(УниверсальныйОтчет.ДатаНач), ВидГраницы.Включая)));
УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ДатаКон", ?(УниверсальныйОтчет.ДатаКон = Дата('00010101000000'), УниверсальныйОтчет.ДатаКон, Новый Граница(КонецДня(УниверсальныйОтчет.ДатаКон), ВидГраницы.Включая)));
Чтобы гарантированно передать параметры в отчет, используйте следующую последовательность действий в модуле объекта, переопределяя процедуру СформироватьОтчет. Важно передать параметры именно до того, как будет вызван основной механизм формирования, либо сразу после него, если вы перехватываете результат:
Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт
// Вставляем необходимые параметры в коллекцию параметров построителя
УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("МойПараметр", НужнаяДата);
// Вызываем стандартный метод формирования отчета
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент,,, ЭтотОбъект);
// Получаем результат уже после инициализации параметров
ТЧ = УниверсальныйОтчет.ПостроительОтчета.Результат.Выгрузить();
КонецПроцедуры
УниверсальныйОтчет.ПостроительОтчета.Параметры непосредственно перед вызовом Выполнить() или Выгрузить(). Если параметр там отсутствует, он не будет применен в запросе.ПостроительОтчета.Текст в консоль запросов. Установите там вручную те же параметры, которые передаете из кода. Если в консоли запрос отрабатывает верно, значит, проблема именно в способе передачи параметров из 1С в объект ПостроительОтчета.&ДатаНач) полностью соответствовали ключам, которые вы передаете в ПостроительОтчета.Параметры.Вставить("ИмяПараметра", Значение).Следуя этим рекомендациям, вы сможете эффективно управлять данными, которые выводит УниверсальныйОтчет, и избежать типичных ошибок при работе с временными интервалами в запросах 1С.