Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 14:34

Запрос к спрвочнику, включая его табличную часть с результатами в ДеревоЗначений, оптимальнее ?

Автор oooo800, 18 сен 2020, 18:31

0 Пользователей и 1 гость просматривают эту тему.

oooo800

Самописная конфиурация на Платформе 8.3.16.1224+, Управляемые формы.

Есть справочник с табличной частью.
У некоторых элементов она может быть пустой.

Есть запрос.
Элементы им отбираются все или могут отбираться по ЛЮБОМУ из реквизитов - основных или табличной части или их любому сочетанию, по условию "И" .
Например: "Наименование" = бла-бла-бла и ТЧСвойство3ЭтогоЖеЭлемента = "зеленый" .

Программно создается ЭлементФормы с типом" ДеревоЗначений" .
Результаты работы запроса выгружаются в это ДеревоЗначений.

При этом отбор должен производиться таким образом, что:
- если у элемента пустая ТЧ, то этот элемент попадает в выборку (конечно же, при соответствии условиям) и отображается в ДеревеЗначений, как "узел" ;
- если у элемента не пустая ТЧ, но в критериях отбора ТОЛЬКО основные реквизиты, то этот элемент попадает в выборку (конечно же, при соответствии условиям) и отображается в ДеревеЗначений, как "узел" , и отображаются ВСЕ строки ТЧ, как подчиненные;
- если у элемента не пустая ТЧ, но в критериях отбора есть И реквизиты ТЧ или ТОЛЬКО реквизиты ТЧ, то этот элемент попадает в выборку (конечно же, при соответствии условиям) и отображается в ДеревеЗначений, как "узел" , и отображаются ТОЛЬКО удовлетворяющие критериям строки ТЧ, как подчиненные.

При этом, понятно, что выводятся все колонки, соответствующие основным и табличным реквизитам, только в узловых строках значения колонок, соответствующие основным реквизитам будут заполнены (в зависимости от их заполненности в справочнике) , колонки, соответствующие табличным реквизитам, конечно же будут пустыми, а в подчиненных строках все будет наоборот - при раскрытии "узла" .

Делаю, например, для отбора по Наименование и Комментарий (основные) и КодДетали и ПолноеИмяДетали (табличные) так:

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

Результат = Запрос.Выполнить();


далее, после выполнения запроса:

Если НЕ Результат.Пустой() Тогда
   Таблица = Результат.Выгрузить()
   ТаблицаТолькоОсновные = Таблица.Скопировать();
   СтрокаОсновныеРеквизиты = Перечень основных реквизитов справочника
   ТаблицаТолькоОсновные.Свернуть(СтрокаОсновныеРеквизиты);

   СтрокаТЧРеквизиты = Перечень реквизитов табличной части справочника
   ТаблицаТолькоТабЧасти = Таблица.Скопировать();
   ТаблицаТолькоТабЧасти.Свернуть(СтрокаТЧРеквизиты);

   Для Каждого Строка Из ТаблицаТолькоОсновные Цикл
      НоваяСтрокаДокументов = ДеревоРезультатов.Строки.Добавить();
      Для Каждого Колонка Из ТаблицаТолькоОсновные.Колонки Цикл
  НоваяСтрокаДокументов[Колонка.Имя] = Строка[Колонка.Имя]; // Выводим нужные строки с определенными колонками в программно созданном ДеревеЗначений
      КонецЦикла;

      Отбор = Новый Структура("Ссылка",Строка.Ссылка);

      НайденныеСтроки = Таблица.НайтиСтроки(Отбор);
      Если НайденныеСтроки.Количество() > 0 Тогда
          Для Каждого СтрокаТабЧасти ИЗ НайденныеСтроки Цикл
      Если ТаблицаТолькоТабЧасти.Колонки.Количество() > 1 Тогда
          Если ЗначениеЗаполнено(СтрокаТабЧасти.Ссылка1) Тогда
      НоваяСтрокаТабЧасти = НоваяСтрокаДокументов.Строки.Добавить();
          Для Каждого КолонкаТабЧасти Из ТаблицаТолькоТабЧасти.Колонки Цикл
      НоваяСтрокаТабЧасти[КолонкаТабЧасти.Имя] = СтрокаТабЧасти[КолонкаТабЧасти.Имя];
          КонецЦикла;
              КонецЕсли;
          КонецЕсли;
              КонецЦикла;
          КонецЕсли;
    КонецЦикла;

КонецЕсли;

Далее отображение в ДереевоЗначений.

Подскажите наиболее быстроработающй - оптимальный вариант запроса и/или постзапросной части.
Может почти все (включая пост запросную часть) возможно выполнить в запросе, а уже какую-то - малую часть - после него ?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск