Проверка запросов на лишнюю выборку и разыменование полей составного типа

09.10.24

Разработка - Инструментарий разработчика

Обработка для проверки запросов на лишние поля во временных таблицах и на разыменование ссылочных полей составного типа в отдельном запросе, выгрузке базы в xml или в запросах из СКД.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Проверка запросов
.epf 19,67Kb
14
14 Скачать (2 SM) Купить за 2 150 руб.

Что умеет обработка на текущий момент:

 

1) Проверка запроса на лишние поля во временных таблицах

 

 

То есть подсвечиваются поля, которые в текущем запросе дальше нигде не выбираются. Они могут быть использованы далее через менеджер временных таблиц или в коде при выборке через "ВыполнитьПакетСПромежуточнымиДанными", но это уже нужно проверить вручную. Если в запросе нет выборки, а только создаются временные таблицы, то данная проверка не выполняется.

 

2) Проверка на разыменование ссылочных полей составного типа

 

 

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

С одной стороны, из-за оптимизаций со стороны платформы, первый вариант может показаться излишним. Но легко может случиться такое, что сегодня только один тип содержит выбираемый реквизит, а завтра добавится ещё какой-нибудь. Поэтому добавить "ВЫРАЗИТЬ(" для такого поля может быть очень не лишним, выбирайте сами.

 

Варианты работы:

1) Одиночный запрос: запрос вводится в текстовое поле или собирается в конструкторе запроса.

2) Файлы: в поле сверху указывается путь к папке с выгрузкой базы в xml -> Нажимается кнопка обновления состава конфигурации -> Выбираются объекты для проверки -> Запускается проверка по файлам bsl выбранных объектов.

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

3) Отчёты: выбираются проверяемые отчёты и проверяются запросы из их схем СКД.

 

Результат проверки:

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

Для одиночного запроса результат будет содержать только запрос, для других вариантов будет отображена иерархия объектов, к которым относится запрос. Результат можно сохранить в файл html.

Запросы должны проверяться в той же базе, для которой они были созданы. Разыменование полей через несколько точек не проверяется. Разыменование в параметрах виртуальных таблиц пока что тоже не проверяется.

 

 

 

Настройки:

На странице с настройками можно включить/отключить нужные варианты проверок и выбрать цвет для каждой из них (в списке есть red, green и blue, но можно вписать вручную любой, который подойдёт для html и для вашего цветовосприятия).

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.329

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159346    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7757    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23419    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8500 руб.

10.11.2023    10407    36    20    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 19980 руб.

06.10.2023    15386    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3120 руб.

14.01.2013    187967    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17298    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7692    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3593 09.10.24 18:25 Сейчас в теме
Выглядит интересно, плюсик поставил.
2. ivanov660 4577 09.10.24 22:32 Сейчас в теме
1. добавьте еще проблему со вложенными запросами, чтобы предлагал вынести во временную таблицу
2. добавьте отсутствие индексов для временных таблиц в соединениях
3. киллер фитча! отсутствие индексов для полей в соединениях таблиц или в условиях (хотя бы одно поле должно быть проиндексировано)

используете схему запроса?
9. krasnov322 46 11.10.24 00:46 Сейчас в теме
(2) про п.1 и п.3 были уже мысли, попозже добавлю

работает на схеме запроса, да
12. Manoshkin 357 14.10.24 08:56 Сейчас в теме
(2) это зависит от цели обработки. если для начинающих соблюдение стандартов, то да. если для разбора непроизводительного запроса, то не факт.
уже имеющиеся функции я бы больше отнес к производительности. лишние поля, лишние таблицы, иерархию или список запросов где далее используется таблица.
бывает скопируют несколько десятков запросов, а в итоге шиш да маленько. сократишь и сразу скорость в десятки раз.
3. Vinzor 107 10.10.24 06:29 Сейчас в теме
Индексирование полей это сугубо индивидуальная вещь, зависит от количества данных таблиц. Если в них будет пара десятков строк, вы на индексацию потратите больше времени, чем на экономию от её наличия. Вот если от нескольких тысяч строк, тогда да, эффект есть
Award; Manoshkin; alex_sayan; Viktor_Ermakov; +4 Ответить
5. ivanov660 4577 10.10.24 10:27 Сейчас в теме
(3) Вы можете подтвердить это цифрами? Есть источники на основании, которых вы сделали такие выводы? Только не надо ссылаться на непонятную рекомендацию с сайта 1С.
6. Vinzor 107 10.10.24 13:50 Сейчас в теме
(5) Цифрами подтверждать не буду, мне за время, потраченное на составление примера, денег никто не заплатит.
Но в моей практике я с этим сталкивался.


Книга "Язык запросов «1С:Предприятия 8»" устроит?
Глава 4. Оптимизация запросов Индексирование таблиц Эффективное использование индексов Общие рекомендации

Цитирую.

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

Поэтому не нужно нагружать систему индексами на все случаи жизни. Во-первых, чем больше индексов в таблице, тем больше тратится времени на запись данных в эту таблицу. А во-вторых, когда индексы слишком сложные и их много, то СУБД не может подобрать среди них подходящий индекс за ограниченное время и может выбрать неоптимальный план запроса.

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

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

Не следует также создавать индексы по низкоселективным полям. Селективность индекса отражает процент записей, которые по условию можно выбрать из таблицы. Максимально высокая селективность индекса – у первичного ключа. Если реквизит имеет тип Булево, то индексировать его имеет смысл только в том случае, если незначительная часть записей таблицы всегда принимает одно значение (например, ЛОЖЬ) и нужно выбрать из таблицы записи с этим значением.

