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