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

Программист 1С v8.3 (Обычные формы)
← На главную

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

Проблема 1: Время жизни объекта ДанныеРасшифровки

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


Процедура ДействияФормыкнПечРеестра(Кнопка)
    // ...
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    // ...
КонецПроцедуры

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

Выясним причину неработоспособности: когда пользователь дважды кликает по ячейке в открытом окне, табличный документ пытается обратиться к данным расшифровки по индексу (то самое число "19", которое видел автор темы), но самого объекта в памяти уже нет. Для решения этой проблемы объект расшифровки должен существовать всё то время, пока открыто окно с отчетом.

Если вы используете обычные формы (как в УПП 1.2), необходимо вынести объявление переменной в начало модуля формы:


Перем ДанныеРасшифровки; // Объявляем в разделе описания переменных модуля

Процедура ДействияФормыкнПечРеестра(Кнопка)
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    // Дальнейший код формирования...
КонецПроцедуры

Проблема 2: Свойства табличного документа

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

  1. ТолькоПросмотр. По умолчанию у нового табличного документа это свойство установлено в значение Ложь. В этом режиме двойной клик инициирует редактирование текста в ячейке, а не расшифровку. Чтобы заработала «лупа» расшифровки, необходимо установить ТабличныйДокумент.ТолькоПросмотр = Истина;.
  2. Защита. Это свойство блокирует изменение документа и активирует обработку событий расшифровки. Рекомендуется использовать ТабличныйДокумент.Защита = Истина;.

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

Проблема 3: Метод Показать() против использования форм

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

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

Вариант Б: Использование Показать(). Если создание формы нецелесообразно, мы можем попробовать оставить Показать(), но тогда нам нужно убедиться, что платформа может самостоятельно интерпретировать значение в расшифровке. Если в ячейке лежит просто ссылка на документ, и у пользователя достаточно прав, стандартная расшифровка должна открыть форму этого документа. Если же расшифровка сложная (например, требует открытия другого отчета), метод Показать() без программного перехвата события не поможет.

Оптимизированный пример кода

Рассмотрим, как должен выглядеть исправленный код в модуле формы для корректной работы расшифровки в 1С 8.3 (Обычные формы):


Перем ДанныеРасшифровки; // Критически важно для сохранения связей

Процедура ДействияФормыкнПечРеестра(Кнопка)
    
    // Получаем схему из макета документа
    СКД = Документы.ГарантийноеПисьмо.ПолучитьМакет("Реестр");
    
    // Настройки
    НастройкиСКД = СКД.НастройкиПоУмолчанию;
    НастройкиСКД.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаС", НачалоПериода);
    НастройкиСКД.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаПо", КонецПериода);
    
    // Инициализируем данные расшифровки
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    
    // Компоновка макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиСКД, ДанныеРасшифровки);
    
    // Процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // Подготовка табличного документа
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    // Вывод результата
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Обязательные настройки для интерактивности
    ТабличныйДокумент.ТолькоПросмотр = Истина;
    ТабличныйДокумент.Защита = Истина;
    ТабличныйДокумент.ОтображатьСетку = Ложь;
    ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
    
    // Вывод на экран
    ТабличныйДокумент.Показать("Реестр гарантийных писем");
    
КонецПроцедуры

Как заставить расшифровку сразу открывать значение?

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

  1. Откроем схему компоновки данных (макет "Реестр").
  2. Перейдем на закладку Настройки, затем в Условное оформление или в свойства конкретного поля.
  3. Найдем параметр Основное действие.
  4. Установим значение Открыть значение.

Это позволит платформе игнорировать построение меню расшифровки и сразу переходить к открытию формы объекта, если в расшифровке передана ссылка.

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

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

← На главную