Почему в отчете на СКД не открывается документ по клику и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Проблема: неактивная ссылка в ячейке

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

Причина 1: Неправильная типизация во внешних наборах данных

Если данные в отчет передаются программно через Таблицу Значений (внешний набор данных), система 1С не всегда может автоматически определить тип поля. Особенно внимательным нужно быть при оптимизации отчетов с набором данных - объект, так как ошибки в типизации напрямую влияют на работу расшифровки. Разберем этот момент подробнее:

  1. Проанализируем вкладку «Наборы данных» в схеме компоновки.
  2. Найдем наше поле (например, Регистратор).
  3. Посмотрим на колонку «Тип значения». Если там указано «Авто» или тип не ограничен, СКД может интерпретировать данные как произвольный объект, что блокирует стандартные механизмы навигации.

Решение: Явно укажите тип данных для поля в схеме (например, составной тип, включающий все возможные документы-регистраторы).

Причина 2: Ошибки при программном выводе отчета

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


МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);

Если в метод Выполнить не передать третий параметр ДанныеРасшифровки, то интерактивные возможности в результирующем табличном документе будут отсутствовать. Также важно правильно инициализировать ПроцессорКомпоновкиДанных. Проанализируем правильную последовательность действий:


// Инициализируем процессор компоновки с передачей данных расшифровки
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);

Здесь четвертый параметр Истина (ИспользоватьВнешниеФункции) также важен для корректной работы некоторых механизмов.

Причина 3: Сложная логика расшифровки (отчет в отчете)

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


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

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

Решение через переопределение ОбработкаРасшифровки

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

  1. Перехватываем событие клика по ячейке.
  2. Проверяем, относится ли это к нашему проблемному отчету.
  3. Извлекаем значение из данных расшифровки.
  4. Принудительно открываем форму документа.

Пример кода для реализации:


Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка)
    
    ПолноеИмяОтчета = ФормаОтчета.Отчет.Метаданные().ПолноеИмя();

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

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

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

Дополнительные проверки

Прежде чем внедрять программный перехват, убедитесь в следующем:

Таким образом, мы рассмотрели как системные настройки схемы компоновки данных, так и возможность «ручного» управления поведением формы через обработку событий. Использование программного открытия через ПоказатьЗначение является надежным, хотя и требующим дополнительного кода решением.

← На главную