Мы рассмотрим распространенную проблему, когда при нажатии на ячейку отчета, сформированного на Системе Компоновки Данных (СКД), содержащую ссылку на документ (например, "Документ расчетов с контрагентом"), не происходит переход к форме этого документа. Вместо ожидаемого открытия документа, пользователь сталкивается либо с отсутствием реакции, либо с появлением пустых полей. Мы разберем основные причины такого поведения и предложим пошаговые решения для диагностики и исправления ситуации.
Прежде чем углубляться в детали, давайте вспомним, как платформа 1С обычно обрабатывает расшифровку для ссылочных полей "из коробки". Если отчет построен с использованием типовых механизмов объекта "Отчет" и его формы, большинство действий по расшифровке не требуют дополнительного программирования. Мы ожидаем, что при двойном клике (или нажатии Enter) на ячейку отчета произойдет следующее:
Если этот базовый функционал не работает так, как описано, значит, какой-то аспект в настройке СКД или в процессе программного формирования отчета нарушает данный механизм.
Этот шаг является одним из самых критичных и часто упускаемых из виду. Платформа 1С должна точно знать, что отображаемое значение в ячейке отчета является ссылкой на объект базы данных, чтобы автоматически определить, какую форму нужно открыть при расшифровке. Если тип поля указан неверно или отсутствует, система не сможет выполнить ожидаемое действие.
Мы разберем шаги проверки типа поля:
ДокументСсылка.РеализацияТоваровУслуг. Если это поле из регистра бухгалтерии, как Субконто3, его тип должен соответствовать типу субконто (например, ДокументСсылка.ПлатежноеПоручениеИсходящее).Строка, Число или любой другой нессылочный тип, то платформа не сможет автоматически открыть форму документа. В таком случае, даже если визуально в ячейке отображается номер документа, система воспринимает его как обычный текст.Как исправить, если тип неверный:
Иногда тип поля может быть определен как Строка, если это поле является результатом функции, выражения или если запрос содержит объединения, где тип поля не может быть однозначно определен. В таких случаях:
[ПолеДокументСсылка], а в свойстве "Выражение расшифровки" также указываете [ПолеДокументСсылка]. Таким образом, отображается номер, но расшифровывается ссылка.Если отчет формируется не с помощью типовой формы объекта "Отчет", а программно в произвольной обработке или форме, возникает дополнительная сложность. В этом случае для корректной работы расшифровки необходимо вручную управлять объектом ДанныеРасшифровкиКомпоновкиДанных и обеспечивать его передачу между сервером и клиентом. При реализации подобных сценариев можно использовать готовые шаблоны программного формирования отчетов на СКД в управляемых формах.
Мы рассмотрим процесс пошагово:
Для начала, в серверной процедуре, отвечающей за формирование отчета, нам необходимо создать экземпляр объекта ДанныеРасшифровкиКомпоновкиДанных. Этот объект будет собирать всю необходимую информацию для дальнейшей расшифровки.
// ...
ДанныеРасшифровкиСКД = Новый ДанныеРасшифровкиКомпоновкиДанных;
// ...
При выполнении компоновки макета СКД этот только что созданный объект должен быть передан в метод КомпоновщикМакета.Выполнить(). Это позволит СКД заполнить его информацией о структуре отчета и возможных расшифровках.
// ...
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровкиСКД);
// ...
Далее, при инициализации процессора вывода, который непосредственно формирует табличный документ, также необходимо передать объект ДанныеРасшифровкиСКД. Это позволяет процессору связать ячейки табличного документа с соответствующими данными для расшифровки.
// ...
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиСКД);
// ...
После того как отчет сформирован и объект ДанныеРасшифровкиСКД заполнен, его необходимо поместить во временное хранилище. Это обязательный шаг, так как объект типа ДанныеРасшифровкиКомпоновкиДанных не может быть напрямую передан на клиент. Адрес этого хранилища (строка) будет передан на клиент.
// ...
АдресХранилищаДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиСКД, УникальныйИдентификатор);
// ...
Мы используем УникальныйИдентификатор, чтобы обеспечить уникальность адреса, особенно если отчет формируется многократно или одновременно несколькими пользователями.
В управляемой форме, где отображается табличный документ отчета, нам необходимо создать реквизит формы с именем ДанныеРасшифровки (тип Строка). Это имя является стандартным для связывания с расшифровкой.
В модуле формы (обычно в серверной процедуре, которая вызывает формирование отчета и выводит его на экран) мы должны присвоить этому реквизиту адрес временного хранилища, полученный на сервере.
// Пример в серверной процедуре формы после формирования отчета и помещения ДанныеРасшифровкиСКД во временное хранилище:
// ...
Элементы.РезультатОтчета.ДанныеРасшифровки = АдресХранилищаДанныхРасшифровки;
// ...
Здесь Элементы.РезультатОтчета — это элемент управления типа "Поле табличного документа", который выводит отчет. Мы должны убедиться, что сам элемент управления "Поле табличного документа" на форме связан с этим реквизитом через свойство "Данные расшифровки" в его свойствах в конфигураторе.
Когда пользователь попытается расшифровать ячейку отчета (например, двойным кликом), система вызовет событие РезультатОтчетаОбработкаРасшифровки (или аналогичное, в зависимости от имени элемента формы). В этом событии нам нужно будет получить объект ДанныеРасшифровкиКомпоновкиДанных обратно из временного хранилища по переданному адресу. Это обычно делается в серверном вызове из обработчика события.
// В модуле формы:
&НаСервере
Процедура ЗагрузитьПодготовленныеДанные(АдресХранилища) // Пример процедуры для получения данных из хранилища
// Предполагаем, что во временном хранилище хранится структура, содержащая Результат (ТабличныйДокумент)
// и ДанныеРасшифровки (ДанныеРасшифровкиКомпоновкиДанных)
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресХранилища);
Если ТипЗнч(РезультатВыполнения) = Тип("Структура") Тогда
// Если мы помещали структуру
Результат = РезультатВыполнения.Результат; // Сам ТабличныйДокумент
ДанныеРасшифровки = РезультатВыполнения.ДанныеРасшифровки; // Объект ДанныеРасшифровкиКомпоновкиДанных
Иначе
// Если мы помещали непосредственно объект ДанныеРасшифровкиКомпоновкиДанных
// В таком случае, возможно, табличный документ был передан отдельно
ДанныеРасшифровки = РезультатВыполнения;
КонецЕсли;
// Далее мы используем объект ДанныеРасшифровки для обработки запроса на расшифровку
// Например, через метод Обработать()
// ПроцессорРасшифровки = Новый ПроцессорРасшифровкиКомпоновкиДанных;
// ПроцессорРасшифровки.Инициализировать(ДанныеРасшифровки, Новый ИсточникДополнительныхДанныхРасшифровкиКомпоновкиДанных);
// ДействияРасшифровки = ПроцессорРасшифровки.ПолучитьДействия(Расшифровка);
// ...
КонецПроцедуры
Именно по этому механизму происходит связь между кликом пользователя в табличном документе и данными, которые позволяют платформе определить, что именно нужно открыть или какую детализацию показать. Отсутствие или некорректная передача этого адреса приведет к тому, что расшифровка работать не будет. Для практической реализации извлечения значений группировок из этого механизма можно использовать пример программной работы с обработчиком расшифровки СКД.
Если вы используете пользовательские макеты для оформления ячеек или группировок в СКД, мы должны убедиться, что в этих макетах правильно указаны свойства "Параметр расшифровки" (ПараметрРасшифровки) и "Поле расшифровки" (ПолеРасшифровки) для нужных областей. Эти свойства позволяют явно указать, какие данные из набора данных должны быть использованы для расшифровки данной конкретной ячейки, даже если ее визуальное представление отличается от исходного поля.
Для эффективной диагностики проблем с расшифровкой мы настоятельно рекомендуем использовать отладчик. Это позволяет нам проверить содержимое ключевых переменных в момент формирования отчета и передачи данных.
Мы выполним следующие шаги:
ДанныеРасшифровкиКомпоновкиДанных во временное хранилище. Это место, где вы вызываете функцию ПоместитьВоВременноеХранилище().АдресХранилищаДанныхРасшифровки), действительно содержит непустую строку (например, "e1c_..._temporary_storage_path"). Если эта переменная пуста или имеет значение Неопределено, то данные не были помещены или получены некорректно.ДанныеРасшифровки. Мы должны убедиться, что он также содержит этот адрес временного хранилища. Это можно сделать, установив точку останова после присвоения значения этому реквизиту.РезультатОтчетаОбработкаРасшифровки). Когда пользователь попытается расшифровать ячейку, отладчик должен остановиться здесь.ДанныеРасшифровкиКомпоновкиДанных из временного хранилища по адресу, хранящемуся в реквизите формы ДанныеРасшифровки. Проверьте содержимое этого объекта – он должен содержать элементы расшифровки.Если при попытке установить точку останова и сформировать отчет 1С "слетает", это может указывать на более глубокие проблемы с платформой, средой выполнения или конфигурацией. В таком случае, мы рекомендуем проверить журнал регистрации на наличие ошибок, обновить платформу 1С до актуальной версии или проверить целостность базы данных.
Хотя этот аспект напрямую не относится к проблеме неработающей расшифровки, мы считаем важным обратить внимание на оптимизацию запросов, которая может косвенно влиять на стабильность и скорость работы отчетов. В одном из сообщений форума упоминалось использование конструкции Субконто3.Ссылка.
Мы должны помнить, что если поле Субконто3 (или любое другое поле) уже является ссылочным типом (например, имеет тип ДокументСсылка.ПлатежноеПоручениеИсходящее), то нет необходимости явно писать Субконто3.Ссылка. Использование лишнего ".Ссылка" в запросе может привести к ненужному дессылкированию или повторной выборке ссылки, что может снизить производительность запроса, особенно на больших объемах данных.
// Неоптимально, если Субконто3 уже ссылочный тип:
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто3.Ссылка КАК СсылкаНаОбъект
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
// Оптимально, если Субконто3 уже ссылочный тип:
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто3 КАК СсылкаНаОбъект
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
Мы рекомендуем всегда использовать наиболее прямой путь к данным, чтобы обеспечить максимальную производительность отчетов СКД.
Мы подвели итоги нашего рассмотрения проблемы неработающей расшифровки ссылок в отчетах СКД. Как мы выяснили, чаще всего она кроется либо в неверно указанном типе поля в схеме СКД, либо в неправильной передаче объекта ДанныеРасшифровкиКомпоновкиДанных при программном формировании отчета. Тщательная проверка этих аспектов, а также использование отладчика, позволит вам восстановить корректную работу расшифровки и обеспечить полноценный функционал ваших отчетов.
Мы рекомендуем всегда начинать диагностику с проверки типа поля в СКД, так как это наиболее простая и распространенная причина. Если тип поля верен, тогда мы переходим к проверке механизма передачи данных расшифровки, особенно при программном формировании отчета.