Как при расшифровке отчета вывести таблицу с результатом запроса на экран?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в 1С:Предприятие часто возникает задача детализации данных: при двойном клике на ячейку основного отчета (например, по конкретному счету, контрагенту или номенклатуре) необходимо показать пользователю детальную таблицу с результатом запроса. Разберем основные способы реализации такого поведения на платформе 1С:Предприятие.

Способ 1. Перехват расшифровки и вывод отдельного табличного документа через метод Показать()

Если требуется быстро отобразить результат запроса без создания дополнительных объектов метаданных и отдельных экранных форм, наиболее эффективным подходом является формирование объекта ТабличныйДокумент на сервере и его отображение на клиенте с помощью метода Показать().

Рассмотрим по шагам реализацию этого варианта:

  1. В обработчике события поля табличного документа ОбработкаРасшифровки отменяем стандартную обработку, чтобы не открывалось системное меню расшифровки.
  2. Передаем значение расшифровки на сервер, где выполняем запрос и выгружаем результат в макет или строки табличного документа.
  3. Возвращаем готовый табличный документ на клиент и открываем его встроенным методом Показать().

Посмотрим на пример клиент-серверного кода:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Отменяем стандартное контекстное меню платформы
    СтандартнаяОбработка = Ложь;
    
    // Получаем сформированный табличный документ с сервера
    ТабДок = СформироватьДетализациюНаСервере(Расшифровка);
    
    // Открываем отдельное окно просмотра
    Если ТабДок <> Неопределено Тогда
        ТабДок.Показать("Детализация по счету");
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Открытие специализированной формы с передачей параметров

Если для отображения детальных данных требуется сложный интерактивный интерфейс (например, возможность фильтрации, сортировки или выполнения действий с полученными строками), правильнее использовать отдельную форму обработки или отчета.

Разберем по шагам алгоритм взаимодействия через форму:

  1. В процедуре ОбработкаРасшифровки формируем структуру параметров, куда помещаем расшифровываемое значение (например, ссылку на Счет или идентификатор записи).
  2. Вызываем метод ОткрытьФорму(), передавая имя формы и структуру параметров.
  3. В обработчике формы ПриСозданииНаСервере считываем переданные параметры через коллекцию Параметры, выполняем запрос и заполняем таблицу формы.

Посмотрим на программную реализацию вызова формы:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Счет", Расшифровка);
    
    ОткрытьФорму("Обработка.ПросмотрДетализации.Форма.Форма", ПараметрыОткрытия);

КонецПроцедуры

В самой открываемой форме в процедуре ПриСозданииНаСервере выполняем инициализацию данных:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("Счет") Тогда
        ЗаполнитьТаблицуПоСчету(Параметры.Счет);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуПоСчету(СчетУчета)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
        |   ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
        |ИЗ
        |   РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , ) КАК ХозрасчетныйОстатки";
    
    Запрос.УстановитьПараметр("Счет", СчетУчета);
    
    ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
    
    // Загружаем результат в реквизит формы типа ТаблицаЗначений
    ЗначениеВРеквизитФормы(ТаблицаРезультат, "СписокОстатков");

КонецПроцедуры

Способ 3. Особенности работы с отчетами на СКД

Проанализируем ситуацию, когда исходный отчет сформирован с помощью Системы компоновки данных (СКД). В этом случае в параметр Расшифровка события передается не прямая ссылка на объект, а числовой идентификатор элемента расшифровки.

Для корректного получения значения выполним следующие действия:

  1. На сервере обращаемся к объекту ДанныеРасшифровкиКомпоновкиДанных, предварительно сохраненному во временном хранилище.
  2. Получаем коллекцию полей конкретной строки через вызов ДанныеРасшифровки.Элементы[Идентификатор].ПолучитьПоля().
  3. Извлекаем нужное значение (например, счет или контрагента) и используем его в параметрах дальнейшего запроса или для открытия отчета-расшифровки.

Важно помнить: объект ТаблицаЗначений доступен исключительно на сервере. При работе на тонком или веб-клиенте для отображения таблиц значений их необходимо помещать в реквизиты управляемой формы через ЗначениеВРеквизитФормы() или выводить данные в ТабличныйДокумент.

← На главную