Часто разработчики 1С сталкиваются с ситуацией, когда запрос, идеально работающий в Консоли запросов, отказывается возвращать данные при выводе в отчет на базе Системы Компоновки Данных (СКД). Давайте разберем по шагам, почему это происходит и как устранить проблему.
Одной из самых частых причин «пропадания» данных являются связи наборов данных. В СКД связь работает не так, как обычный LEFT JOIN в SQL. Если в настройках связи указаны параметры, которые в контексте отчета не заполнены (например, имеют значение NULL), СКД может отфильтровать всю выборку.
Если в вашем запросе используются функции общих модулей (например, поиск свойства по наименованию), помните, что СКД ограничивает их использование в целях безопасности. Если вы формируете отчет программно, необходимо явно разрешить использование внешних функций.
Разберем пример инициализации процессора компоновки. Если при попытке вывода данных возникает синтаксическая ошибка, связанная с обращением к общему модулю, проверьте, как инициализируется процессор:
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);
Параметр Истина в конце разрешает использование внешних функций внутри выражений СКД. Без этого флага процессор просто не сможет выполнить ваш код.
Иногда данные возвращаются, но они отображаются пустыми, так как поле имеет значение NULL или 0. Рассмотрим, как это проверить и исправить:
ЕСТЬNULL(Поле, 0), чтобы избавиться от неопределенности.Чтобы понять, что именно СКД «отрезает» в запросе, используйте встроенные средства анализа. СКД может добавлять свои условия в секцию ГДЕ, если параметры связи или отбора настроены некорректно.
Посмотрите, какой итоговый текст запроса отправляется к серверу. Часто бывает, что параметры, которые вы передаете, имеют тип СправочникСсылка, а в запрос попадает пустая ссылка или тип, не соответствующий ожидаемому в регистре. В этом случае используйте ВЫРАЗИТЬ для принудительного приведения типов в самом тексте запроса:
ВЫБРАТЬ
ВЫРАЗИТЬ(Регистр.Значение КАК Число(15, 2)) КАК Значение
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК Регистр
Подводя итоги, при возникновении подобных проблем следуйте данному алгоритму:
Функциональная опция доступ к данным регистра для текущего пользователя.СКД идентичны тем, что используются в консоли.ПроцессорКомпоновкиДанных, не забывайте про флаг использования внешних функций.Решение подобных задач требует внимательности к связям наборов данных. Часто достаточно просто убрать лишнее условие в Связях или привести типы данных к общему знаменателю, чтобы отчет заработал корректно.