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