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