При разработке отчетов на базе объекта ПостроительОтчета в 1С разработчики часто сталкиваются с ситуацией, когда в окне настроек отбора пользователь или программист не может развернуть поле (например, контрагента, организацию или номенклатуру) до его подчиненных реквизитов. Значок «+» напротив поля отсутствует, несмотря на то, что в тексте запроса явно указан спецификатор .*.
Рассмотрим подробно причины возникновения этой проблемы, проанализируем синтаксис построителя отчета и разберем практические способы исправления ошибки.
Проанализируем ситуации, из-за которых ПостроительОтчета перестает разворачивать поля до реквизитов:
{ГДЕ} пакета запросов. Если в тексте запроса используется пакет из нескольких запросов или подзапросов, и одно и то же поле объявлено в описании расширения языка запросов выше по тексту без звездочки (например, Подзапрос.Контрагент), построитель зафиксирует это ограничение для всего отчета. Вложенная секция со звездочкой Подзапрос.Контрагент.* ниже по тексту будет проигнорирована.ЕСТЬNULL, ВЫБОР или при объединении разных таблиц, платформа не всегда может однозначно определить ссылочный тип. Для полей с неявным или составным типом построитель не формирует дерево подчиненных реквизитов.{}.Выясним главную причину, с которой часто сталкиваются разработчики при сложных составных запросах. Посмотрим на пример, когда в первом запросе пакета или в подзапросе прописано следующее построение:
|{ГДЕ
| Подзапрос.Контрагент,
| Подзапрос.Организация}
А далее в основном запросе или ниже по тексту пытается использоваться разворачивание:
|{ГДЕ
| Подзапрос.Контрагент.*,
| Подзапрос.Организация.*}
В этом случае первое объявление без звездочки имеет приоритет. Чтобы исправить данное поведение, необходимо внимательно проверить весь текст запроса (все части пакета запросов) и убедиться, что поле не объявлено ранее без спецификатора .*. Во всех блоках {ГДЕ} для этого поля должен быть указан единственный корректный синтаксис со звездочкой.
Если поле формируется с помощью функции ЕСТЬNULL или сложного выражения, приведем его тип к конкретной ссылке. Это гарантирует, что ПостроительОтчета определит состав реквизитов объекта.
Рассмотрим пример правильного написания поля подзапроса с явным приведением типа:
ВЫРАЗИТЬ(ЕСТЬNULL(Долги.Контрагент, Уведомления.Контрагент) КАК Справочник.Контрагенты) КАК Контрагент
После применения конструкции ВЫРАЗИТЬ платформа точно знает, что колонка Контрагент относится к справочнику Контрагенты, и построитель успешно отобразит все его реквизиты (ИНН, КПП, Юридический адрес и др.) в окне отбора.
Проверим правильность оформления необязательных условий отбора. Построитель отчета использует следующие конструкции для разворачивания реквизитов:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.СуммаОборото КАК Сумма
ИЗ
РегионНакопления.Продажи КАК Продажи
{ГДЕ
Продажи.Контрагент.* КАК Контрагент}
Обратим внимание на основные правила:
.* указывается после имени поля таблицы внутри фигурных скобок {ГДЕ ...}.КАК Контрагент), убедимся, что имена псевдонимов совпадают во всех блоках выборки и отбора..* должен быть прописан именно для итогового поля подзапроса.Чтобы восстановить разворачивание полей отбора до реквизитов в ПостроителеОтчета, выполним следующие действия:
{ГДЕ} без спецификатора .*.ЕСТЬNULL в оператор ВЫРАЗИТЬ(... КАК ...).