При создании отчетов на базе системы компоновки данных (СКД), которые строятся на регистрах накопления или бухгалтерии, разработчики часто сталкиваются с задачей вывода «человекочитаемого» имени документа, который сделал запись в регистре. Стандартное поле Регистратор в запросе возвращает ссылку, которая при попытке вывода в отчет может выглядеть неинформативно или требовать сложной обработки. Давайте разберем, как эффективно решить эту задачу.
Если вам нужно быстро получить строковое представление типа документа, не перечисляя каждый вид в запросе, воспользуйтесь встроенной функцией ТипЗначения(). Это наиболее универсальный способ, который работает для любого количества документов-регистраторов.
Чтобы вывести информацию в поле представления, используйте следующее выражение в настройках набора данных СКД:
Формат(Регистратор.Дата, "ДФ = dd.MM.yyyy") + " " +
Строка(Регистратор.Контрагент) + " " +
Строка(ТипЗначения(Регистратор))
Этот подход вернет строку вида "Документ объект: Приходная накладная". Это решение отлично подходит, когда количество видов документов в базе постоянно меняется и вы не хотите поддерживать сложную логику «ВЫБОР-КОГДА».
Если требуется выводить строго определенные синонимы (например, без префикса «Документ объект»), и количество регистраторов невелико, можно воспользоваться конструкцией ВЫБОР непосредственно в тексте запроса СКД. Это позволяет полностью контролировать то, что увидит пользователь в отчете.
Разберем пример реализации такой логики:
ВЫБОР
КОГДА Регистратор ССЫЛКА Документ.ПриходнаяНакладная ТОГДА "Приходная накладная"
КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА "Реализация товаров"
ИНАЧЕ "Прочий документ"
КОНЕЦ КАК ВидРегистратора
После добавления такого поля в запрос, вы можете обращаться к нему как к обычному полю ВидРегистратора при настройке оформления вашего отчета.
Для профессиональной разработки рекомендуется выносить логику определения вида документа в вычисляемые поля или общие модули. Прямой доступ к Регистратор.Метаданные().Имя в выражении поля СКД может приводить к синтаксическим ошибкам, так как объект Метаданные не всегда доступен в контексте исполнения запроса СКД напрямую.
Рассмотрим пошагово оптимальный алгоритм действий:
Регистратор в наборе данных запроса без изменений.ИмяДокумента.ПолучитьПредставлениеВидаДокумента(Регистратор).
Функция ПолучитьПредставлениеВидаДокумента(СсылкаНаДокумент) Экспорт
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
Возврат СсылкаНаДокумент.Метаданные().Синоним;
КонецЕсли;
Возврат "";
КонецФункции
Этот метод считается архитектурно правильным. Он позволяет легко изменять логику вывода имен во всей конфигурации, просто поправив одну функцию в общем модуле, не затрагивая десятки отчетов.
Выбор метода зависит от ваших задач:
ТипЗначения().Метаданные().Синоним.ВЫБОР в запросе.Не рекомендуется использовать Регистратор.Представление, так как оно включает в себя номер и дату документа, что часто дублирует данные, уже выведенные в других колонках отчета, делая итоговую таблицу трудночитаемой.