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