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