При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача создания зависимых параметров. Типичный пример: выбор серийного номера должен быть ограничен конкретным сертификатом или номенклатурой (владельцем). Однако разработчики часто сталкиваются с ситуацией, когда в окне настроек компоновки связь работает идеально, а на самой форме отчета (в области быстрых настроек) фильтрация игнорируется. В этой статье мы подробно разберем, почему это происходит и как правильно настроить связи параметров, чтобы они работали везде.
Рассмотрим стандартную ситуацию. У нас есть два параметра в СКД: Сертификат и СерийныйНомер. В метаданных конфигурации СерийныйНомер является подчиненным справочником, владельцем которого выступает Сертификат. Казалось бы, достаточно в настройках параметра СерийныйНомер на закладке Параметры редактирования указать Связи параметров выбора: Отбор.Владелец(Сертификат).
Проблема кроется в архитектуре управляемых форм. Когда платформа генерирует форму отчета автоматически, она создает элементы управления для параметров. Если указать связь просто через имя Сертификат, система в контексте формы может не понять, к чему именно обращаться — к полю набора данных или к значению параметра. Разберем, как это исправить.
Прежде всего, убедимся, что наши параметры правильно описаны в тексте запроса. Для того чтобы параметры были доступны для интерактивного выбора и корректно участвовали в компоновке, рекомендуется использовать конструкцию {ГДЕ ...}. Проанализируем пример правильного построения условия в запросе:
ВЫБРАТЬ
Остатки.Сертификат КАК Сертификат,
Остатки.СерийныйНомер КАК СерийныйНомер,
Остатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрНакопления.ПредоплатыКлиентов.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК Остатки
{ГДЕ
(Остатки.Сертификат = &Сертификат),
(Остатки.СерийныйНомер = &СерийныйНомер)}
Важно помнить, что если вы хотите, чтобы параметры были необязательными, их нужно заключать в фигурные скобки. Это позволит пользователю формировать отчет как по конкретному сертификату, так и по всем сразу.
Теперь перейдем к самому важному моменту — настройке связи. Выясним причину, по которой обычная ссылка на имя параметра часто не срабатывает на форме. В СКД существует разделение пространств имен. Для того чтобы явно указать платформе, что значение нужно брать из коллекции параметров данных, необходимо использовать префикс ПараметрыДанных.
Рассмотрим по шагам, как настроить эту связь в конструкторе СКД:
СерийныйНомер.Отбор.ВладелецПараметрыДанных.СертификатВажный нюанс: Использование префикса ПараметрыДанных является ключевым для управляемых форм. Это сообщает механизму генерации формы, что значение для фильтрации справочника СерийныеНомера нужно динамически забирать из элемента формы, связанного с параметром Сертификат.
Если в вашем отчете параметры выведены в область быстрых настроек (флажок Включать в пользовательские настройки с режимом Быстрый доступ), платформа создает элементы формы динамически. Проанализируем дополнительные настройки, которые могут потребоваться:
Во-первых, проверьте свойство Автозаполнение в схеме СКД. Если оно выключено, многие автоматические связи могут не проброситься в программно создаваемый макет. Рекомендуется держать его включенным.
Во-вторых, если вы используете собственную форму отчета, созданную вручную, настройки в СКД могут не подхватиться автоматически. В этом случае выполните следующие действия:
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Сертификат.Рассмотрим еще несколько полезных приемов, которые сделают работу с отчетом удобнее:
1. Очистка зависимого параметра при изменении владельца.
Часто случается, что пользователь сначала выбрал "Сертификат №1" и "Серийный номер А", а затем изменил сертификат на №2. При этом в поле "Серийный номер" может остаться значение "А", которое теперь не валидно. Чтобы этого избежать на программном уровне (в самописной форме), в событии ПриИзменении для поля Сертификат следует добавить код очистки:
&НаКлиенте
Процедура СертификатПриИзменении(Элемент)
// Очищаем зависимый параметр, если владелец изменился
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СерийныйНомер", Неопределено);
КонецПроцедуры
2. Ограничение типа данных.
Если ваш параметр Владелец имеет составной тип (например, это может быть и Справочник.Сертификаты, и Справочник.Номенклатура), обязательно заполните свойство Ограничение типа в настройках параметра СКД. Это поможет системе быстрее инициализировать список выбора и избежать лишних обращений к базе данных для определения метаданных.
3. Использование в расширениях.
Проанализируем ситуацию с расширениями. В версиях платформы 8.3.18 и выше иногда встречается особенность: если отчет находится в расширении, связи могут игнорироваться, если имена параметров полностью совпадают с именами полей основной конфигурации. В этом случае попробуйте переименовать параметры в схеме, добавив уникальный префикс, например п_Сертификат и п_СерийныйНомер, и обновите связи соответствующим образом.
Для корректной работы связи параметров по владельцу на форме отчета СКД необходимо:
ПараметрыДанных.ВашПараметр).Соблюдение этих простых правил позволит вам создавать профессиональные и удобные отчеты, в которых пользователь не сможет ошибиться при выборе связанных данных.