Как исправить ошибку «Null» при расшифровке ресурсов в отчете СКД

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

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

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

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

Рассмотрим основные причины возникновения ошибки:

  1. Отсутствие группировок: Если отчет выводит только общие итоги без детальных записей, системе не к чему «привязаться».
  2. Неправильные роли полей: В наборе данных СКД для полей-периодов или ключевых полей не установлены флаги «Обязательное» или не указаны соответствующие роли.
  3. Программная обработка: Если в форме отчета перехвачено событие ОбработкаРасшифровки, но в нем не прописана логика для работы с ресурсами, стандартный механизм будет игнорироваться.

Решение 1: Простейший способ включения стандартной обработки

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

В обработчике события ОбработкаРасшифровки табличного документа на форме добавьте следующую строку:


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

Этот параметр сообщает платформе, что после выполнения вашего кода (или вместо него) нужно запустить штатный механизм расшифровки 1С. Часто этого достаточно, чтобы «Null» исчез, и появилось контекстное меню.

Решение 2: Программный разбор данных расшифровки (Управляемые формы)

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

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


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

&НаСервере
Функция ПолучитьЗначениеРасшифровкиНаСервере(Расшифровка)
    // ДанныеРасшифровки - это стандартный реквизит формы отчета
    ЭлементРасшифровки = ДанныеРасшифровки.Элементы[Расшифровка];
    
    Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
        Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
            // Возвращаем значение первого найденного поля в расшифровке
            Возврат Поле.Значение;
        КонецЦикла;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

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

Решение 3: Настройка ролей полей в схеме компоновки

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

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

Решение 4: Использование выражения расшифровки

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

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

Также можно использовать системные функции, например:

ЗаполнитьЗначенияСвойств(Новый Структура("Документ, Контрагент"), ДанныеПоля)

Это позволит передать в обработку расшифровки целый набор параметров текущей строки.

Особенности для обычных форм (1С 8.2)

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

Пример инициализации расшифровки в обычном приложении:


ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

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

Подведем итог: исправление ошибки «Null» в ресурсах требует комплексного подхода — от проверки флага СтандартнаяОбработка до настройки ролей полей в схеме и правильной инициализации объекта ДанныеРасшифровки в коде формы. Используя приведенные выше методы, вы сможете создать удобный и интерактивный отчет, в котором каждое число будет прозрачным и расшифровываемым.

← На главную