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