Как снять автоматическое ограничение доступности полей-реквизитов при автозаполнении в СКД?

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

При разработке сложных отчетов в Системе компоновки данных (СКД) на платформе 1С:Предприятие разработчики часто сталкиваются с неочевидным поведением конструктора схем. Типичная ситуация: вы объединяете несколько наборов данных (запросов) с помощью механизма ОБЪЕДИНИТЬ ВСЕ или типа набора данных «Объединение». Все работает корректно, дочерние реквизиты полей доступны для выбора. Однако при добавлении еще одного запроса в это объединение доступ к реквизитам полей неожиданно блокируется — в колонке «Ограничение реквизитов» автоматически устанавливаются флажки (галочки), которые невозможно снять вручную (они становятся серыми и неактивными).

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и рассмотрим несколько эффективных способов решения — от простого «быстрого сброса» до архитектурно правильной настройки запросов.

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

Почему блокируется колонка «Ограничения реквизитов»?

Для того чтобы эффективно решить проблему, нам необходимо понять логику работы компоновщика макета СКД. Существует три основные причины, почему флажки ограничений становятся недоступными для изменения:

  1. Особенности работы с примитивными типами данных. Настройка ограничений реквизитов имеет смысл только для сложных, ссылочных типов данных (таких как СправочникСсылка, ДокументСсылка и т.д.), которые физически имеют вложенные поля (реквизиты). Для примитивных типов данных (Число, Строка, Дата, Булево) у поля в принципе не может быть дочерних реквизитов. Поэтому платформа принудительно устанавливает галочки ограничений и блокирует их изменение.
  2. Сбой автоопределения типов при объединении (Unions). Когда мы используем объединение нескольких запросов, СКД пытается автоматически вычислить результирующий тип для каждого результирующего поля. Если в одном из запросов поле имеет ссылочный тип, а в другом — примитивный (например, число 0 или значение NULL), компоновщик может некорректно рассчитать тип поля объединения, посчитав его полностью примитивным или некорректно обработав составной тип.
  3. Кэширование метаданных в графическом интерфейсе. Это известный баг визуального конструктора СКД. Даже если вы исправили типы данных в самом запросе, графическая оболочка схемы компоновки продолжает хранить старые закэшированные типы полей набора данных и визуально блокирует редактирование доступности реквизитов.

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

Способ 1. Быстрый сброс кэша метаданных через XML (быстрое решение)

Если структура ваших запросов абсолютно верна, типы данных совпадают, но галочки ограничений реквизитов все равно заблокированы, мы имеем дело с кэшированием схемы в конструкторе. Самый быстрый способ заставить платформу полностью пересчитать метаданные — это перезагрузка схемы через XML-сериализацию.

Выполним следующие шаги:

  1. В конструкторе схемы компоновки данных в правом нижнем углу или через меню действий нажмите кнопку «Сохранить схему в файл» (или выгрузите её в формате XML).
  2. Закройте окно конструктора СКД.
  3. Снова откройте макет компоновки данных и нажмите кнопку «Загрузить схему из файла», выбрав только что сохраненный XML-файл.

При импорте XML-описания платформа выполняет полную десериализацию структуры и заново инициирует синтаксический анализ всех входящих запросов. Кэш метаданных сбрасывается, типы полей пересчитываются с нуля, что приводит к разблокировке галочек для тех полей, которые действительно получили ссылочный тип данных.

Способ 2. Явное приведение типов в запросах объединения (лучшая практика)

Чтобы избежать подобных сбоев в будущем, важно правильно писать тексты запросов в объединениях. Если в одной из частей объединения поле должно быть пустым, никогда не используйте простое значение NULL или пустую строку/число без указания типа. Платформа должна однозначно понимать, к какому объекту метаданных относится это поле во всех ветках объединения.

Посмотрим на пример некорректного запроса, который гарантированно приведет к блокировке реквизитов поля Договор:


ВЫБРАТЬ
    Ссылка КАК Контрагент,
    ДоговорПриемник КАК Договор
ИЗ
    Справочник.Контрагенты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Ссылка КАК Контрагент,
    NULL КАК Договор
ИЗ
    Справочник.ФизическиеЛица

В данном случае во второй части объединения поле Договор имеет тип NULL. СКД может сбиться при автозаполнении. Чтобы решить эту проблему, используем явное приведение типов с помощью функции ВЫРАЗИТЬ или пустой ссылки.

Перепишем запрос правильно:


ВЫБРАТЬ
    Ссылка КАК Контрагент,
    ДоговорПриемник КАК Договор
ИЗ
    Справочник.Контрагенты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Ссылка КАК Контрагент,
    ВЫРАЗИТЬ(NULL КАК Справочник.ДоговорыКонтрагентов) КАК Договор
ИЗ
    Справочник.ФизическиеЛица

Или, если это допустимо бизнес-логикой, можно использовать пустую ссылку конкретного справочника:


ВЫБРАТЬ
    Ссылка КАК Контрагент,
    ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка) КАК Договор
ИЗ
    Справочник.ФизическиеЛица

При таком подходе СКД во всех ветках объединения видит четко типизированное поле СправочникСсылка.ДоговорыКонтрагентов. Флажки ограничений реквизитов для этого поля всегда будут доступны для редактирования.

Способ 3. Ручное указание типа значения в наборе данных

Если вы не хотите переписывать сложные запросы, мы можем жестко указать тип данных непосредственно в настройках набора данных СКД. Это переопределит автоматический расчет платформы.

Разберем по шагам, как это сделать:

  1. Перейдите на вкладку «Наборы данных» в конструкторе СКД.
  2. Найдите в списке полей то поле, у которого заблокировано ограничение реквизитов.
  3. Найдите колонку «Тип значения» для этого поля (по умолчанию там может стоять пустое значение, что означает автоопределение).
  4. Нажмите на кнопку выбора в этой ячейке и в открывшемся окне типов выберите конкретный ссылочный тип (например, СправочникСсылка.Номенклатура). Уберите галочки со всех лишних примитивных типов.

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

Способ 4. Отключение автозаполнения и ручная настройка полей компоновки

Использование флага «Автозаполнение» в сложных запросах с объединениями часто приводит к непредсказуемому поведению компоновщика. В профессиональной разработке отчетов хорошим тоном считается ручное управление доступными полями.

Выполним ручную настройку полей компоновки:

  1. На вкладке «Наборы данных» снимите флаг «Автозаполнение» у проблемного набора данных.
  2. Откройте конструктор запроса для этого набора данных.
  3. Перейдите на вкладку «Компоновка данных».
  4. На вкладке «Поля» вручную перетащите из списка доступных полей те поля, которые должны быть доступны пользователю в отчете.
  5. Для ссылочных полей, у которых вам необходимо открыть реквизиты, обязательно установите флажок в колонке «Дочерние» (это указывает СКД, что нужно разрешить выбор реквизитов данного объекта).

Этот способ требует чуть больше времени при проектировании отчета, однако он полностью исключает влияние ошибок автоматического определения типов СКД и гарантирует стабильную работу схемы при любых последующих изменениях метаданных конфигурации.

← На главную