Как скрыть колонку или изменить её значение в запросе 1С на основании булевой переменной

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в системе 1С:Предприятие часто возникает задача: изменить состав отображаемых данных в зависимости от выбора пользователя. Например, если установлен флажок (параметр типа Булево), мы хотим видеть детальную аналитику, а если нет — скрыть её или заменить на пустые значения. В этой статье мы подробно разберем, почему нельзя просто «удалить» колонку внутри обычного запроса и какими методами можно добиться желаемого результата.

Ограничение статических запросов

Прежде всего, нам необходимо уяснить важное правило, упомянутое в обсуждении: количество и состав полей в тексте запроса не могут меняться динамически в зависимости от значений параметров, передаваемых в этот запрос. Если в блоке ВЫБРАТЬ прописано поле Номенклатура, оно будет присутствовать в выборке всегда, вне зависимости от того, передали вы в параметре Истина или Ложь.

Рассмотрим несколько эффективных способов решения этой задачи, начиная от простых логических условий в запросе и заканчивая управлением настройками компоновки данных.

Способ 1. Использование оператора ВЫБОР для изменения значений

Если наша задача — не физически удалить колонку, а «обнулить» её содержимое, чтобы оно не мешало пользователю или не учитывалось в итогах, мы воспользуемся конструкцией ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Проанализируем пример реализации такой логики:


ВЫБРАТЬ
    ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Склад КАК Склад,
    ВЫБОР
        КОГДА &АналитикаУчетаПоНоменклатуре = ИСТИНА
            ТОГДА ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    КОНЕЦ КАК Номенклатура,
    ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки

Важный нюанс: при использовании оператора ВЫБОР типы данных в ветках ТОГДА и ИНАЧЕ должны быть совместимы. Если в одном случае вы возвращаете ссылку на справочник, то в другом случае (в ветке ИНАЧЕ) следует возвращать либо NULL, либо пустую ссылку этого же типа. Попытка вернуть число 0 вместо ссылки приведет к ошибке несовместимости типов.

Способ 2. Система компоновки данных (СКД) и выбранные поля

Если вы разрабатываете отчет на базе СКД, у вас появляется гораздо больше инструментов. В СКД понятие «запрос» и «результат отчета» разделены. Мы можем программно управлять составом выбранных полей, и если поле не включено в настройки, оно просто не попадет в финальный макет.

Разберем, как управлять видимостью через настройки компоновки:

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. Выберем нужную группировку или весь отчет.
  3. В таблице Выбранные поля мы можем использовать механизм Условного оформления.
  4. Установим условие: если параметр &АналитикаУчетаПоНоменклатуре равен Ложь, то для поля Номенклатура устанавливается текст "" (пустая строка) или поле скрывается.

Однако более правильным подходом в СКД будет использование функциональных опций или программное удаление поля из коллекции ВыбранныеПоля перед формированием отчета.

Способ 3. Динамическое формирование текста запроса в коде

Когда требуется именно физическое отсутствие колонки в результате (например, для выгрузки в файл Excel), мы прибегаем к сборке текста запроса в программном модуле. Выясним, как это выглядит на практике:


ТекстПоляНоменклатура = "";
Если АналитикаУчетаПоНоменклатуре Тогда
    ТекстПоляНоменклатура = "ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,";
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Склад КАК Склад,
    |    " + ТекстПоляНоменклатура + "
    |    ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки";

В данном примере, если флажок не установлен, строка с полем Номенклатура просто не будет добавлена в текст запроса, и колонка физически не появится в объекте РезультатЗапроса.

Способ 4. Расширения языка запросов СКД (Фигурные скобки)

В системе 1С существует мощный механизм — «необязательные» поля, которые помечаются фигурными скобками {}. Это позволяет сделать запрос универсальным. Если поле заключено в фигурные скобки в секции ВЫБРАТЬ, оно будет включено в реальный SQL-запрос только в том случае, если оно выбрано в настройках отчета пользователем или программно.

Пример синтаксиса в конструкторе запроса:


ВЫБРАТЬ
    ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Склад КАК Склад,
    {ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,}
    ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки

Этот метод считается наиболее профессиональным при работе с отчетами, так как он сохраняет гибкость и позволяет системе 1С оптимизировать запрос к базе данных, не выбирая лишние поля без необходимости.

Способ 5. Программное скрытие колонки в табличном документе

Иногда логику запроса менять слишком сложно или рискованно. В таких случаях мы можем скрыть колонку уже на этапе вывода данных в ТабличныйДокумент. Проанализируем, как это сделать программно в модуле отчета:


// Предположим, что колонка Номенклатура имеет имя "КолонкаНоменклатура" в макете
Если Не Параметры.АналитикаУчетаПоНоменклатуре Тогда
    ОбластьКолонки = Результат.Область("КолонкаНоменклатура");
    ОбластьКолонки.Видимость = Ложь;
КонецЕсли;

Этот метод является чисто визуальным: данные в запросе присутствуют, но пользователь их не видит. Это удобно, когда данные колонки нужны для каких-то скрытых расчетов, но не должны отображаться в печатной форме.

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших целей:

Помните, что работа с типом Булево в параметрах запроса очень проста: вам не обязательно писать ГДЕ &Параметр = ИСТИНА, достаточно использовать конструкцию ГДЕ &Параметр или ГДЕ НЕ &Параметр, что делает ваш код более лаконичным и читаемым.

← На главную