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