Как в СКД вытащить дополнительный реквизит из табличной части документа?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача вывода данных, которые не являются стандартными реквизитами объекта, а добавлены пользователями в режиме «1С:Предприятие» как дополнительные реквизиты. Особую сложность вызывает ситуация, когда этот реквизит нужно достать не из основного документа отчета, а из связанного объекта (например, получить «Номер заказа на сайте» из «Заказа клиента», на основании которого создана «Реализация товаров и услуг»).

В современных конфигурациях (УТ 11, ERP, КА 2) дополнительные реквизиты хранятся в специальной табличной части ДополнительныеРеквизиты самого объекта. Разберем подробно, какими способами можно извлечь эти данные для отчета. При необходимости вывода массива значений можно воспользоваться инструкцией по объединению строк из табличной части в одной ячейке.

Способ 1. Настройка характеристик в СКД (Рекомендуемый)

Этот метод считается наиболее правильным и производительным. Он позволяет системе компоновки данных динамически подтягивать нужные свойства, не перегружая основной запрос лишними соединениями. Если настроить характеристики, то в дереве доступных полей отчета дополнительные реквизиты появятся как обычные поля объекта.

Рассмотрим по шагам, как настроить этот механизм в конструкторе схемы компоновки данных:

  1. Откроем конструктор запроса в СКД и перейдем на вкладку Характеристики.
  2. Добавим новую строку и заполним следующие параметры для типа ДокументСсылка.ЗаказКлиента:
    • Тип: выберем объект, для которого ищем реквизиты (в нашем случае ДокументСсылка.ЗаказКлиента).
    • Источник видов характеристик: запрос к таблице ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения. Здесь нужно отобрать свойства, относящиеся именно к заказам.
    • Источник значений характеристик: табличная часть ЗаказКлиента.ДополнительныеРеквизиты.

Пример запроса для настройки Видов характеристик может выглядеть следующим образом:


ВЫБРАТЬ
    ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,
    ДополнительныеРеквизитыИСведения.Наименование КАК Наименование,
    ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения
ИЗ
    ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
ГДЕ
    НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления
    И ДополнительныеРеквизитыИСведения.НаборСвойств = &НаборСвойствЗаказа

После такой настройки в настройках отчета (вкладка «Выбранные поля») мы увидим папку Заказ клиента, внутри которой появятся все доступные дополнительные реквизиты. Преимущество: СКД сама выполнит ЛЕВОЕ СОЕДИНЕНИЕ только тогда, когда пользователь выберет это поле в отчете.

Способ 2. Использование ручного соединения в тексте запроса

Если по каким-то причинам механизм характеристик не подходит (например, требуется сложная логика обработки значения прямо в запросе), мы можем прописать соединение вручную. Проанализируем типичную ошибку новичков: попытку обратиться к табличной части через точку. В языке запросов 1С это недопустимо, если мы хотим получить конкретное значение из строк ТЧ. Для детального изучения таких конструкций можно использовать статью с разбором механизмов соединений в запросах.

Нам необходимо выполнить ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы с табличной частью дополнительных реквизитов. Разберем пример запроса для получения даты заказа на сайте из связанного заказа клиента:


ВЫБРАТЬ
    Реализация.Ссылка КАК Реализация,
    Реализация.ЗаказКлиента КАК ЗаказКлиента,
    ДопРеквизиты.Значение КАК ДатаЗаказаНаСайте
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ДопРеквизиты
        ПО Реализация.ЗаказКлиента = ДопРеквизиты.Ссылка
        И ДопРеквизиты.Свойство = &СвойствоДатаЗаказа
ГДЕ
    Реализация.Проведен

Важные замечания по коду:

Способ 3. Получение данных из регистра (для старых конфигураций или Дополнительных сведений)

Проанализируем ситуацию, если вы работаете с конфигурацией на базе УПП или используете «Дополнительные сведения» (которые в отличие от реквизитов хранятся не в документе, а отдельно). В этом случае данные хранятся в регистре сведений ЗначенияСвойствОбъектов.

Рассмотрим структуру такого запроса:


ВЫБРАТЬ
    Реализация.Ссылка,
    ЗначенияСвойств.Значение КАК НомерЗаказаНаСайте
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
        ПО Реализация.ЗаказКлиента = ЗначенияСвойств.Объект
        И ЗначенияСвойств.Свойство = &СвойствоНомерЗаказа

Выясним причину, почему поле может не отображаться в конструкторе СКД после внесения изменений. Часто это связано с кэшированием метаданных или отсутствием прав доступа у текущего пользователя на чтение конкретных записей в таблицах свойств. Всегда проверяйте права доступа к ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.

Подводя итог, можно сказать: если ваша задача — просто вывести реквизит в типовой отчет, используйте Характеристики. Если же данные реквизита должны участвовать в вычислениях внутри запроса (например, в условиях ГДЕ или в качестве базы для распределения сумм), используйте ручное Левое соединение с обязательной типизацией через ВЫРАЗИТЬ.

← На главную