Почему в Построителе Отчета 1С поля отбора не разворачиваются до реквизитов и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе объекта ПостроительОтчета в 1С разработчики часто сталкиваются с ситуацией, когда в окне настроек отбора пользователь или программист не может развернуть поле (например, контрагента, организацию или номенклатуру) до его подчиненных реквизитов. Значок «+» напротив поля отсутствует, несмотря на то, что в тексте запроса явно указан спецификатор .*.

Рассмотрим подробно причины возникновения этой проблемы, проанализируем синтаксис построителя отчета и разберем практические способы исправления ошибки.

Основные причины проблемы

Проанализируем ситуации, из-за которых ПостроительОтчета перестает разворачивать поля до реквизитов:

  1. Дублирование полей в секциях {ГДЕ} пакета запросов. Если в тексте запроса используется пакет из нескольких запросов или подзапросов, и одно и то же поле объявлено в описании расширения языка запросов выше по тексту без звездочки (например, Подзапрос.Контрагент), построитель зафиксирует это ограничение для всего отчета. Вложенная секция со звездочкой Подзапрос.Контрагент.* ниже по тексту будет проигнорирована.
  2. Неопределенный или составной тип данных. Когда поле формируется на лету с использованием функций ЕСТЬNULL, ВЫБОР или при объединении разных таблиц, платформа не всегда может однозначно определить ссылочный тип. Для полей с неявным или составным типом построитель не формирует дерево подчиненных реквизитов.
  3. Отсутствие фигурных скобок расширения языка запросов. Построитель отчета управляет доступностью отборов и группировок только для тех полей, которые помещены в специальный блок построителя, ограниченный фигурными скобками {}.

Шаг 1. Проверка наличия конфликтующих объявлений в пакете запросов

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


|{ГДЕ
|    Подзапрос.Контрагент,
|    Подзапрос.Организация}

А далее в основном запросе или ниже по тексту пытается использоваться разворачивание:


|{ГДЕ
|    Подзапрос.Контрагент.*,
|    Подзапрос.Организация.*}

В этом случае первое объявление без звездочки имеет приоритет. Чтобы исправить данное поведение, необходимо внимательно проверить весь текст запроса (все части пакета запросов) и убедиться, что поле не объявлено ранее без спецификатора .*. Во всех блоках {ГДЕ} для этого поля должен быть указан единственный корректный синтаксис со звездочкой.

Шаг 2. Явное приведение типов с помощью конструкции ВЫРАЗИТЬ

Если поле формируется с помощью функции ЕСТЬNULL или сложного выражения, приведем его тип к конкретной ссылке. Это гарантирует, что ПостроительОтчета определит состав реквизитов объекта.

Рассмотрим пример правильного написания поля подзапроса с явным приведением типа:


ВЫРАЗИТЬ(ЕСТЬNULL(Долги.Контрагент, Уведомления.Контрагент) КАК Справочник.Контрагенты) КАК Контрагент

После применения конструкции ВЫРАЗИТЬ платформа точно знает, что колонка Контрагент относится к справочнику Контрагенты, и построитель успешно отобразит все его реквизиты (ИНН, КПП, Юридический адрес и др.) в окне отбора.

Шаг 3. Правильное оформление секции {ГДЕ} для построителя отчета

Проверим правильность оформления необязательных условий отбора. Построитель отчета использует следующие конструкции для разворачивания реквизитов:


ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    Продажи.СуммаОборото КАК Сумма
ИЗ
    РегионНакопления.Продажи КАК Продажи
{ГДЕ
    Продажи.Контрагент.* КАК Контрагент}

Обратим внимание на основные правила:

  1. Конструкция .* указывается после имени поля таблицы внутри фигурных скобок {ГДЕ ...}.
  2. Если используется псевдоним поля (например, КАК Контрагент), убедимся, что имена псевдонимов совпадают во всех блоках выборки и отбора.
  3. Если отбор устанавливается по полю подзапроса, синтаксис .* должен быть прописан именно для итогового поля подзапроса.

Итоги

Чтобы восстановить разворачивание полей отбора до реквизитов в ПостроителеОтчета, выполним следующие действия:

  1. Проверим весь пакет запроса на отсутствие дублирующих объявлений поля в блоках {ГДЕ} без спецификатора .*.
  2. Обернем составные поля и результаты функций ЕСТЬNULL в оператор ВЫРАЗИТЬ(... КАК ...).
  3. Убедимся, что фигурные скобки описания возможностей построителя расставлены корректно по всему тексту запроса.
← На главную