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

Оптимизация запроса получения данных

Автор Алексей_1985_06, 02 мая 2024, 20:56

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

Алексей_1985_06

Уважаемые программисты, прошу квалифицированной помощи в построении запроса!
Суть такова:
1. Есть документ "СообщениеОНеисправности" в который заносится целая куча данных: дата обнаружения, описание дефекта, статус объекта (исправен, неисправен), объект эксплуатации который неисправвен (ссылка на справочник "Объекты эксплуатации") и еще куча всего (см.скрин)

2. Создал подчиненный этому документу, периодический РС "РегистрацияНеисправности" (см.скрин):
Ресурс: СтатусИзделия
Измерения: ОбъектЭксплуатации

3. Стоит задача формирования печатной формы (см. скрин) в которую я помещаю данные из РС, в том числе: часть данных из документа-регистратора (регистрация неисправностей), часть данных из объекта эксплуатации.
Сейчас запрос построен "через точку", и это говорят "очень плохо...". Запросы только изучаю...дилетант  :^454^:
Прошу помощи! Может совсем и не так, я все это сделал?

&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
КонецПроцедуры

// Пример запроса. Помогите сделать правильно и оптимально с точки зрения работы платформы!
   &НаСервере
Процедура СформироватьНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РН.ОбъектЭксплуатации КАК НаименованиеОбъекта,   
| РН.Регистратор КАК ДокументРегистрации,
| РН.СтатусИзделия КАК СтатусОбъекта,

// Получение данных объекта эксплуатации
| РН.ОбъектЭксплуатации.Индекс КАК ИндексОбъекта,
| РН.ОбъектЭксплуатации.ЗаводскойНомер КАК ЗаводскойНомерОбъекта,
| РН.ОбъектЭксплуатации.ДатаИзготовления КАК ДатаИзготовленияОбъекта,

// Получение данных системы - объект входит в систему/комплекс (поле Родитель)
|ВЫБОР
    | КОГДА РН.ОбъектЭксплуатации.Родитель.Индекс = ""
    |    ТОГДА ""нет номера""
    |    ИНАЧЕ РН.ОбъектЭксплуатации.Родитель.Индекс
| КОНЕЦ КАК ИндексСистемы,

| РН.ОбъектЭксплуатации.Родитель.ЗаводскойНомер КАК ЗаводскойНомерСистемы
|ИЗ
| РегистрСведений.РегистрацияНеисправности КАК РН";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
//

КонецЦикла;

КонецПроцедуры

LexaK

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

и по оформлению
1.это плохая практика давать другие алиасы реквизитам, Когда запрос будет сложным, вы сами запутаетесь в новых именах
|    РН.ОбъектЭксплуатации КАК НаименованиеОбъекта,   
|    РН.Регистратор КАК ДокументРегистрации,
|    РН.СтатусИзделия КАК СтатусОбъекта,

РН - это регистрНакопления
РС - это РегистрСведений

всегда старайтесь проверять свои запросы в консоли запросов
1.кучу ошибок поймаете и отладите
2.замер производительности (время выполнения) помогут в оптимизации запроса
3.при соединениях в запросе (явных и не явных через точку) всегда учитывайте возможность получения значения - Null
а оно обрабатывается особым образом, у вас в запросе этого нет.
     
если помогло нажмите: Спасибо!

fruitella

А что тут оптимизировать, данные из одного регистра вытаскиваешь? Вот если бы ты наклеил 15 таблиц с разной выборкой или из разных объектов метаданных, то может быть и потребовалось оптимизация, при условии что там есть кривизна. А так тут все окей, через точку обращаться можно, просто ты прочитаешь все реквизиты, которые входят в коллекцию той иерархии реквизита.
Поверь прочитать даже 100 тыс. записей для базы это пшык, это как счелчок пальцев. Вот когда начнешь писать сложные запросы на 30+ пакетов, вот тогда может и потребуется вмешательство.

Алексей_1985_06

LexaK, Большое спасибо что откликнулись! Можете подсказать (помочь) как сделать запись ("Эта система верхнего уровня") в том случае, если СправочникОбъектыЭксплуатации.Ссылка.Родитель = Пустая ссылка: Справочник.ОбъектыЭксплуатации> и проверить на пустые строки если СправочникОбъектыЭксплуатации.Ссылка.Родитель <> Пустая ссылка: Справочник.ОбъектыЭксплуатации>

Такой запрос написал, не знаю правильно или нет, если не Вас не затруднит, помогите довести до ума....
ВЫБРАТЬ
    РегистрацияНеисправности.ОбъектЭксплуатации КАК ОбъектЭксплуатации,
    РегистрацияНеисправности.Период КАК Период
    ПОМЕСТИТЬ ОбъектыЭкслуатации_ВТ
    ИЗ
    РегистрСведений.РегистрацияНеисправности КАК РегистрацияНеисправности
