При разработке отчетов на базе Системы компоновки данных (СКД) в 1С часто возникает задача вывода дополнительных реквизитов и сведений. Механизм дополнительных реквизитов активно используется в типовых конфигурациях (таких как УТ 11, ERP, КА, УНФ) и позволяет пользователям динамически расширять состав свойств объектов без изменения конфигурации.
Однако по умолчанию платформа 1С позиционирует такие характеристики внутри структуры объекта. Это означает, что в дереве доступных полей компоновщика пользователю приходится «раскрывать» объект (например, номенклатуру, контрагента или карту лояльности) и искать свойства внутри него. Сегодня мы подробно разберем, как исправить популярные ошибки при настройке характеристик и как вывести дополнительные реквизиты на первый уровень (в корень) доступных полей отчета.
Рассмотрим ситуацию, с которой столкнулся автор темы. Он попытался описать характеристики через специализированное расширение языка запросов {ХАРАКТЕРИСТИКИ}, но столкнулся с тем, что поля характеристик вообще не появились в компоновщике. Давайте выясним причину этой проблемы.
Посмотрим на исходный запрос, который написал разработчик:
ВЫБРАТЬ
КартыЛояльности.Ссылка КАК Ссылка,
КартыЛояльности.Наименование КАК Наименование,
КартыЛояльности.Штрихкод КАК Штрихкод,
КартыЛояльности.Статус КАК Статус
ИЗ
Справочник.КартыЛояльности КАК КартыЛояльности
{ХАРАКТЕРИСТИКИ
ТИП(Справочник.КартыЛояльности)
ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Представление
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
КартыЛояльностиДополнительныеРеквизиты.Свойство КАК Свойство,
КартыЛояльностиДополнительныеРеквизиты.Значение КАК Значение,
КартыЛояльностиДополнительныеРеквизиты.Ссылка КАК Ссылка
ИЗ
Справочник.КартыЛояльности.ДополнительныеРеквизиты КАК КартыЛояльностиДополнительныеРеквизиты)
ПОЛЕОБЪЕКТА Свойство
ПОЛЕВИДА Свойство
ПОЛЕЗНАЧЕНИЯ Значение }
Проанализируем параметры связи характеристик в этом коде. Обратите внимание на строки:
ПОЛЕОБЪЕКТА Свойство
ПОЛЕВИДА Свойство
В этом кроется критическая ошибка. Давайте разберем назначение этих параметров:
КартыЛояльности). В табличной части дополнительных реквизитов это поле всегда называется Ссылка.Свойство.Значение.В коде автора параметр ПОЛЕОБЪЕКТА ошибочно ссылался на поле Свойство. Из-за этого платформа пыталась сопоставить владельца характеристики со значением самого свойства ПВХ, связь нарушалась, и СКД не отображала характеристики.
Для исправления этой ошибки нам необходимо заменить значение параметра ПОЛЕОБЪЕКТА на Ссылка. Правильный вариант описания характеристик в запросе СКД выглядит следующим образом:
{ХАРАКТЕРИСТИКИ
ТИП(Справочник.КартыЛояльности)
ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Представление
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
КартыЛояльностиДополнительныеРеквизиты.Свойство КАК Свойство,
КартыЛояльностиДополнительныеРеквизиты.Значение КАК Значение,
КартыЛояльностиДополнительныеРеквизиты.Ссылка КАК Ссылка
ИЗ
Справочник.КартыЛояльности.ДополнительныеРеквизиты КАК КартыЛояльностиДополнительныеРеквизиты)
ПОЛЕОБЪЕКТА Ссылка // Исправлено со "Свойство" на "Ссылка"
ПОЛЕВИДА Свойство
ПОЛЕЗНАЧЕНИЯ Значение }
После этого исправления характеристики успешно инициализируются платформой и станут доступны для выбора через объект Ссылка.
По умолчанию СКД жестко привязывает динамические характеристики к типу данных объекта. Пользователь видит их «через точку» (например, Ссылка.СрокДействияКарты). Если мы хотим облегчить жизнь пользователю и вывести эти поля на самый первый уровень доступных полей (наравне со Ссылка и Наименование), мы можем воспользоваться тремя альтернативными способами.
Это наиболее гибкий и рекомендуемый способ, если мы хотим сохранить динамическую природу характеристик, но предоставить пользователю простой доступ к ним в корневом списке.
Давайте выполним настройку по шагам:
Ссылка.[ИмяДополнительногоРеквизита].СрокДействияКарты.Ссылка.СрокДействияКарты. Обратите внимание, что имя реквизита в выражении должно точно совпадать с наименованием характеристики в ПВХ.После выполнения этих действий новое вычисляемое поле появится в корневом списке доступных полей отчета. Пользователю больше не придется искать его внутри структуры ссылки.
Если вам заранее известен точный список дополнительных реквизитов, которые необходимо вывести в отчет, вы можете полностью отказаться от механизма характеристик СКД и соединить нужные данные напрямую в тексте SQL-запроса.
Рассмотрим пример реализации такого запроса:
ВЫБРАТЬ
КартыЛояльности.Ссылка КАК Ссылка,
КартыЛояльности.Наименование КАК Наименование,
ЕСТЬNULL(ДопРеквизиты.Значение, ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК СрокДействияКарты
ИЗ
Справочник.КартыЛояльности КАК КартыЛояльности
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КартыЛояльности.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО КартыЛояльности.Ссылка = ДопРеквизиты.Ссылка
И ДопРеквизиты.Свойство = &ПараметрСвойствоСрокДействия
В данном случае поле СрокДействияКарты сразу станет полноценным полем первого уровня.
Преимущества метода:
Недостатки метода:
Иногда разработчики путают задачу удобства выбора полей в компоновщике с задачей визуального представления информации в итоговой таблице. Если ваша цель состоит в том, чтобы дополнительные реквизиты выводились в отчете в отдельных колонках на одном уровне со ссылкой, а не склеивались в одну ячейку, эту задачу можно решить стандартными настройками компоновки данных.
Разберем, как это настроить в пользовательском режиме или в конфигураторе:
После применения этой настройки, даже если пользователь выберет для вывода поле Ссылка.СрокДействияКарты, система компоновки данных автоматически разделит его в результирующей таблице на две независимые колонки: отдельно выведется представление карты лояльности, и в соседней колонке на том же уровне — значение дополнительного реквизита.
Используйте эти методы в зависимости от ваших архитектурных задач: вычисляемые поля отлично подойдут для гибких отчетов с динамическими характеристиками, а явное левое соединение обеспечит максимальное быстродействие при работе со статическим набором реквизитов.