Разработчики 1С часто сталкиваются с ситуацией, когда один и тот же текст запроса выдает правильные данные в консоли запросов, но при выводе через Систему компоновки данных (СКД) некоторые поля (например, суммы оборотов или остатки) оказываются пустыми. Рассмотрим причины этого поведения и разберем по шагам, как заставить отчет работать корректно.
Основное различие между обычным запросом и СКД заключается в том, что СКД не выполняет запрос «как есть». Перед отправкой на сервер СУБД система трансформирует текст, оптимизирует его и — что самое важное — автоматически подставляет значения в параметры виртуальных таблиц. Выясним причину, почему жесткое указание дат в коде запроса (как в примере ниже) часто не дает результата в СКД.
ВЫБРАТЬ
ВзаиморасчетыПоАрендеОбороты.СуммаКОплатеРасход КАК СуммаКОплатеРасход
ИЗ
РегистрНакопления.ВзаиморасчетыПоАренде.Обороты(ДАТАВРЕМЯ(1, 1, 1), ДАТАВРЕМЯ(3999, 12, 31), , ) КАК ВзаиморасчетыПоАрендеОбороты
Даже если мы прописали ДАТАВРЕМЯ(1, 1, 1), СКД при генерации итогового макета может заменить эти границы на значения из стандартных параметров НачалоПериода и КонецПериода. Если пользователь выбрал в настройках отчета «Май», а платеж (расход) прошел в июне, СКД просто отсечет эти данные на уровне обращения к виртуальной таблице, и в отчете мы увидим пустоту.
Для того чтобы предоставить СКД возможность управлять периодом, но при этом сохранить контроль над логикой, разберем метод использования фигурных скобок {}. Это позволяет системе компоновки «видеть» параметры, но не подставлять их принудительно туда, где это может повредить выборке.
Однако более надежным способом для исключения автоматической подстановки является переименование параметров внутри виртуальной таблицы. Рассмотрим пример:
ВЫБРАТЬ
Взаиморасчеты.СуммаКОплатеРасход
ИЗ
РегистрНакопления.ВзаиморасчетыПоАренде.Обороты(&ДатаНачалаСпец, &ДатаКонцаСпец, , ) КАК Взаиморасчеты
Если мы назовем параметры &ДатаНачалаСпец вместо стандартных имен, СКД не будет связывать их с общим периодом отчета автоматически. Нам останется лишь настроить их на вкладке «Параметры» в схеме компоновки.
Проанализируем ситуацию, когда СКД исключает «лишние» поля или условия. Если мы хотим, чтобы виртуальная таблица Обороты была считана полностью, без влияния внешних фильтров периода, мы можем поместить её во вложенный запрос. Рассмотрим, как это выглядит структурно:
ВЫБРАТЬ
ВложенныйЗапрос.СуммаКОплатеРасход
ИЗ
(ВЫБРАТЬ
ВзаиморасчетыОбороты.СуммаКОплатеРасход КАК СуммаКОплатеРасход
ИЗ
РегистрНакопления.ВзаиморасчетыПоАренде.Обороты(&Начало, &Конец, , ) КАК ВзаиморасчетыОбороты) КАК ВложенныйЗапрос
В этом случае СКД гораздо сложнее «вмешаться» во внутренние параметры виртуальной таблицы. Это гарантирует, что данные будут получены именно за тот период, который мы передали во вложенный запрос, а не за период, выбранный пользователем для всего отчета.
Посмотрим на вкладку «Наборы данных» в СКД. Критически важно проверить колонку «Роль». Для полей остатков и оборотов система должна четко понимать, к какому измерению и периоду они относятся. Если платеж прошел в июне, а вы выводите отчет в разрезе месяцев, убедитесь, что:
Период имеет соответствующую роль (Период, Номер 1).СуммаКОплатеРасход добавлено на вкладку «Ресурсы».СУММА(СуммаКОплатеРасход).Если поле не определено как ресурс, то при любых группировках (например, по Контрагенту) СКД может просто не понимать, как агрегировать эти данные, и выводить пустую ячейку вместо суммы.
Иногда полезно вынести условия по датам из параметров виртуальной таблицы в секцию ГДЕ. Хотя это менее эффективно с точки зрения производительности СУБД, это заставляет СКД обрабатывать данные после их выборки из регистра. Посмотрим на пример изменения логики:
ВЫБРАТЬ
Взаиморасчеты.СуммаКОплатеРасход
ИЗ
РегистрНакопления.ВзаиморасчетыПоАренде.Обороты(, , Авто, ) КАК Взаиморасчеты
ГДЕ
Взаиморасчеты.Период МЕЖДУ &Начало И &Конец
Такой подход заставляет систему сначала получить записи (возможно, за весь период), а затем отфильтровать их. Это помогает избежать ситуации, когда СКД «затирает» параметры таблицы Обороты своими внутренними значениями.
Для детальной отладки всегда рекомендуется использовать Консоль системы компоновки данных. С её помощью можно увидеть «Исполняемый запрос» — это тот самый текст, который СКД генерирует после всех преобразований. Обычно именно там обнаруживается, что вместо ваших дат вставлены &П1 и &П2, равные границам текущего месяца.
Также проверьте флаг «Обязательное» для полей в настройках схемы. Если поле ДокументРасчетов не выбрано пользователем в отчете, СКД может исключить его из выборки в виртуальной таблице Обороты, что приведет к сворачиванию (агрегации) данных, и результат может измениться по сравнению с консолью запросов.
Подводя итог, разберем краткий чек-лист для исправления проблемы:
НачалоПериода и КонецПериода в настройках параметров схемы.