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