Почему не работает расшифровка ссылки на документ в отчете СКД?

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

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

Основы работы расшифровки в отчетах СКД

Прежде чем углубляться в детали, давайте вспомним, как платформа 1С обычно обрабатывает расшифровку для ссылочных полей "из коробки". Если отчет построен с использованием типовых механизмов объекта "Отчет" и его формы, большинство действий по расшифровке не требуют дополнительного программирования. Мы ожидаем, что при двойном клике (или нажатии Enter) на ячейку отчета произойдет следующее:

  1. Для значений ссылочного типа (например, ссылки на документы, элементы справочников) выполняется действие по умолчанию – открытие формы соответствующего объекта.
  2. Для полей-ресурсов (итоговые значения) обычно происходит расшифровка по выбранному полю, что может привести к детализации данных.
  3. Для значений группировок нессылочного типа открывается меню выбора действия расшифровки, предлагающее опции типа "Расшифровать", "Открыть", "Отфильтровать" и другие.

Если этот базовый функционал не работает так, как описано, значит, какой-то аспект в настройке СКД или в процессе программного формирования отчета нарушает данный механизм.

Проверяем тип поля в схеме компоновки данных (СКД)

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

Мы разберем шаги проверки типа поля:

  1. Откройте схему компоновки данных (СКД) вашего отчета в конфигураторе. Это можно сделать через контекстное меню объекта "Отчет" в дереве конфигурации или непосредственно из формы отчета.
  2. Перейдите на вкладку "Наборы данных". Здесь мы увидим все наборы данных, используемые в отчете (например, "Набор данных - Запрос").
  3. Выберите поле, по которому должна работать расшифровка. В нашем случае это "Документ расчетов с контрагентом". Найдите это поле в списке полей выбранного набора данных.
  4. В свойствах этого поля (обычно в нижней части окна СКД или по двойному клику на поле) убедитесь, что в колонке "Тип" указан правильный ссылочный тип данных. Например, если это документ "Реализация товаров и услуг", тип должен быть ДокументСсылка.РеализацияТоваровУслуг. Если это поле из регистра бухгалтерии, как Субконто3, его тип должен соответствовать типу субконто (например, ДокументСсылка.ПлатежноеПоручениеИсходящее).
  5. Мы должны понимать, что если в колонке "Тип" указано Строка, Число или любой другой нессылочный тип, то платформа не сможет автоматически открыть форму документа. В таком случае, даже если визуально в ячейке отображается номер документа, система воспринимает его как обычный текст.

Как исправить, если тип неверный:

Иногда тип поля может быть определен как Строка, если это поле является результатом функции, выражения или если запрос содержит объединения, где тип поля не может быть однозначно определен. В таких случаях:

Особенности программного формирования отчета и объект "ДанныеРасшифровки"

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

Мы рассмотрим процесс пошагово:

  1. Инициализация объекта данных расшифровки:

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

    
    // ...
    ДанныеРасшифровкиСКД = Новый ДанныеРасшифровкиКомпоновкиДанных;
    // ...
    
  2. Передача объекта в процессор компоновки макета:

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

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

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

    
    // ...
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиСКД);
    // ...
    
  4. Помещение данных расшифровки во временное хранилище:

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

    
    // ...
    АдресХранилищаДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиСКД, УникальныйИдентификатор);
    // ...
    

    Мы используем УникальныйИдентификатор, чтобы обеспечить уникальность адреса, особенно если отчет формируется многократно или одновременно несколькими пользователями.

  5. Создание реквизита формы и связывание его с данными расшифровки:

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

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

    
    // Пример в серверной процедуре формы после формирования отчета и помещения ДанныеРасшифровкиСКД во временное хранилище:
    // ...
    Элементы.РезультатОтчета.ДанныеРасшифровки = АдресХранилищаДанныхРасшифровки;
    // ...
    

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

  6. Извлечение данных расшифровки на клиенте при обработке:

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

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

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

  7. Использование пользовательских макетов:

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

Диагностика проблем с помощью отладчика

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

Мы выполним следующие шаги:

  1. Установите точку останова в серверной процедуре, где происходит формирование отчета и помещение объекта ДанныеРасшифровкиКомпоновкиДанных во временное хранилище. Это место, где вы вызываете функцию ПоместитьВоВременноеХранилище().
  2. Проверьте, что переменная, которой присваивается адрес временного хранилища (например, АдресХранилищаДанныхРасшифровки), действительно содержит непустую строку (например, "e1c_..._temporary_storage_path"). Если эта переменная пуста или имеет значение Неопределено, то данные не были помещены или получены некорректно.
  3. Проверьте реквизит формы с именем ДанныеРасшифровки. Мы должны убедиться, что он также содержит этот адрес временного хранилища. Это можно сделать, установив точку останова после присвоения значения этому реквизиту.
  4. Установите точку останова в обработчике события расшифровки элемента "Поле табличного документа" (например, РезультатОтчетаОбработкаРасшифровки). Когда пользователь попытается расшифровать ячейку, отладчик должен остановиться здесь.
  5. В этом обработчике мы должны убедиться, что вы можете успешно получить объект ДанныеРасшифровкиКомпоновкиДанных из временного хранилища по адресу, хранящемуся в реквизите формы ДанныеРасшифровки. Проверьте содержимое этого объекта – он должен содержать элементы расшифровки.

Если при попытке установить точку останова и сформировать отчет 1С "слетает", это может указывать на более глубокие проблемы с платформой, средой выполнения или конфигурацией. В таком случае, мы рекомендуем проверить журнал регистрации на наличие ошибок, обновить платформу 1С до актуальной версии или проверить целостность базы данных.

Производительность запросов: избегаем избыточности

Хотя этот аспект напрямую не относится к проблеме неработающей расшифровки, мы считаем важным обратить внимание на оптимизацию запросов, которая может косвенно влиять на стабильность и скорость работы отчетов. В одном из сообщений форума упоминалось использование конструкции Субконто3.Ссылка.

Мы должны помнить, что если поле Субконто3 (или любое другое поле) уже является ссылочным типом (например, имеет тип ДокументСсылка.ПлатежноеПоручениеИсходящее), то нет необходимости явно писать Субконто3.Ссылка. Использование лишнего ".Ссылка" в запросе может привести к ненужному дессылкированию или повторной выборке ссылки, что может снизить производительность запроса, особенно на больших объемах данных.


// Неоптимально, если Субконто3 уже ссылочный тип:
ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто3.Ссылка КАК СсылкаНаОбъект
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки

// Оптимально, если Субконто3 уже ссылочный тип:
ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто3 КАК СсылкаНаОбъект
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки

Мы рекомендуем всегда использовать наиболее прямой путь к данным, чтобы обеспечить максимальную производительность отчетов СКД.

Заключение

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

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

← На главную