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