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

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

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

Выясним причину проблемы

Проанализируем структуру хранения данных в 1С. Попытка обратиться к доп. реквизиту «через точку» не работает по двум основным причинам:

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

Решение 1. Фильтрация в тексте запроса через внутреннее соединение

Рассмотрим вариант, когда необходимо наложить фильтр непосредственно в тексте SQL-запроса. Для этого требуется соединить таблицу регистра с табличными частями ДополнительныеРеквизиты соответствующих документов.

Если в выборке участвует несколько видов документов (например, ЗаказПокупателя и РасходнаяНакладная), наиболее эффективным решением с точки зрения производительности СУБД будет разделение выборки на отдельные ветки с последующим объединением.

Посмотрим на пример построения такого запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Продажи.Ответственный КАК Ответственный,
    СУММА(ЕСТЬNULL(Продажи.Сумма - Продажи.Себестоимость, 0)) КАК СуммаПродаж
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.ДополнительныеРеквизиты КАК ЗаказДопРеквизиты
        ПО ЗаказДопРеквизиты.Ссылка = ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя)
        И ЗаказДопРеквизиты.Свойство = &СвойствоУдержан
        И ЗаказДопРеквизиты.Значение = ИСТИНА
ГДЕ
    Продажи.Сумма >= 0
    И Продажи.Ответственный = &Сотрудник
    И Продажи.Номенклатура.КатегорияНоменклатуры = &КатегорияНоменклатуры
    И РАЗНОСТЬДАТ(Продажи.Регистратор.Дата, &КонецПериода, ДЕНЬ) >= 185

СГРУППИРОВАТЬ ПО
    Продажи.Ответственный

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Продажи.Ответственный,
    СУММА(ЕСТЬNULL(Продажи.Сумма - Продажи.Себестоимость, 0))
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.ДополнительныеРеквизиты КАК НакладнаяДопРеквизиты
        ПО НакладнаяДопРеквизиты.Ссылка = ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РасходнаяНакладная)
        И НакладнаяДопРеквизиты.Свойство = &СвойствоУдержан
        И НакладнаяДопРеквизиты.Значение = ИСТИНА
ГДЕ
    Продажи.Сумма >= 0
    И Продажи.Ответственный = &Сотрудник
    И Продажи.Номенклатура.КатегорияНоменклатуры = &КатегорияНоменклатуры
    И РАЗНОСТЬДАТ(Продажи.Регистратор.Дата, &КонецПериода, ДЕНЬ) >= 185

СГРУППИРОВАТЬ ПО
    Продажи.Ответственный

В данном примере параметр &СвойствоУдержан должен содержать ссылку на элемент ПВХ ДополнительныеРеквизитыИСведения, соответствующий свойству «Удержан». Использование ссылки вместо проверки наименования через строку (Свойство.Наименование = "Удержан") предотвращает ошибки при переименовании реквизита пользователем.

Решение 2. Использование механизма «Характеристики» в СКД

Если отчет разрабатывается с использованием Системы компоновки данных, писать сложные соединения вручную вовсе не обязательно. Платформа 1С умеет автоматически подключать табличные части доп. реквизитов через механизм Характеристики.

Разберем по шагам порядок настройки СКД:

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

После сохранения этой настройки платформа автоматически свяжет свойства с документами. В настройках отбора СКД появится возможность обращаться к полю вида: Регистратор.[ИмяДопРеквизита]. Система самостоятельно сгенерирует необходимый SQL-запрос с правильными соединениями таблиц, что значительно упростит исходный текст запроса.

← На главную