При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в пользовательских настройках или в самом конструкторе отбора ссылочное поле (например, ДоговорКонтрагента или Номенклатура) отображается как плоский элемент. В норме рядом с таким полем должен быть символ «+» (плюсик), позволяющий разыменовать поле и выбрать его дочерние реквизиты (например, Договор.Дата или Договор.ВидДоговора). Если этот символ отсутствует, это ограничивает возможности пользователя по фильтрации данных.
Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам все способы её решения, от самых простых настроек в конфигураторе до нюансов в языке запросов.
Наиболее частой причиной «исчезновения» иерархии реквизитов является неопределенность типа данных для системы компоновки. Если поле выбирается из сложного запроса, где тип может быть составным или не определен однозначно метаданными, СКД не может построить дерево подчиненных полей.
Проанализируем ситуацию и выполним следующие действия:
ДоговорКонтрагента).ЛюбаяСсылка, система не понимает, свойства какого объекта ей показывать.СправочникСсылка.ДоговорыКонтрагентов).После явного указания типа СКД мгновенно подтянет все доступные реквизиты этого объекта, и заветный «плюсик» появится в интерфейсе отчета.
Бывает так, что тип указан верно, но поле все равно остается «закрытым». В этом случае проблему стоит искать в настройках компоновщика. Разберем, как это проверить:
Перейдем на закладку «Компоновка данных» (она находится внутри настроек конкретного набора данных в конструкторе схемы). Здесь мы можем увидеть список доступных полей компоновки. Для каждого поля существует флаг, отвечающий за возможность использования вложенных свойств.
Найдем нужное поле и убедимся, что для него разрешено использовать дочерние элементы. Если этот механизм заблокирован на уровне компоновщика, пользователь не сможет развернуть структуру реквизитов в режиме «Предприятие».
Если ваше поле имеет составной тип данных (например, поле ДокументОснование, которое может быть и «Счетом», и «Заказом»), СКД не знает, какой именно набор реквизитов выводить до того момента, пока не будет выбран конкретный тип в отборе. Чтобы упростить жизнь пользователю и сразу дать доступ к полям конкретного типа, мы можем применить типизацию на уровне SQL-запроса.
Посмотрим на пример кода в тексте запроса СКД:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
ВЫРАЗИТЬ(Продажи.Договор КАК Справочник.ДоговорыКонтрагентов) КАК Договор
ИЗ
РегистрНакопления.Продажи КАК Продажи
Применяя конструкцию ВЫРАЗИТЬ(Поле КАК Тип), мы жестко ограничиваем тип поля для системы компоновки. Это гарантирует появление «плюсика», так как структура объекта Справочник.ДоговорыКонтрагентов становится известна СКД еще на этапе парсинга запроса.
Выясним еще одну неочевидную причину: настройки видимости и доступности. В конструкторе наборов данных есть две важные колонки: «Ограничение поля» и «Ограничение условия».
Важно помнить, что внутри кнопки выбора в этих колонках скрывается дерево реквизитов. Если вы или другой разработчик случайно сняли галочки с дочерних полей (например, запретили использовать Договор.Владелец), то «плюсик» может исчезнуть, так как системе просто нечего показывать внутри этого узла.
Проанализируем ситуацию, когда у разработчика в конфигураторе все работает, а у пользователя в «1С:Предприятии» — нет. Проблема может крыться в правах доступа (RLS — Record Level Security) или функциональных опциях.
В СКД существует глобальный параметр, ограничивающий «вложенность» полей. Это сделано для предотвращения бесконечных циклов (например, Контрагент -> Основной договор -> Владелец -> Основной договор...) и для оптимизации производительности.
Рассмотрим, где это настраивается:
Если там установлено значение 1, то вы сможете увидеть только само поле. Если 0 — раскрытие также может быть ограничено настройками по умолчанию. Рекомендуется оставлять это поле пустым (по умолчанию) или устанавливать значение 3-5, если требуется глубокая аналитика.
Для исправления проблемы с отсутствием «плюсика» в СКД в 90% случаев достаточно выполнить Способ 1 (указать тип значения в наборе данных) или Способ 3 (использовать ВЫРАЗИТЬ в запросе). Если это не помогло, следует проверить настройки компоновщика на наличие запрета использования дочерних элементов и убедиться, что реквизиты не скрыты правами доступа или функциональными опциями.