При разработке отчетов и обработок в 1С часто возникает задача отфильтровать документы по дополнительным реквизитам (созданным в режиме «1С:Предприятие» через механизм БСП). Однако при попытке обратиться к такому реквизиту через точку (например, Продажи.Регистратор.Удержан) платформа выдает ошибку «Поле не найдено». Разберем по шагам, почему возникает эта ошибка и как правильно реализовать отбор в запросе или в Системе компоновки данных (СКД).
Проанализируем структуру хранения данных в 1С. Попытка обратиться к доп. реквизиту «через точку» не работает по двум основным причинам:
Регистратор в регистрах накопления или сведений представляет собой ссылочный тип составной структуры. Платформа 1С не позволяет обращаться к реквизитам или табличным частям составного поля без предварительного использования оператора ВЫРАЗИТЬ.ДополнительныеРеквизиты конкретного документа, где присутствуют колонки Свойство (ссылка на план видов характеристик) и Значение.Рассмотрим вариант, когда необходимо наложить фильтр непосредственно в тексте SQL-запроса. Для этого требуется соединить таблицу регистра с табличными частями ДополнительныеРеквизиты соответствующих документов.
Если в выборке участвует несколько видов документов (например, ЗаказПокупателя и РасходнаяНакладная), наиболее эффективным решением с точки зрения производительности СУБД будет разделение выборки на отдельные ветки с последующим объединением.
Посмотрим на пример построения такого запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Продажи.Ответственный КАК Ответственный,
СУММА(ЕСТЬNULL(Продажи.Сумма - Продажи.Себестоимость, 0)) КАК СуммаПродаж
ИЗ
РегистрНакопления.Продажи КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.ДополнительныеРеквизиты КАК ЗаказДопРеквизиты
ПО ЗаказДопРеквизиты.Ссылка = ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя)
И ЗаказДопРеквизиты.Свойство = &СвойствоУдержан
И ЗаказДопРеквизиты.Значение = ИСТИНА
ГДЕ
Продажи.Сумма >= 0
И Продажи.Ответственный = &Сотрудник
И Продажи.Номенклатура.КатегорияНоменклатуры = &КатегорияНоменклатуры
И РАЗНОСТЬДАТ(Продажи.Регистратор.Дата, &КонецПериода, ДЕНЬ) >= 185
СГРУППИРОВАТЬ ПО
Продажи.Ответственный
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Продажи.Ответственный,
СУММА(ЕСТЬNULL(Продажи.Сумма - Продажи.Себестоимость, 0))
ИЗ
РегистрНакопления.Продажи КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.ДополнительныеРеквизиты КАК НакладнаяДопРеквизиты
ПО НакладнаяДопРеквизиты.Ссылка = ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РасходнаяНакладная)
И НакладнаяДопРеквизиты.Свойство = &СвойствоУдержан
И НакладнаяДопРеквизиты.Значение = ИСТИНА
ГДЕ
Продажи.Сумма >= 0
И Продажи.Ответственный = &Сотрудник
И Продажи.Номенклатура.КатегорияНоменклатуры = &КатегорияНоменклатуры
И РАЗНОСТЬДАТ(Продажи.Регистратор.Дата, &КонецПериода, ДЕНЬ) >= 185
СГРУППИРОВАТЬ ПО
Продажи.Ответственный
В данном примере параметр &СвойствоУдержан должен содержать ссылку на элемент ПВХ ДополнительныеРеквизитыИСведения, соответствующий свойству «Удержан». Использование ссылки вместо проверки наименования через строку (Свойство.Наименование = "Удержан") предотвращает ошибки при переименовании реквизита пользователем.
Если отчет разрабатывается с использованием Системы компоновки данных, писать сложные соединения вручную вовсе не обязательно. Платформа 1С умеет автоматически подключать табличные части доп. реквизитов через механизм Характеристики.
Разберем по шагам порядок настройки СКД:
ДокументСсылка.ЗаказПокупателя (и отдельную строку для ДокументСсылка.РасходнаяНакладная).ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Ссылка.Наименование.Документ.ЗаказПокупателя.ДополнительныеРеквизиты.Ссылка.Свойство.Значение.После сохранения этой настройки платформа автоматически свяжет свойства с документами. В настройках отбора СКД появится возможность обращаться к полю вида: Регистратор.[ИмяДопРеквизита]. Система самостоятельно сгенерирует необходимый SQL-запрос с правильными соединениями таблиц, что значительно упростит исходный текст запроса.