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