Как скрыть поле или ресурс сразу во всех группировках СКД в 1С?

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

При работе с Системой компоновки данных (СКД) разработчики и пользователи часто сталкиваются с ситуацией, когда отчет содержит сложную иерархическую структуру. Например, у нас есть несколько последовательных уровней группировок (Группировка 1, Группировка 2) и детальные записи в самом низу. На каждом из этих уровней выводится одно и то же числовое поле — ресурс отчета.

Если пользователю в какой-то момент требуется скрыть этот ресурс, стандартное поведение системы заставляет его открывать настройки каждой отдельной группировки и вручную снимать флажок с этого поля. Это неудобно, отнимает много времени и часто приводит к ошибкам. Рассмотрим подробнее, как решить эту задачу изящно и профессионально, используя как стандартные интерактивные механизмы СКД, так и возможности программирования.

Метод 1. Наследование настроек через «Автополя» (Самый простой штатный способ)

Прежде чем приступать к написанию кода или созданию сложных интерфейсных обходов, разберем базовый механизм работы самой СКД — наследование выбранных полей. По умолчанию в системе компоновки реализован принцип «сверху вниз».

Если мы правильно спроектируем структуру отчета, то глобальные настройки выбранных полей (самый верхний уровень схемы) будут автоматически наследоваться всеми дочерними группировками. Для этого в настройках выбранных полей каждой конкретной группировки должен присутствовать только один элемент — «Авто».

Выясним, как настроить эту схему в конфигураторе шаг за шагом:

  1. Откроем нашу схему компоновки данных и перейдем на вкладку «Настройки».
  2. В окне структуры отчета выделим самый верхний элемент (корневую папку «Отчет») и перейдем на его вкладку «Выбранные поля». Добавим сюда те поля и ресурсы, которые должны отображаться по умолчанию.
  3. Теперь выделим первую подчиненную группировку. Перейдем на ее вкладку «Выбранные поля». Убедимся, что там нет жестко заданных полей. В списке должен находиться только элемент Авто. Если там присутствуют другие поля, удалим их и добавим Авто (через правую кнопку мыши или перетаскиванием).
  4. Повторим это действие для всех последующих группировок, включая детальные записи. На каждом уровне в выбранных полях должно стоять исключительно значение Авто.

Как это работает на практике для пользователя:

Когда наследование настроено верно, пользователю в режиме «1С:Предприятие» достаточно нажать кнопку «Настройки...» (или зайти в «Изменить вариант»), перейти на главную вкладку «Поля» (которая отвечает за весь отчет в целом) и просто снять флажок с нужного ресурса. Изменение автоматически применится ко всей цепочке группировок, и колонка с ресурсом мгновенно исчезнет со всех уровней отчета.

Если у вас это не работает, значит, на этапе разработки для какой-то из группировок был жестко задан индивидуальный состав полей, что автоматически разорвало связь наследования. Достаточно вернуть туда Авто, чтобы восстановить эту логику.

Метод 2. Вывод выбранных полей в быстрые настройки для максимального удобства

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

Проанализируем процесс настройки быстрого доступа:

  1. В конфигураторе откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. В нижней части экрана выберем вкладку «Выбранные поля» (убедившись, что в структуре отчета выбран самый верхний уровень).
  3. Нажмем кнопку «Свойства элемента пользовательских настроек» (она выглядит как шестеренка в нижней панели управления выбранными полями).
  4. В открывшемся диалоговом окне установим флажок «Включать в пользовательские настройки».
  5. В поле «Режим отображения» обязательно выберем значение «Быстрый доступ». Нажмем «ОК».

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

Метод 3. Использование предопределенных вариантов отчета

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

Мы можем создать несколько вариантов отчета в конфигураторе или дать пользователям возможность сохранить свои варианты в режиме предприятия:

Пользователь сможет переключаться между этими вариантами в один клик через стандартное меню выбора варианта отчета. Однако этот метод неудобен, если у пользователя постоянно меняются требования к составу колонок прямо во время анализа данных.

Метод 4. Программное управление видимостью через параметр-флаг

Иногда возникают сложные задачи, когда мы принципиально не можем использовать механизм наследования Авто. Например, на уровне Группировки 1 должен выводиться один строго определенный набор колонок, на уровне Группировки 2 — совершенно другой, а в детальных записях — третий. В этом случае снятие галочки на верхнем уровне отчета не повлияет на группировки, так как у них настроен собственный независимый состав полей.

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

Сначала добавим в схему компоновки данных новый параметр:

  1. Перейдем на вкладку «Параметры» нашей СКД.
  2. Добавим параметр с именем ВыводитьРесурсХ (тип значения — Булево, значение по умолчанию — Истина).
  3. В свойствах параметра включим его в пользовательские настройки с режимом отображения «Быстрый доступ», чтобы пользователь видел его на форме как простую галочку.

Теперь напишем программный обработчик в модуле объекта нашего отчета. Нам понадобится перехватить процесс компоновки в процедуре ПриКомпоновкеРезультата. Наша задача — рекурсивно обойти всю структуру настроек отчета и, если флаг сброшен, программно отключить использование нашего ресурса везде, где он встречается.

Посмотрим на пример программного кода, который решает эту задачу:


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

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

Процедура ОтключитьПолеВВыбранных(КоллекцияВыбора, ИмяПоля)
    
    Для Каждого ВыбранноеПоле Из КоллекцияВыбора.Элементы Цикл
        
        // Проверяем, является ли элемент обычным выбранным полем
        Если ТипЗв(ВыбранноеПоле) = Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
            
            Если СокрЛП(ВыбранноеПоле.Поле) = ИмяПоля Тогда
                // Отключаем использование поля вместо его физического удаления
                ВыбранноеПоле.Использование = Ложь;
            КонецЕсли;
            
        // Обрабатываем группы выбранных полей (если поля объединены в группы)
        ИначеЕсли ТипЗв(ВыбранноеПоле) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда
            
            ОтключитьПолеВВыбранных(ВыбранноеПоле, ИмяПоля);
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Преимущества программного подхода:

Таким образом, мы рассмотрели различные варианты управления отображением ресурсов в СКД. Для большинства стандартных отчетов идеальным решением будет правильная настройка автополей и наследования (Метод 1) совместно с выводом выбранных полей в быстрые настройки (Метод 2). Для сложных нетиповых отчетов с разрозненными структурами группировок программный метод с использованием рекурсивного обхода станет незаменимым инструментом в арсенале разработчика 1С.

← На главную