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