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