Skip to content

[NEW] Обращение через точку к полям ссылочных реквизитов временной таблицы #2792

@agibalovsa

Description

@agibalovsa

Описание проблемы, ошибки, которую надо диагностировать

Когда описывается временная таблица, правильно в ней описать все поля, которые понадобятся для работы в запросе. Очень часто люди во временной таблице описывают минимальное количество полей, а ко всем остальным обращаются через точку, в других запросах. Это приводит к следующим последствиям:

  1. В запросе замыливается его логика. Правильно получать данные блоками. Именовать эти блоки. Далее этими блоками необходимо оперировать. На деле же люди воспринимают выполнение запросов как выполнение кода, и данные получают не сразу, а по ходу.
  2. Последствиями пункта (1) являются следующие возможные неприятности:
  • не корректно устанавливаются фильтры, выбираются избыточные данные;
  • не правильно создаются индексы для временных таблиц;
  • возможные неоптимальные планы запросов, из-за скрытых соединений в условиях соединения;
  • возрастает нагрузка на сервер СУБД, т.к. данные получаются по ходу выполнения пакета запроса и происходят обращения к одним и тем же таблицам по несколько раз.

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

Нет.

Параметры диагностики

Тип Статья на русском

  • 🐜 Ошибка
  • 👮 Уязвимость
  • 💂‍♂️ Потенциальная уязвимость
  • 💩 Качество кода
  • :trollface: Другое

Важность Статья на русском

  • 💔 Блокирующая / Blocker
  • ❤️ Критическая / Critical
  • 💛 Важная / Major
  • 💙 Незначительная / Minor
  • 💚 Информационная / Info
  • 💞 Другое

Тэги Статья на русском

  • STANDARD - "Нарушение стандартов 1С"
  • LOCKINOS - "Не будет работать в другой ОС"
  • SQL - "Проблема с запросом"
  • PERFORMANCE - "Проблема производительности"
  • BRAINOVERLOAD - "Непонятный код"
  • BADPRACTICE - "Плохая практика программирования"
  • CLUMSY - "Излишние действия"
  • DESIGN - "Ошибка в проектировании"
  • SUSPICIOUS - "Подозрительный код"
  • UNPREDICTABLE - "Непредсказуемо работающий код"
  • DEPRECATED - "Устаревшая функциональность"
  • ERROR - "Ошибочная конструкция"
  • LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

15

Дополнительная информация

Пример:

ВЫБРАТЬ
	ЗаказКлиентаТовары.Ссылка КАК ЗаказКлиента,
	ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
	ЗаказКлиентаТовары.Характеристика КАК Характеристика,
	ЗаказКлиентаТовары.Цена КАК Цена,
	ЗаказКлиентаТовары.Упаковка КАК Упаковка
ПОМЕСТИТЬ ВТ_ТоварыЗаказов
ИЗ
	Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
	ЗаказКлиентаТовары.Ссылка В(&Заказы)

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	Характеристика,
	Упаковка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
	ЦеныНоменклатурыСрезПоследних.Упаковка КАК Упаковка
ПОМЕСТИТЬ ВТ_МаксимальныеЦены
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
			,
			(Номенклатура, Характеристика) В
				(ВЫБРАТЬ
					ВТ_ТоварыЗаказов.Номенклатура КАК Номенклатура,
					ВТ_ТоварыЗаказов.Характеристика КАК Характеристика
				ИЗ
					ВТ_ТоварыЗаказов КАК ВТ_ТоварыЗаказов)) КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
	ЦеныНоменклатурыСрезПоследних.ВидЦены = &МаксимальнаяЦена

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	Характеристика,
	Валюта,
	Упаковка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_ТоварыЗаказов.ЗаказКлиента КАК ЗаказКлиента,
	ВТ_ТоварыЗаказов.ЗаказКлиента.Партнер КАК Партнер,
        ВТ_ТоварыЗаказов.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры ,
	ВТ_ТоварыЗаказов.Номенклатура КАК Номенклатура,
	ВТ_ТоварыЗаказов.Характеристика КАК Характеристика,
	ВТ_ТоварыЗаказов.Цена > ВТ_МаксимальныеЦены.Цена КАК ПревышенаМаксимальнаяЦена
ИЗ
	ВТ_ТоварыЗаказов КАК ВТ_ТоварыЗаказов
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_МаксимальныеЦены КАК ВТ_МаксимальныеЦены
		ПО ВТ_ТоварыЗаказов.Номенклатура = ВТ_МаксимальныеЦены.Номенклатура
			И ВТ_ТоварыЗаказов.Характеристика = ВТ_МаксимальныеЦены.Характеристика
			И ВТ_ТоварыЗаказов.ЗаказКлиента.Валюта = ВТ_МаксимальныеЦены.Валюта
			И ВТ_ТоварыЗаказов.Упаковка = ВТ_МаксимальныеЦены.Упаковка
ГДЕ
	ВТ_ТоварыЗаказов.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры 

Проверка должна сообщить:

  1. соединение "ВТ_ТоварыЗаказов.ЗаказКлиента.Валюта = ВТ_МаксимальныеЦены.Валюта" не корректно, т.к. поле "Валюта " необходимо получать во временной таблице "ВТ_ТоварыЗаказов".

    Исправив эту ситуацию. можно сделать более эффективный индекс, включив в него валюту.

  2. получение поля "ВТ_ТоварыЗаказов.ЗаказКлиента.Партнер" не корректно, его необходимо перенести во временную таблицу "ВТ_ТоварыЗаказов".

    Выполнив это условие мы сократим число обращений к таблице "ЗаказКлиента" с 2х до 1го (с условием того, если Валюту мы уже получаем во временной таблице).

  3. построен фильтр по вложенному полю из временной таблицы "ВТ_ТоварыЗаказов.Номенклатура.ВидНоменклатуры", необходимо перенести получение поля во временную таблицу "ВТ_ТоварыЗаказов", и проверить, что наложенный фильтр оптимальный

    В данном случае сразу несколько ошибок

    1. фильтр не в корректном месте, в общем случае его оптимальней перенести во временную таблицу, это будет очевидней, если и поле "ВидНоменклатуры" мы будем получать во временной таблице
    2. Если запрос будет в СКД, а поле ВидНоменклатуры мы получим в конечном запросе, то при наложении фильтра на вид номенклатуры, мы получим опять же не оптимальный фильтр, поэтому нужно либо вообще вид номенклатуры не получать в запросе, тогда СКД его наложит автоматически в первую ВТ, либо поле "ВидНоменклатуры" получать во временной таблице "ВТ_ТоварыЗаказов", тогда СКД опять же его подхватит.

Metadata

Metadata

Assignees

No one assigned

    Labels

    component/diagnosticsДоработка / создание диагностики

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions