Как программно управлять видимостью выбранных полей в отчетах СКД, если стандартные методы не помогают?

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

Работа с Системой компоновки данных (СКД) часто требует от разработчика гибкости, выходящей за рамки статических настроек в конфигураторе. Одной из распространенных задач является программное скрытие или отображение определенных колонок в зависимости от условий, выбранных пользователем на форме. Однако программисты часто сталкиваются с ситуацией, когда установка свойства Использование = Ложь для элемента выбранных полей просто игнорируется системой, и колонка все равно появляется в финальном отчете. Рассмотрим подробно, почему это происходит и как правильно управлять составом полей программно.

Причина 1: Порядок компоновки результата

Разберем типичную ошибку начинающих разработчиков. Часто программный код по настройке полей размещается после вызова метода СкомпоноватьРезультат(). Проанализируем логику: макет отчета генерируется в момент вызова компоновки. Если мы изменим настройки КомпоновщикаНастроек после того, как отчет уже выведен в табличный документ, визуально ничего не изменится. Всегда проверяйте, чтобы ваши манипуляции с полями предшествовали формированию итогового документа.

Причина 2: Приоритет пользовательских настроек

В современной платформе 1С 8.3 настройки компоновщика разделены на «основные» и «пользовательские». Если поле выведено в состав пользовательских настроек (флажок «Включать в пользовательские настройки» в СКД), то значения из КомпоновщикНастроек.ПользовательскиеНастройки имеют приоритет над КомпоновщикНастроек.Настройки. Если вы программно отключаете поле в основных настройках, но оно активно в пользовательских — оно отобразится в отчете. Для решения этой проблемы необходимо либо программно изменять коллекцию пользовательских настроек, либо использовать метод ЗагрузитьПользовательскиеНастройки() для синхронизации.

Причина 3: Поля в иерархической структуре (Таблицы и Группировки)

Часто разработчики меняют настройки на уровне всего отчета: КомпоновщикНастроек.Настройки.Выбор.Элементы. Однако в сложных отчетах (например, с типом структуры «Таблица») поля могут быть переопределены на уровне конкретной группировки строк или колонок. Проанализируем ситуацию: если в настройках варианта для конкретной группировки колонок выбран собственный состав полей, то отключение поля в «шапке» всего отчета никак не повлияет на эту группировку.

Для корректной работы нам необходимо обойти структуру отчета рекурсивно или обратиться к конкретным элементам структуры. Рассмотрим пример кода, который демонстрирует обход колонок таблицы:


// Пример обхода выбранных полей в конкретной колонке таблицы
Для Каждого ЭлементКолонки Из КомпоновщикНастроек.Настройки.Структура[0].Колонки[0].Выбор.Элементы Цикл
    Если Строка(ЭлементКолонки.Поле) = "Стоимость" Тогда
        ЭлементКолонки.Использование = ПоказыватьСтоимость;
    КонецЕсли;
КонецЦикла;

Метод полного удаления поля из настроек

Если простая установка флага Использование не дает результата, наиболее надежным способом является физическое удаление поля из коллекции. Выясним, как это сделать правильно. Вместо того чтобы просто скрывать поле, мы находим его в коллекции Элементы и вызываем метод Удалить(). Стоит учитывать, что при таком подходе для повторного отображения поля его придется добавлять заново программно, используя метод Добавить() и указывая тип ВыбранноеПолеКомпоновкиДанных.


// Программное удаление поля по индексу или ссылке
ВыбранныеПоля = КомпоновщикНастроек.Настройки.Выбор.Элементы;
ИндексДляУдаления = Неопределено;

Для Ит = 0 По ВыбранныеПоля.Количество() - 1 Цикл
    ПолеКД = ВыбранныеПоля[Ит];
    Если ТипЗнч(ПолеКД) = Тип("ВыбранноеПолеКомпоновкиДанных") 
        И Строка(ПолеКД.Поле) = "СуммаОборота" Тогда
        ИндексДляУдаления = Ит;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ИндексДляУдаления <> Неопределено Тогда
    ВыбранныеПоля.Удалить(ВыбранныеПоля.Получить(ИндексДляУдаления));
КонецЕсли;

Использование Условного оформления как альтернатива

Иногда возникают ситуации, когда поле «намертво» прописано в автополях или сложных группировках. В этом случае мы можем использовать программное добавление Условного оформления. Вместо того чтобы пытаться удалить поле, мы прикажем системе визуально его скрыть. Для этого создадим элемент оформления, где установим параметр Видимость = Ложь для конкретного поля. Условие оформления можно оставить пустым или задать как «Всегда истинно».

Разберем основные шаги реализации этого метода:

  1. Создаем новый элемент условного оформления в КомпоновщикНастроек.Настройки.УсловноеОформление.
  2. Добавляем в список оформляемых полей наше целевое поле (объект ПолеКомпоновкиДанных).
  3. Устанавливаем в параметрах оформления значение Видимость в Ложь.

Комплексный пример реализации

Посмотрим на пример процедуры, объединяющей установку параметров и управление видимостью полей перед выводом отчета. Этот подход часто используется в типовых конфигурациях на обычных формах (например, УТ 10.3):


Процедура ОбновитьОтчет()
    // 1. Сбрасываем и загружаем настройки варианта
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
    // 2. Устанавливаем параметры данных
    ПараметрДата = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаКон");
    Если ПараметрДата <> Неопределено Тогда
        ПараметрДата.Значение = КонецДня(ТекущаяДата());
        ПараметрДата.Использование = Истина;
    КонецЕсли;

    // 3. Управляем видимостью через цикл по основным выбранным полям
    ВыбранныеПоля = КомпоновщикНастроек.Настройки.Выбор.Элементы;
    Для Каждого Поле Из ВыбранныеПоля Цикл
        Если ТипЗнч(Поле) = Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
            // Проверяем соответствие имени поля
            ИмяПоля = Строка(Поле.Поле);
            Если ИмяПоля = "Количество" Тогда
                Поле.Использование = ФлагПоказыватьКоличество;
            ИначеЕсли ИмяПоля = "Сумма" Тогда
                Поле.Использование = ФлагПоказыватьСумму;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    // 4. Важно: проверяем вложенные структуры (например, первую таблицу в отчете)
    Если КомпоновщикНастроек.Настройки.Структура.Количество() > 0 Тогда
        Таблица = КомпоновщикНастроек.Настройки.Структура[0];
        Если ТипЗнч(Таблица) = Тип("ТаблицаКомпоновкиДанных") Тогда
            // Аналогичный обход по колонкам или строкам таблицы
            // ...
        КонецЕсли;
    КонецЕсли;

    // 5. Выводим результат
    ЭлементыФормы.Результат.Очистить();
    СкомпоноватьРезультат(ЭлементыФормы.Результат);
КонецПроцедуры

Рекомендации по отладке

Если поле все равно упорно появляется в отчете, выполните следующие действия:

Таким образом, программное управление видимостью в СКД требует комплексного подхода: от контроля момента вызова компоновки до тщательного анализа структуры варианта отчета. Используя приведенные методы, вы сможете добиться корректного отображения данных в любой сложной структуре.

← На главную