Разработка отчетов на базе Схемы компоновки данных (СКД) — стандартная задача для разработчика 1С. Однако СКД работает не так, как обычный вывод таблицы значений. Иногда мы сталкиваемся с неочевидным поведением системы: добавленная в настройки колонка упорно не появляется на экране, либо данные по определенным документам (например, по Отчету о розничных продажах) прекрасно видны в консоли запросов, но наотрез отказываются выводиться в готовом отчете. В этой статье мы подробно разберем обе проблемы, выясним их причины и пошагово реализуем рабочие решения.
Проанализируем ситуацию на практическом примере. Представим, что мы дорабатываем внешний отчет по себестоимости продаж. Нам требуется вывести дубликат колонки себестоимости для дополнительных расчетов, а также разобраться, почему по оптовым заказам себестоимость выводится, а по розничным продажам — колонка остается пустой, хотя сам запрос в консоли возвращает заполненные строки.
---
Рассмотрим стандартную ситуацию: разработчик переходит на вкладку Настройки -> Выбранные поля и добавляет туда одно и то же поле (например, Себестоимость) дважды. При формировании отчета колонка выводится только один раз. Почему так происходит?
Дело в том, что СКД оптимизирует вывод данных. Если система видит в списке выбранных полей несколько элементов с одинаковым Путем к данным, она считает это избыточностью и автоматически схлопывает их в одну физическую колонку макета. Это стандартное поведение платформы для предотвращения вывода дублирующей информации.
Разберем два эффективных способа обойти это ограничение.
Этот способ позволяет продублировать колонку без изменения текста запроса, исключительно средствами настроек СКД. Выполним следующие шаги:
СебестоимостьКопия.Себестоимость.Сумма(СебестоимостьКопия).Себестоимость, так и наше новое вычисляемое поле СебестоимостьКопия.После этого СКД распознает их как два разных пути к данным и успешно выведет на экран две отдельные колонки с одинаковыми значениями.
Если мы хотим решить задачу на уровне источника данных, то можем продублировать поле непосредственно в тексте запроса схемы компоновки данных. Посмотрим на пример кода:
ВЫБРАТЬ
Продажи.Документ КАК Документ,
Продажи.Себестоимость КАК Себестоимость,
Продажи.Себестоимость КАК СебестоимостьВторая
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Продажи
После изменения запроса на вкладке Наборы данных появится новое поле СебестоимостьВторая. Нам останется лишь зайти на вкладку Ресурсы, сделать его ресурсом по аналогии с основным полем и добавить в выбранные поля настроек отчета.
---
Это классическая проблема, которая часто ставит в тупик даже опытных разработчиков. В консоли запросов мы пишем левое соединение таблиц или объединение, видим заполненные строки по Отчетам о розничных продажах, но в сформированном отчете СКД эти ячейки оказываются пустыми. Выясним, почему СКД искажает первоначальный запрос, и как это исправить.
СКД — это интеллектуальный механизм. Перед отправкой SQL-запроса к СУБД он анализирует, какие поля выбраны пользователем в настройках отчета. Если в настройках не выбраны ключевые поля, по которым происходит связь таблиц (например, реквизиты документов или аналитика), СКД в целях повышения производительности вырезает «лишние» соединения из итогового запроса.
Если данные по розничным продажам подтягивались через левое соединение, которое СКД посчитал ненужным, данные по себестоимости розницы просто исчезнут.
Решение: Установим флаг обязательности для ключевых полей связи. Разберем по шагам:
Документ, Регистратор или ключевые аналитики).Когда мы тестируем запрос в консоли под полными правами, RLS не применяется. Но при формировании отчета СКД запускается под правами текущего пользователя.
Если в тексте запроса мы обращаемся к реквизитам через точку от реквизита составного типа (например, Регистратор.Организация или Регистратор.Дата), а у пользователя нет прав на чтение хотя бы одного из типов документов, входящих в этот регистратор (например, закрыты права на документ ОтчетОРозничныхПродажах), то СКД вернет NULL для всех подобных строк.
Решение: Используем явное приведение типов с помощью конструкции ВЫРАЗИТЬ(). Рассмотрим пример правильного написания запроса:
ВЫБРАТЬ
ВЫБОР
КОГДА Ссылка ССЫЛКА Документ.ОтчетОРозничныхПродажах
ТОГДА ВЫРАЗИТЬ(Ссылка КАК Документ.ОтчетОРозничныхПродажах).Себестоимость
КОГДА Ссылка ССЫЛКА Документ.ЗаказКлиента
ТОГДА ВЫРАЗИТЬ(Ссылка КАК Документ.ЗаказКлиента).Себестоимость
КОНЕЦ КАК СебестоимостьДокумента
ИЗ
...
Явное приведение типов исключает избыточные проверки безопасности СУБД и предотвращает появление пустых значений из-за ограничений RLS.
Если в СКД включен флаг Автозаполнение, система автоматически управляет параметрами виртуальных таблиц остатков и оборотов.
Часто документы розничной торговли записываются и проводятся концом дня (время 23:59:59). Если СКД передает в параметр конца периода стандартную дату (например, без учета времени или границу периода, не включающую последнюю секунду), то эти документы физически не попадают в выборку виртуальной таблицы.
Решение: Проверим и настроим параметры в СКД:
КонецПериода в колонке Выражение пропишем приведение к концу дня: КонецПериода(&КонецПериода, "ДЕНЬ").Граница, то выражение будет выглядеть так: Новый Граница(КонецПериода(&КонецПериода, "ДЕНЬ"), ВидГраницы.Включая).---
Если вышеописанные способы не помогают, применим профессиональный метод отладки — просмотр сгенерированного SQL-запроса через Консоль компоновки данных.
Эта обработка позволяет увидеть финальный текст запроса, который СКД отправляет в СУБД после наложения всех пользовательских настроек, отборов и оптимизаций. Открыв макет компоновки для табличного документа в консоли СКД, мы сможем скопировать этот итоговый запрос, запустить его в обычной консоли запросов и сразу увидеть, на каком этапе (из-за условий связей, параметров или отборов) отсекаются строки по розничным продажам.