Как настроить расшифровку ресурсного поля в отчете СКД ссылкой на регистратор?

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

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

Почему возникает ошибка при расшифровке ресурса

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

Способ 1: Использование роли «Регистратор»

Это самый «чистый» и рекомендуемый способ в архитектуре 1С. Платформа имеет встроенный механизм, который автоматически связывает записи с документами-регистраторами. Разберем шаги настройки:

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Найдем в списке полей наш Регистратор (поле, содержащее ссылку на документ).
  3. В колонке Роль нажмем на кнопку выбора.
  4. В открывшемся окне установим флаг Регистратор.

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

Способ 2: Настройка свойства «Выражение расшифровки»

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

Рассмотрим алгоритм действий:

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

Новый Структура("Регистратор, Склад", Регистратор, Склад)

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

Способ 3: Программная обработка через модули БСП

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

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


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

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

Способ 4: Метод «Скрытого поля» в группировке

Иногда требуется визуально скрыть регистратор, но сохранить его для механизмов расшифровки. Разберем хитрость с оформлением:

  1. Добавим Регистратор в Выбранные поля настройки отчета.
  2. Перейдем на закладку Условное оформление.
  3. Создадим новое правило. В оформлении установим Максимальная ширина = 0.1 и Текст = "" (пустая строка).
  4. В условии укажем, что оформление применяется всегда, а в области выбора укажем только поле Регистратор.

Таким образом, колонка фактически присутствует в таблице, расшифровка "видит" ее в контексте строки, но пользователь не видит лишней информации на экране. Это позволяет стандартной расшифровке ресурса успешно находить ссылку на документ.

Дополнительные рекомендации по работе с макетами

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

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

← На главную