В целом к расстановке индексов в таблицах нужно подходить осмысленно, творчески и учитывать накопленный опыт, как личный, так и опыт функционирования подобных прикладных решений.
10. ivanov660 4577 11.10.24 09:09 Сейчас в теме
(6)
1.
Цифрами подтверждать не буду, мне за время, потраченное на составление примера, денег никто не заплатит.

А зачем тогда приводите свою точку зрения, если не хотите ее отстоять?
2. Вы приводите фразу экономия, а что значит экономия? В рамках одного запроса или в рамках всей базы в целом? Сколько стоит проиндексировать таблицу из 100 записей? - несколько мкс. И какую нам принесет это экономию в рамках запроса, который выполняется хотя бы десяток мс? Меньше процента? Вы будете это экономить? А откуда вы знаете что в запросе во временную таблицу будет именно 100 записей, а вдруг придет 5000?
Так что все это от лукавого
3. В документации 1С много воды и написано все обтекаемо, поэтому ненадежны источник.
3.1. Чего стоит только фраза
практически всегда использует сканирование таблицы либо сканирование кластерного

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

-Рассмотрим случай с точки зрения работы 1С. Если время выполнения , например, более запроса от 1 с, то время вставки в индекс в районе мс это просто не о чем.
-Какое ограниченное время? В сравнении с каким временем? Что значит слишком сложные? 1С не умеет использовать частичные индексы, а индекс из двух полей это не сложный (не берем служебные поля).
Почему бы не написать, что создание индекса с количеством полей больше 2х-3х в большинстве случаев избыточно и уже перестает приносить эффективность потому что...
3.3
В целом к расстановке индексов в таблицах нужно подходить осмысленно, творчески и учитывать накопленный опыт

И как хорошо они в конце концов слились, можно было оставить только одну эту фразу во всем разделе 4, связанную с индексами.
11. alex_sayan 51 14.10.24 05:00 Сейчас в теме
(10) прослушайте курс эксперта по технологическим запросам. Там расскажут, что рекомендации по оптимизации не панацея, и индексы не панацея. И почему так
14. ivanov660 4577 14.10.24 10:13 Сейчас в теме
(11) Спасибо за рекомендации, но это я и так знаю.
4. ixijixi 1913 10.10.24 10:07 Сейчас в теме
Нужная и интересная вещь, плюсанул.
7. Dimel 10.10.24 20:11 Сейчас в теме
Очень интересная разработка. Жаль что на ЗУП все отчеты из представлений собираются...
Можно расширять правила проверки.
Я бы добавил все типовые ошибки из https://its.1c.ru/db/metod8dev/content/5842/hdoc
+ Анализ на ограничение доступа к источникам и РАЗРЕШЕННЫЕ. (самая частая ошибка у нас)
8. Vinzor 107 10.10.24 22:16 Сейчас в теме
Вот с чем приходилось сталкиваться, это сложные запросы, в которых под сотню временных таблиц, и у пользователя где-то не хватает прав (RLS)
Я придумал приемлемый способ на отладке искать, в какой части запроса проблема.
Написал (очень просто) метод, который текст запроса разбивает на части (разделитель - ; (точка с запятой) ,
В каждой части ищет подстроку "ПОМЕСТИТЬ", чтобы взять имя временной таблицы.
И с применением "менеджера временных таблиц" в цикле каждая отдельная часть запроса исполняется в "Попытке".
Если "Исключение" - сообщаю имя временной таблицы.

Может мой совет кому и пригодится
mvxyz; kholkin; wonderboy; +3 Ответить
13. acces969 362 14.10.24 09:06 Сейчас в теме
(8) Постоянно таким способом оптимизирую большие тексты запросов в модулях:
1. Выделяю текст запроса в модуле
2. Ctrl+H - заменяю в блоке (не в файле) символ
;
на
;"; Запрос.Выполнить(); Запрос.Текст = "
3. Сохраняю изменения, включаю замер производительности, запускаю сеанс
4. Выполняю запрос
5. Смотрю по замеру производительности самые медленные части запроса. При необходимости тут же их отлаживаю.
6. Ctrl+H - заменяю в блоке (не в файле) изменения обратно.

Готово!
15. Vinzor 107 14.10.24 20:33 Сейчас в теме
Кому интересно. Выполнение запроса с замерами времени, в попытке, с выводом имени временной таблицы если "упал"
Для отладок
Процедура ВыполнитьСЗамерами(Запрос, Текст)
	
	Фраза = "";  Итого = 0;
	Части = СтрРазделить(Текст, ";", ложь);
	Для каждого Часть из Части Цикл
		Строки = СтрРазделить(Часть, Символы.ПС, ложь);
		Имя = "";
		Для каждого Строка из Строки Цикл
			Если СтрЧислоВхождений(Строка, "ПОМЕСТИТЬ ") > 0 ИЛИ СтрЧислоВхождений(Строка, "УНИЧТОЖИТЬ ") > 0 Тогда
				Имя = Строка;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Запрос.Текст = Часть;
		Старт = ТекущаяУниверсальнаяДатаВМиллисекундах();
		Попытка
			Запрос.Выполнить();
		Исключение
			Сообщить("Упал на " + Имя);
		КонецПопытки;
		Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
		Разница = Конец - Старт;
		Фраза = Фраза + Имя + ", за " + Разница + " миллисек." + Символы.ПС;
		Итого = Итого + Разница;
	КонецЦикла;                 
	Фраза = Фраза + "Всего за " + Итого + " миллисек.";
	
	Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = Фраза;
    Сообщение.Сообщить();
	
КонецПроцедуры
Показать
16. SerVer1C 815 16.10.24 12:13 Сейчас в теме
o_O Новый статический анализатор??
Оставьте свое сообщение