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