При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью вывести данные, которые не являются основными реквизитами справочника, а добавлены пользователями в режиме «1С:Предприятие» как дополнительные реквизиты. В типовых конфигурациях (ЗУП 3.1, ERP 2.5, БП 3.0) эти данные хранятся не в основной таблице справочника, а в специальной табличной части или регистре сведений. Рассмотрим подробнее, как правильно извлечь эти данные, чтобы отчет работал быстро и корректно.
Самый прямой и очевидный путь — это обращение к табличной части справочника ДополнительныеРеквизиты. Разберем ситуацию на примере справочника Сотрудники. Допустим, нам нужно получить значение конкретного доп. реквизита.
Проанализируем структуру запроса. Нам необходимо выполнить ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы справочника с его табличной частью. Крайне важно накладывать фильтр по конкретному свойству непосредственно в условии связи ПО, а не в блоке ГДЕ. Это предотвратит «размножение» строк в результате, если у объекта заполнено несколько дополнительных реквизитов.
Посмотрим на пример кода:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Наименование КАК ФИО,
СотрудникиДополнительныеРеквизиты.Значение КАК ЗначениеРеквизита
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники.ДополнительныеРеквизиты КАК СотрудникиДополнительныеРеквизиты
ПО Сотрудники.Ссылка = СотрудникиДополнительныеРеквизиты.Ссылка
И СотрудникиДополнительныеРеквизиты.Свойство = &НужноеСвойство
В данном примере параметр &НужноеСвойство должен содержать ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения. Использование левого соединения гарантирует, что в отчет попадут все сотрудники, даже если у них не заполнен данный реквизит.
Профессиональный подход к разработке в СКД подразумевает использование встроенного механизма характеристик. Этот метод позволяет пользователю работать с дополнительными реквизитами так же легко, как и с основными: они появляются в списке доступных полей через «плюсик».
Разберем по шагам, как настроить характеристики в схеме компоновки данных:
СправочникСсылка.Сотрудники (или ваш справочник).ДополнительныеРеквизитыИСведения.ДополнительныеРеквизиты нужного справочника.Ссылка), Вид характеристики (поле Свойство) и Значение (поле Значение).После такой настройки нам не нужно вручную соединять таблицы в тексте запроса. СКД сама подставит необходимые соединения, если пользователь выберет доп. реквизит в настройках отчета. Это значительно повышает производительность, так как лишние таблицы не будут задействованы, если поле не используется.
Важно различать дополнительные реквизиты и дополнительные сведения. Реквизиты хранятся «внутри» объекта (в его табличной части), а сведения — «снаружи», в независимом регистре сведений ДополнительныеСведения.
Если нужные вам данные являются сведениями, запрос в СКД будет выглядеть следующим образом:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ДопСведения.Значение КАК Цвет
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
ПО Номенклатура.Ссылка = ДопСведения.Объект
И ДопСведения.Свойство = &СвойствоЦвет
Обратите внимание, что в регистре сведений поле связи называется Объект, а не Ссылка. Это ключевое отличие при написании условий соединения.
Выясним причину возможных ошибок при работе с типами. Поле Значение в таблице дополнительных реквизитов имеет составной тип данных. Если вы точно знаете, что в вашем реквизите хранится число или дата, и хотите выполнять над ними математические операции в СКД, обязательно используйте функцию ВЫРАЗИТЬ.
Проанализируем ситуацию: без явного приведения типа СКД может некорректно суммировать значения или выдавать ошибку при попытке форматирования. Рассмотрим пример:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
ВЫРАЗИТЬ(ДопРеквизиты.Значение КАК Число(15, 2)) КАК ЧисловойПоказатель
ИЗ
Справочник.Сотрудники КАК Сотрудники
...
Важные советы для разработчика:
&Свойство, чтобы избежать жесткой привязки к GUID в коде, который может измениться при переносе данных между базами.УправлениеСвойствами.ЗначениеСвойства(), прямо в выражениях полей СКД, однако помните, что это может замедлить формирование отчета на очень больших объемах данных.Таким образом, мы рассмотрели основные методы работы с дополнительными данными. Для простых отчетов подойдет прямое соединение в запросе, но для тиражируемых решений и сложных систем лучшим выбором будет использование механизма характеристик СКД.