Как в запросе 1С отобрать данные по значению дополнительного реквизита?

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

При разработке отчетов или обработок в 1С часто возникает задача отфильтровать выборку по значению дополнительного реквизита, который был добавлен пользователем через механизм свойств БСП (Библиотеки стандартных подсистем). Рассмотрим, как правильно и эффективно реализовать такой отбор в запросе.

Понимание архитектуры хранения дополнительных реквизитов

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

Поэтому простая выборка через «точку» может работать медленно или быть невозможной из-за особенностей составных типов данных в поле Значение.

Способ 1: Прямое соединение в запросе

Если объем данных небольшой, мы можем присоединить таблицу дополнительных реквизитов непосредственно в основном запросе. Рассмотрим пример того, как это сделать:


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

Важное примечание: При таком подходе обязательно указывайте Свойство в условии ГДЕ, чтобы отсечь лишние записи других реквизитов, так как табличная часть хранит все свойства объекта в одной куче.

Способ 2: Использование временных таблиц (Оптимальный для производительности)

Если отчет строится по большому массиву данных, прямое соединение табличных частей может привести к существенному замедлению работы системы. В этом случае мы рекомендуем использовать временные таблицы:

  1. Сначала выберите все Ссылка из справочника СоглашенияСКлиентами, у которых нужный реквизит равен заданному значению, и поместите их во временную таблицу.
  2. Проиндексируйте поле Ссылка во временной таблице.
  3. Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ этой временной таблицы с вашим основным запросом (например, к РегистрНакопления).

Это позволит СУБД работать с гораздо меньшим объемом записей при построении итогового результата.

Способ 3: Механизм характеристик в СКД

Если вы разрабатываете отчет на базе Система Компоновки Данных (СКД), то жестко прописывать отбор в тексте запроса не всегда целесообразно. В СКД существует встроенный механизм Характеристики:

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

Рекомендации по реализации

Подводя итоги, разберем ключевые правила работы с дополнительными реквизитами:

Теперь вы можете выбрать наиболее подходящий метод исходя из сложности вашего отчета и объема данных в системе. Начните с простых соединений, а при обнаружении проблем со скоростью — смело переходите на временные таблицы.

← На главную