Почему не выводятся данные регистра сведений в отчете СКД, хотя запрос в консоли работает?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

Часто разработчики 1С сталкиваются с ситуацией, когда запрос, идеально работающий в Консоли запросов, отказывается возвращать данные при выводе в отчет на базе Системы Компоновки Данных (СКД). Давайте разберем по шагам, почему это происходит и как устранить проблему.

Проверка связей наборов данных

Одной из самых частых причин «пропадания» данных являются связи наборов данных. В СКД связь работает не так, как обычный LEFT JOIN в SQL. Если в настройках связи указаны параметры, которые в контексте отчета не заполнены (например, имеют значение NULL), СКД может отфильтровать всю выборку.

  1. Перейдите в конструктор настроек СКД на вкладку Связи наборов данных.
  2. Проверьте, по каким полям осуществляется связь. Убедитесь, что типы данных в обоих наборах совпадают.
  3. Проверьте условие связи. Если в поле связи передается параметр, убедитесь, что он доступен и заполнен в настройках отчета.
  4. Попробуйте временно убрать связь и вывести данные напрямую — это поможет понять, на каком этапе «отрезаются» строки.

Использование функций общих модулей в запросе

Если в вашем запросе используются функции общих модулей (например, поиск свойства по наименованию), помните, что СКД ограничивает их использование в целях безопасности. Если вы формируете отчет программно, необходимо явно разрешить использование внешних функций.

Разберем пример инициализации процессора компоновки. Если при попытке вывода данных возникает синтаксическая ошибка, связанная с обращением к общему модулю, проверьте, как инициализируется процессор:


ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);

Параметр Истина в конце разрешает использование внешних функций внутри выражений СКД. Без этого флага процессор просто не сможет выполнить ваш код.

Проблема типизации и представления нуля

Иногда данные возвращаются, но они отображаются пустыми, так как поле имеет значение NULL или 0. Рассмотрим, как это проверить и исправить:

  1. В запросе используйте конструкцию ЕСТЬNULL(Поле, 0), чтобы избавиться от неопределенности.
  2. В настройках набора данных на вкладке Наборы данных выберите нужное поле.
  3. Перейдите в колонку Оформление и откройте настройки формата.
  4. Установите формат числа, чтобы явно указать Представление нуля. Если после этого в отчете появился «0», значит данные доходят, но были скрыты настройками отображения.

Анализ запроса через отладку

Чтобы понять, что именно СКД «отрезает» в запросе, используйте встроенные средства анализа. СКД может добавлять свои условия в секцию ГДЕ, если параметры связи или отбора настроены некорректно.

Посмотрите, какой итоговый текст запроса отправляется к серверу. Часто бывает, что параметры, которые вы передаете, имеют тип СправочникСсылка, а в запрос попадает пустая ссылка или тип, не соответствующий ожидаемому в регистре. В этом случае используйте ВЫРАЗИТЬ для принудительного приведения типов в самом тексте запроса:


ВЫБРАТЬ
    ВЫРАЗИТЬ(Регистр.Значение КАК Число(15, 2)) КАК Значение
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК Регистр

Заключение и рекомендации

Подводя итоги, при возникновении подобных проблем следуйте данному алгоритму:

Решение подобных задач требует внимательности к связям наборов данных. Часто достаточно просто убрать лишнее условие в Связях или привести типы данных к общему знаменателю, чтобы отчет заработал корректно.

← На главную