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