При работе с механизмом дополнительных реквизитов и сведений в Системе компоновки данных (СКД) разработчики часто сталкиваются с двумя неудобствами в пользовательском режиме. Во-первых, при попытке установить отбор 1С просит сначала выбрать тип данных (Число, Строка, Справочник и т.д.), и только потом открывает список значений. Во-вторых, открывшийся список содержит все возможные значения всех свойств сразу, без фильтрации по конкретному выбранному свойству (например, по владельцу). Рассмотрим, как профессионально решить эти задачи, используя стандартные возможности платформы 1С:Предприятие 8.3.
Разберем ситуацию на примере классического запроса к регистру сведений РегистрСведений.ЗначенияСвойствОбъектов. Типичный текст запроса в СКД выглядит следующим образом:
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Объект,
ЗначенияСвойствОбъектов.Свойство,
ЗначенияСвойствОбъектов.Значение
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
ЗначенияСвойствОбъектов.Свойство = &Свойство
Поле Значение в данном регистре имеет составной тип данных, определяемый Планом видов характеристик (ПВХ). Именно из-за этой "составности" платформа не знает заранее, какой справочник или примитивный тип данных будет использоваться. Проанализируем, как помочь системе определить тип автоматически.
Чтобы избавиться от первого лишнего окна (выбора типа), нам необходимо указать системе, что тип поля Значение жестко зависит от того, какое Свойство выбрано в данный момент. Это делается в конструкторе схемы компоновки данных.
Значение.Свойство.После этой настройки система будет считывать метаданные из Плана видов характеристик для выбранного свойства и автоматически подставлять нужный тип в окне выбора значения. Это полностью исключает этап ручного выбора типа пользователем.
Выясним причину второй проблемы: почему при выборе значения (например, для свойства "Цвет") открывается список, содержащий значения и для "Цвета", и для "Размера", и для других характеристик? Это происходит потому, что Связь по типу определяет только тип данных, но не накладывает фильтр на записи внутри этого типа. Если значения свойств хранятся в подчиненном справочнике (например, Справочник.ЗначенияСвойствОбъектов), нам нужно передать владельца в форму выбора.
Разберем, как настроить Связи параметров выбора в СКД:
Значение.Отбор.Владелец.Свойство.Благодаря этой настройке, при открытии формы выбора платформа автоматически добавит условие: отображать только те элементы справочника, у которых владелец совпадает со значением в поле Свойство. Теперь пользователь увидит только актуальные значения.
Проанализируем более продвинутый способ, который рекомендуется для крупных конфигураций. Вместо ручной прописки связей для каждого поля, можно воспользоваться механизмом Характеристики в конструкторе СКД.
На закладке Характеристики можно описать правила, по которым СКД будет получать дополнительные реквизиты для объектов. Рассмотрим основные параметры этой настройки:
Если настроить этот механизм, то СКД "под капотом" сама проставит все необходимые связи типов и параметров выбора. Поля свойств станут доступны в настройках отчета как вложенные реквизиты объекта, что значительно упростит работу пользователя.
Важно помнить, что в версии 8.3 на управляемых формах корректная работа этих настроек зависит от флажка Автозаполнение в схеме компоновки. Если вы создаете программно форму настроек, убедитесь, что расширение управляемой формы для отчета правильно обрабатывает параметры выбора.
Также рассмотрим ситуацию, когда свойство задано не полем в строке, а параметром запроса. Если ваш отбор по значению должен зависеть от параметра &Свойство, то в Связях параметров выбора в качестве поля компоновки следует выбирать не поле набора данных, а именно Параметры.Свойство.
Посмотрим на пример правильного заполнения условий в запросе для повышения производительности:
ГДЕ
ЗначенияСвойствОбъектов.Свойство = &Свойство
И ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК Справочник.ЗначенияСвойствОбъектов) ССЫЛКА Справочник.ЗначенияСвойствОбъектов
Использование оператора ВЫРАЗИТЬ помогает оптимизатору запросов СУБД быстрее обрабатывать условия по составным полям, однако основная логика удобства интерфейса все равно ложится на настройки Связи по типу и Связи параметров выбора, которые мы разобрали выше.