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