ГДЕ
    РегистрацияНеисправности.ВидПроводимыхРабот = &ВидПроводимыхРабот
    И РегистрацияНеисправности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания 
    ;

// Получение значений объекта эксплуатации   
ВЫБРАТЬ
    СправочникОбъектыЭксплуатации.Ссылка КАК Объект,
   
    ВЫБОР КОГДА СправочникОбъектыЭксплуатации.Индекс = ""
        ТОГДА "нет номера"
            ИНАЧЕ СправочникОбъектыЭксплуатации.Индекс
                КОНЕЦ КАК ИндексОбъекта,
   
      ВЫБОР КОГДА СправочникОбъектыЭксплуатации.ЗаводскойНомер = ""
        ТОГДА "нет номера"
            ИНАЧЕ СправочникОбъектыЭксплуатации.ЗаводскойНомер
                КОНЕЦ КАК ЗавНомерОбъекта,
   
    ВЫБОР КОГДА СправочникОбъектыЭксплуатации.ДатаИзготовления = ДАТАВРЕМЯ(1, 1, 1)
        ТОГДА "нет даты"
            ИНАЧЕ СправочникОбъектыЭксплуатации.ДатаИзготовления
                КОНЕЦ КАК ДатаИзготовленияОбъекта,
   
 
// Получение значений ситсемы в которую входит объекта эксплуатации   
    СправочникОбъектыЭксплуатации.Ссылка.Родитель КАК Система,
    СправочникОбъектыЭксплуатации.Родитель.Индекс КАК ИндексСистемы,
    СправочникОбъектыЭксплуатации.Родитель.ЗаводскойНомер КАК ЗавНомерСистемы,
    СправочникОбъектыЭксплуатации.Родитель.ДатаИзготовления КАК ДатаИзготовленияСистемы
   
    ИЗ
    Справочник.ОбъектыЭксплуатации КАК СправочникОбъектыЭксплуатации 
    ПРАВОЕ СОЕДИНЕНИЕ  ОбъектыЭкслуатации_ВТ   
    ПО СправочникОбъектыЭксплуатации.Ссылка = ОбъектыЭкслуатации_ВТ.ОбъектЭксплуатации     


Или второй вариант:
[/code]
ВЫБРАТЬ
    ПРЕДСТАВЛЕНИЕ(РегистрацияНеисправности.ОбъектЭксплуатации.Ссылка) КАК Объект,
    РегистрацияНеисправности.ОбъектЭксплуатации.Индекс КАК ОбъектИндекс,
    РегистрацияНеисправности.ОбъектЭксплуатации.ЗаводскойНомер КАК ОбъектЗавНомер,
    РегистрацияНеисправности.ОбъектЭксплуатации.ДатаИзготовления КАК ОбъектДатаИзготовления,
    ПРЕДСТАВЛЕНИЕ(РегистрацияНеисправности.ОбъектЭксплуатации.Родитель) КАК Система,
    РегистрацияНеисправности.ОбъектЭксплуатации.Родитель.Индекс КАК СистемаИндекс,
    РегистрацияНеисправности.ОбъектЭксплуатации.Родитель.ЗаводскойНомер КАК СистемаЗавНомер,
    РегистрацияНеисправности.ОбъектЭксплуатации.Родитель.ДатаИзготовления КАК СистемаДатаИзготовления,
    РегистрацияНеисправности.Регистратор КАК Регистратор,
    РегистрацияНеисправности.Регистратор.ОписаниеДефекта КАК РегистраторОписаниеДефекта
ИЗ
    РегистрСведений.РегистрацияНеисправности КАК РегистрацияНеисправности
ГДЕ
    РегистрацияНеисправности.ВидПроводимыхРабот = &ВидПроводимыхРабот
    И РегистрацияНеисправности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
[/code]

LexaK

Алексей_1985_06, как вариант так же, и реквизиты элемента проверяете, только с учетом Nullа
пример проверки одно реквизита, по аналогии остальные сделайте
...
ЕстьNull(СправочникОбъектыЭксплуатации.Родитель.Ссылка, "Эта система верхнего уровня") КАК Система,
ВЫБОР
КОГДА ЕстьNull(СправочникОбъектыЭксплуатации.Родитель.ЗаводскойНомер, "")  = ""
ТОГДА "нет номера"
ИНАЧЕ СправочникОбъектыЭксплуатации.Родитель.ЗаводскойНомер
КОНЕЦ КАК ЗавНомерСистемы,

...
если помогло нажмите: Спасибо!

Алексей_1985_06

LexaK, Понял Вас! Большое спасибо за помощь!

Теги:

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

Рейтинг@Mail.ru

Поиск