Почему в отчете СКД при расшифровке не открывается форма объекта и как это исправить?

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

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

Проанализируем причины такого поведения платформы 1С:Предприятие и рассмотрим по шагам варианты настройки отчета, которые позволят вернуть штатное открытие формы объекта.

Почему пропадает действие «Открыть объект»

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

Типичная ошибка кроется в том, что в запрос или в выбранные поля выводится не сам объект, а его реквизит, например Номенклатура.Наименование, либо в тексте запроса используется конструкция ПРЕДСТАВЛЕНИЕ(Номенклатура). В обоих случаях тип данных поля становится строковым, и связь со ссылкой теряется.

Способ 1. Вывод ссылочного поля вместо наименования (Базовое решение)

Разберем самое простое и быстрое исправление ситуации. Если в отчете достаточно стандартного представления элемента, выполним следующие шаги:

  1. Откроем схему компоновки данных и перейдем на вкладку «Наборы данных».
  2. Убедимся, что в тексте запроса выбирается сама ссылка, например Запчасть КАК Запчасть, а не Запчасть.Наименование.
  3. Перейдем на вкладку «Настройки» в список «Выбранные поля» (или в настройки конкретной группировки).
  4. Заменим строковое поле Наименование на ссылочное поле Запчасть.

Система автоматически отобразит наименование объекта в ячейке, сохранив при этом под капотом ссылку на справочник. Теперь при двойном клике в меню появится пункт «Открыть запчасть».

Способ 2. Использование «Выражения представления»

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

Разберем по шагам настройку:

  1. Перейдем на вкладку «Наборы данных» схемы компоновки данных.
  2. В таблице полей найдем нашу ссылку (например, Запчасть).
  3. В колонке «Выражение представления» укажем формулу, которая будет формировать видимый пользователю текст, например: Запчасть.Артикул + " " + Запчасть.Наименование.
  4. В выбранные поля отчета поместим само поле Запчасть.

В результате пользователь увидит скомпонованную строку, однако тип значения в ячейке останется ссылочным, и форма объекта будет открываться без затруднений.

Способ 3. Настройка макета поля для открытия в один клик

Если требуется, чтобы форма открывалась сразу по двойному щелчку мыши без показа всплывающего контекстного меню, настроим макет поля:

  1. Перейдем на вкладку «Макеты» схемы компоновки данных.
  2. Добавим «Макет поля» для нужного реквизита.
  3. В свойствах ячейки макета укажем параметр данных для вывода текста и заполним свойство «Параметр расшифровки», передав туда ссылку на объект.
  4. В свойствах поля макета укажем основное действие расшифровки — «Открыть значение».

Способ 4. Программный перехват расшифровки в модуле формы

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

Посмотрим на пример обработчика, открывающего форму объекта напрямую:


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

КонецПроцедуры

Разберем вспомогательную функцию на сервере, которая извлекает ссылку из структуры данных компоновки:


&НаСервере
Функция ПолучитьДанныеРасшифровкиКликнутойЯчейки(ИдентификаторРасшифровки)
    
    ДанныеСКД = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    ЭлементРасшифровки = ДанныеСКД.Элементы[ИдентификаторРасшифровки];
    
    СтруктураПолей = Новый Структура;
    
    Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
        Для Каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
            СтруктураПолей.Вставить(Поле.Поле, Поле.Значение);
        КонецЦикла;
        Возврат СтруктураПолей;
    КонецЕсли;
    
    Возврат Неопределено;

КонецФункции

Обратите внимание: метод ПоказатьЗначение является асинхронным и работает как в тонком, так и в веб-клиенте управляемого приложения, заменяя устаревший метод ОткрытьЗначение.

← На главную