Как убрать лишние колонки ресурсов при расшифровке отчета на СКД?

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

При работе с системой компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда основной отчет содержит большое количество ресурсов (например, 20 и более колонок). При попытке пользователя расшифровать конкретный показатель по какому-либо измерению (например, по «Регистратору»), 1С по умолчанию выводит плоскую таблицу, в которую попадают абсолютно все ресурсы, доступные в схеме. Это делает расшифровку нечитаемой и перегруженной лишней информацией.

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

Почему в расшифровку попадают лишние поля?

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

Шаг 1: Идентификация выбранного ресурса через макет

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

Рассмотрим наиболее эффективный метод — использование Параметра расшифровки в макете оформления СКД:

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

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

Шаг 2: Программная обработка события расшифровки

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

Для начала создадим обработчик события РезультатОбработкаРасшифровки на форме отчета:


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

Шаг 3: Формирование настроек для расшифровки

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


&НаСервере
Процедура ВыполнитьСвоюРасшифровку(ИдентификаторРасшифровки, ИмяРесурса)
    
    // Получаем текущие данные расшифровки из временного хранилища
    ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровкиДанные);
    
    // Создаем новый отчет для вывода расшифровки или модифицируем текущие настройки
    НовыеНастройки = Новый НастройкиКомпоновкиДанных;
    
    // 1. Очищаем выбранные поля, чтобы убрать "Авто" и лишние колонки
    НовыеНастройки.ВыбранныеПоля.Элементы.Очистить();
    
    // 2. Добавляем поле группировки (например, Регистратор)
    ПолеРегистратор = НовыеНастройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ПолеРегистратор.Поле = Новый ПолеКомпоновкиДанных("Регистратор");
    ПолеРегистратор.Использование = Истина;
    
    // 3. Добавляем только тот ресурс, по которому кликнул пользователь
    ПолеРесурс = НовыеНастройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ПолеРесурс.Поле = Новый ПолеКомпоновкиДанных(ИмяРесурса);
    ПолеРесурс.Использование = Истина;
    
    // Теперь можно открыть новую форму отчета с этими настройками
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыОтчета.Вставить("Настройки", НовыеНастройки);
    
    ОткрытьФорму("Отчет.ИмяВашегоОтчета.Форма", ПараметрыОтчета, ЭтаФорма, Истина);
    
КонецПроцедуры

Важные нюансы при работе с выбранными полями

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


// Отключаем наследование выбранных полей от родительских группировок
НовыеНастройки.ВыбранныеПоля.СпособРедактирования = СпособРедактированияСпискаВыбораКомпоновкиДанных.БыстрыйДоступ;

Также стоит обратить внимание на объект ИсточникДоступныхНастроекКомпоновкиДанных. При программном формировании расшифровки рекомендуется инициализировать компоновщик настроек на основе URL схемы, чтобы система знала типы полей и их доступность. Для программного управления составом отображаемых колонок можно использовать пример выборочного показа полей в СКД.

Резюме

Мы выяснили, что для решения проблемы лишних колонок в расшифровке СКД необходимо выполнить два ключевых действия:

  1. В макете: Назначить уникальные строковые параметры расшифровки для каждого поля-ресурса.
  2. В коде формы: Перехватить событие ОбработкаРасшифровки, определить имя ресурса по параметру и программно сформировать новый объект НастройкиКомпоновкиДанных с ограниченным набором полей.

Этот метод позволяет создавать профессиональные и удобные отчеты, в которых пользователь видит только ту информацию, которая ему необходима в контексте конкретного анализа. Подобный подход универсален и применим как в обычных, так и в управляемых формах 1С 8.3. Для практического изучения логики формирования детальных отчетов можно использовать демонстрационный отчет с программной расшифровкой СКД.

← На главную