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