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