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

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

При разработке отчетов на платформе 1С:Предприятие 8.3 через механизм СКД программисты привыкли к тому, что расшифровка (возможность кликнуть по ячейке и открыть документ или детализировать отчет) работает автоматически. Однако, если мы используем объект Обработка вместо Отчет, «магия» исчезает. В управляемой форме обработки отсутствуют стандартные свойства расширения формы для отчета, которые связывают табличный документ с данными расшифровки.

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

Шаг 1. Формирование результата и сохранение данных расшифровки

Первым делом нам необходимо сформировать результат компоновки данных на сервере. В отличие от простого вывода, здесь критически важно инициализировать объект ДанныеРасшифровкиКомпоновкиДанных и передать его во все звенья цепочки: от макета до процессора вывода.

Проанализируем стандартный алгоритм формирования, который нужно разместить в серверном модуле формы или обработки:


// 1. Создаем объект данных расшифровки
ДанныеРасшифровкиОбъект = Новый ДанныеРасшифровкиКомпоновкиДанных;

// 2. Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровкиОбъект);

// 3. Передаем расшифровку в процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровкиОбъект);

// 4. Выводим результат в табличный документ
Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

// 5. Помещаем объект расшифровки во временное хранилище
// Это ключевой момент: адрес нужно сохранить в реквизит формы (строку)
АдресРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОбъект, УникальныйИдентификатор);

Важное замечание: При вызове ПоместитьВоВременноеХранилище обязательно передавайте УникальныйИдентификатор формы. Это гарантирует, что данные будут жить столько же, сколько открыта форма, и не будут удалены преждевременно.

Шаг 2. Настройка обработчика события на клиенте

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

Рассмотрим код обработчика, который вызывает стандартное окно выбора действий (открыть, отфильтровать, сгруппировать):


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

Шаг 3. Обработка выбранного действия

После того как пользователь выбрал пункт меню (например, «Открыть»), управление передается в процедуру обратного вызова. Здесь мы должны решить, что делать с выбранным действием.


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

Особенности работы с несколькими отчетами в одной форме

Если в вашей обработке два табличных документа и две разные схемы компоновки, следуйте этим правилам:

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

Альтернативный «ленивый» способ

Существует еще один метод, который позволяет обойтись без написания сложного кода расшифровки. Если ваша задача — только открывать объекты по клику, вы можете в схеме компоновки данных (СКД) для конкретного поля настроить Параметры редактирования. Установите параметр «Основное действие» в значение «Открыть значение».

Однако помните, что этот способ не позволит пользователю делать группировки или устанавливать фильтры через контекстное меню расшифровки — он лишь заменит стандартный двойной клик на открытие ссылки.

Резюме

Для реализации полноценной расшифровки в обработке необходимо:

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

← На главную