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