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