Как программно реализовать расшифровку в табличном документе 1С и вывести данные в отдельное окно?

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

При разработке отчетов в 1С часто возникает задача реализовать детализацию данных (drill-down). Например, когда пользователь кликает по ячейке с итоговой суммой, программа должна выполнить запрос и показать список документов, из которых эта сумма сложилась. В этой статье мы подробно разберем, как реализовать этот механизм вручную, используя встроенный язык и возможности табличного документа.

Постановка задачи и выбор подхода

Представим ситуацию: у нас есть отчет, сформированный в ТабличныйДокумент. Мы хотим, чтобы при клике на определенное поле программа не просто открывала стандартное меню выбора действий, а сразу выполняла наш алгоритм: запускала запрос к базе данных и выводила результат в новом окне. Рассмотрим, как это реализовать по шагам.

Шаг 1: Подготовка макета и параметра расшифровки

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

Шаг 2: Обработка события клика на клиенте

Для того чтобы перехватить действие пользователя, нам понадобится обработчик события ОбработкаРасшифровки. Рассмотрим, как выглядит эта процедура на стороне клиента:


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

Важный момент: Как правильно заметили участники форума, установка СтандартнаяОбработка = Ложь критически важна. Если этого не сделать, 1С поверх вашего результата выведет системное окно с предложением «Открыть», «Отфильтровать» и другими стандартными действиями. Мы же хотим полностью контролировать процесс.

Шаг 3: Серверная логика и выполнение запроса

Теперь проанализируем, что должно происходить на сервере. Нам нужно получить данные из расшифровки, выполнить запрос и заполнить новый табличный документ. Рассмотрим пример реализации, где мы создаем новый документ на основе макета:


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

Нюансы работы в управляемых формах

В приведенном коде используется метод ТабДок.Показать(). Рассмотрим особенности этого подхода. В управляемом приложении (интерфейс «Такси») вызов Показать() откроет отдельное модальное окно. Хотя это рабочее решение, оно считается устаревшим.

Более современный и правильный способ с точки зрения UX (пользовательского опыта) — это создание отдельной общей формы или формы отчета, содержащей поле табличного документа. Вы можете поместить сформированный ТабличныйДокумент во временное хранилище и передать адрес этого хранилища в новую форму через параметры открытия. Это позволит пользователю работать с расшифровкой в отдельной вкладке основного окна программы.

Профессиональные рекомендации: использование СКД

Если ваш основной отчет строится на Системе компоновки данных (СКД), ручное написание запросов в расшифровке может быть избыточным. Проанализируем возможности СКД:

  1. Автоматическая расшифровка: СКД умеет самостоятельно определять типы данных и предлагать стандартные действия без написания кода.
  2. Объект ОбработкаРасшифровкиКомпоновкиДанных: Если вам все же нужно перехватить управление, используйте этот объект. Он позволяет программно изменять настройки компоновки (добавлять отборы, группировки) и формировать новый результат на лету.
  3. Передача структур: Всегда старайтесь передавать в ПараметрРасшифровки не просто ссылку, а Структура. Это позволит вашему запросу в расшифровке быть максимально точным, учитывая все контекстные фильтры исходного отчета.

Визуальный отклик для пользователя

Чтобы пользователь понимал, что ячейка кликабельна, разберем настройки оформления:

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

← На главную