Запросный беспредел =)

1. PerlAmutor 129 21.04.17 08:09 Сейчас в теме
Есть таблица, где всего лишь 500 ссылок на различные типы объектов (30 видов документов со справочниками). Задача - определить какие из них удалены.

Запрос типа:

ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ втОбъектыСсылки КАК втОбъектыСсылки ГДЕ втОбъектыСсылки.ПометкаУдаления


Вешает консоль запросов намертво. Ждал час, не дождался результатов.

Запрос типа:

ВЫБРАТЬ ПЕРВЫЕ 1
	ВЫБОР КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.ВнутреннееПотреблениеТоваров ТОГДА
		ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.ВнутреннееПотреблениеТоваров)
    КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.СписаниеИзЭксплуатации ТОГДА
    	ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.СписаниеИзЭксплуатации)
	КОНЕЦ КАК Ссылка
ИЗ втОбъектыСсылки КАК втОбъектыСсылки
ГДЕ
     втОбъектыСсылки.Ссылка.ПометкаУдаления
Показать


Аналогично вешается намертво, хотя и рекомендуется 1С для работы с составными типами данных типичные ошибки составления запросов

И только такая монстроуозная конструкция выполняется моментально:

ВЫБРАТЬ
	ВЫБОР КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.ВнутреннееПотреблениеТоваров ТОГДА
		ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.ВнутреннееПотреблениеТоваров)
    КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.СписаниеИзЭксплуатации ТОГДА
    	ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.СписаниеИзЭксплуатации)
	КОНЕЦ КАК Ссылка
ПОМЕСТИТЬ втУдаленные
ИЗ
	втОбъектыСсылки КАК втОбъектыСсылки
ГДЕ
	ВЫБОР КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.ВнутреннееПотреблениеТоваров ТОГДА
		ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.ВнутреннееПотреблениеТоваров).ПометкаУдаления
    КОГДА втОбъектыСсылки.ОбъектСсылка Ссылка Документ.СписаниеИзЭксплуатации ТОГДА
    	ВЫРАЗИТЬ(втОбъектыСсылки.ОбъектСсылка КАК Документ.СписаниеИзЭксплуатации).ПометкаУдаления
	КОНЕЦ;
Показать


Через применение ТИПЗНАЧЕНИЯ и группировки я могу получить все ТИПЫ объектов данных в таблице, но извините меня, я не могу эту информацию никак применить в запросе, чтобы не прописывать 30 конструкций "ВЫБОР КОГДА". Единственный выход - писать обработку с циклом, где запрос к базе данных будет создаваться динамически. Почему 1С не может это делать за кадром автоматически, парадоксально...
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. collider 21.04.17 08:14 Сейчас в теме
(1) втОбъектыСсылки составного типа. Обращение к таким через точку всегда было и будет медленным.
https://its.1c.ru/db/metod8dev#content:5842:hdoc:dot_after_component_type
3. TODD22 18 21.04.17 08:27 Сейчас в теме
Это можно сделать через ОБЪЕДИНЕНИЕ. Первым выбрать документы одного типа, потом второго и тд. И объединить их.
h00k; Ганс; alex-l19041; karpik666; +4 Ответить
4. ipoloskov 162 21.04.17 09:09 Сейчас в теме
Какая платформа и СУБД? Обновление статистики не пробовали делать?
5. karpik666 3775 21.04.17 09:14 Сейчас в теме
По моему это к тому вопросу, почему 1С не внедрит полноценный SQL в конструктор запроса, думаю развитие конструктора запроса мы увидим только в 9 версии платформы.
11. h00k 50 23.04.17 12:48 Сейчас в теме
(5)
это к тому вопросу, почему 1С не внедрит полноценный SQL в конструктор запроса

Вот на таком простом примере у разработчиков уже возникают вопросы. Даже не смотря на то, что особенности работы с составными типами "разжёваны" и на ИТС, и в куче статей на инфостарте, и на всяких там курсах по 1С. Соответственно, с "полноценным" SQL, проблем будет ещё больше и как минимум половина "армии программистов 1С" останется не удел, так-как не сможет составить работающий запрос.

