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

12.08.25

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

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

Файлы

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

Наименование Скачано Купить файл
Проверка запросов
.epf 19,67Kb
18 2 450 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

 

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

 

 

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

 

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

 

 

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

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

 

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

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

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

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

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

 

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

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

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

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

 

 

 

Настройки:

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    208632    1143    413    

1039

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

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

8400 руб.

20.08.2024    38221    215    111    

203

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

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

16000 руб.

10.11.2023    17566    75    39    

92

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

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    25198    65    30    

95

Инструментарий разработчика Программист 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

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

9500 руб.

17.05.2024    36198    131    53    

175

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

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше.<br/> Далее в публикации:<br/> MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

9900 руб.

25.08.2025    1398    4    7    

10

Инструментарий разработчика 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    3208    7    0    

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

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

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


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

Цитирую.

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

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

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

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

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

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

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

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