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