Кстати, "полноценный" SQL под каждую СУБД реализовывать или ограничится реализацией диалекта SQL от майкрософт, "забив" на другие СУБД? Как насчёт "совместимость" и "переносимость" конфигураций, полностью убрать из описания возможностей платформы?

Да, и ещё, возникнет интересный вопрос с неявными запросами типа "СтруктураПредприятия.ГрафикРаботы" - с ними как поступить?

П.С.: Когда-то давно, простая работа с запросами была одним из явных преимуществ платформы 1С. Сейчас конкуренты тоже начали "подтягиваться". Предложение взять и перечеркнуть все многолетние наработки звучит как-то странно, на мой взгляд.
6. Plash 4 21.04.17 09:21 Сейчас в теме

Как работает ИНДЕКСИРОВАТЬ ПО?
Индексация в запросе нужна для более быстрого формирования результате запроса. Как это работает? Система строит индекс для временной таблицы, что бы быстрее найти нужное значение.
Т.е система работает точно также, как и обычные индексы 1С, только для временной таблицы.
Где и как нужно использовать ИНДЕКСИРОВАТЬ ПО ?
Конструкцию рекомендуется использовать по полям временных таблиц, по которым эта временная таблица будет соединяться с другими таблицами баз данных. Это существенно повышает скорость выполнения соединения таблиц.
Однако, следует учесть один момент. Построение индекса временной таблицы так же требует времени на выполнение. Поэтому целесообразно использовать конструкцию «ИНДЕКСИРОВАТЬ ПО», только если вы знаете, что во временной таблице будет не 1-2 записи. В противном случае эффект может быть обратным — быстродействие от индексированных полей не компенсирует времени построения индекса.
7. ipoloskov 162 21.04.17 09:25 Сейчас в теме
(6)
только если вы знаете, что во временной таблице будет не 1-2 записи

Александр Морозов говорил даже более радикально, "если во временной таблице больше 100.000 записей"
12. h00k 50 23.04.17 12:54 Сейчас в теме
(7)
"если во временной таблице больше 100.000 записей"

Или работать с ней необходимо более чем из одного запроса. Это уже тот самый случай, когда нужно смотреть "по месту", анализируя время выполнения и планы запросов.
В большинстве же случаев индексация избыточна.
8. PerlAmutor 129 23.04.17 10:53 Сейчас в теме
(6) во временной таблице строится индекс, это не помогает вообще никак.
(3) 30 объединений, будет весело писать...
(4) 8.3.7.2027, MSSQL 2012. Обновление статистики на SQL сервере? Сомневаюсь, что кто-то делал...
9. VmvLer 23.04.17 11:59 Сейчас в теме
1. замените условие

ГДЕ
втОбъектыСсылки.Ссылка.ПометкаУдаления

на

ГДЕ
втОбъектыСсылки.ПометкаУдаления

поместив во временную поле ПометкаУдаления сразу

2. СУБД будет делать соединения со всеми 30-ю таблицами. Может имеет смысл сделать это за нее тоже сразу

ВЫБРАТЬ ПЕРВЫЕ 1
	втОбъектыСсылки.ОбъектСсылка КАК СсылкаП
ИЗ втОбъектыСсылки КАК втОбъектыСсылки
	ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
	    ПО втОбъектыСсылки.ПометкаУдаления = ВнутреннееПотреблениеТоваров.ПометкаУдаления
	ЛЕВОЕ СОЕДИНЕНИЕ Документ.СписаниеИзЭксплуатации КАК СписаниеИзЭксплуатации
	    ПО втОбъектыСсылки.ПометкаУдаления = СписаниеИзЭксплуатации.ПометкаУдаления
dmpas; h00k; +2 Ответить
10. Сурикат 394 23.04.17 12:45 Сейчас в теме
А ради спортивного интереса не смотрели план запроса?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот