Вопрос 4.1. Обработчик проведения содержит следующий фрагмент. Укажите на неоптимальности.
// Запрос к остаткам
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
| ИЗ
| Документ.Реализация.Товары КАК Товары
| ГДЕ
| Товары.Ссылка = &ДокументСсылка
| СГРУППИРОВАТЬ ПО
| Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,) КАК Остатки
| ПО Остатки.Номенклатура = Товары.Номенклатура
|ГДЕ
| Остатки.Склад = &Склад";
Запрос.УстановитьПараметр("ДокументСсылка", ТекущийДокумент);
Запрос.УстановитьПараметр("Склад", СпрСклады.НайтиПоНаименованию("Основной"));
ВыборкаОстатков = Запрос.Выполнить().Выбрать();
Пока (ВыборкаОстатков.Следующий()) Цикл
// Запрос к лимитам
Запрос.Текст = "ВЫБРАТЬ Лимиты.Лимит КАК Лимит
|ИЗ РегистрСведений.Лимиты КАК Лимиты
|ГДЕ Лимиты.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ВыборкаОстатков.Номенклатура);
ВыборкаЛимитов = Запрос.Выполнить().Выбрать();
ВыборкаЛимитов.Следующий();
// Остаток по товару после списания, должен быть больше установленного лимита
Если (ВыборкаОстатков.Остаток - ВыборкаОстатков.Количество < ВыборкаЛимитов.Лимит) Тогда
Сообщить ("Документ не проведен, превышен лимит!");
Отказ = Истина;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| (ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
| ИЗ
| Документ.Реализация.Товары КАК Товары
| ГДЕ
| Товары.Ссылка = &ДокументСсылка
| СГРУППИРОВАТЬ ПО
| Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,) КАК Остатки
| ПО Остатки.Номенклатура = Товары.Номенклатура
|ГДЕ
| Остатки.Склад = &Склад";
Запрос.УстановитьПараметр("ДокументСсылка", ТекущийДокумент);
Запрос.УстановитьПараметр("Склад", СпрСклады.НайтиПоНаименованию("Основной"));
ВыборкаОстатков = Запрос.Выполнить().Выбрать();
Пока (ВыборкаОстатков.Следующий()) Цикл
// Запрос к лимитам
Запрос.Текст = "ВЫБРАТЬ Лимиты.Лимит КАК Лимит
|ИЗ РегистрСведений.Лимиты КАК Лимиты
|ГДЕ Лимиты.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ВыборкаОстатков.Номенклатура);
ВыборкаЛимитов = Запрос.Выполнить().Выбрать();
ВыборкаЛимитов.Следующий();
// Остаток по товару после списания, должен быть больше установленного лимита
Если (ВыборкаОстатков.Остаток - ВыборкаОстатков.Количество < ВыборкаЛимитов.Лимит) Тогда
Сообщить ("Документ не проведен, превышен лимит!");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Ответ:
1) Условие по складу перенести в параметры вирт. таблицы
2) Запрос в цикле. Лимиты нужно получать в самом запросе.
3) Соединение с вирт. таблицей. Оптимальнее вирт. таблицу предварительно поместить во ВТ.
Вопрос 4.2. Имеется информационная система работающая в клиент-серверном варианте с использованием MSSQL. В системе работает большое количество пользователей, которые не получают сообщений об ошибках.
Как получить ответы на следующие вопросы:
Происходят ли ожидания на блокировках при работе пользователей?
Какое общее время система проводит в режиме ожиданий на блокировках?
Ответ:
Ответы на эти вопросы можно получить с помощью ЦУП
Происходят ли ожидания на блокировках при работе пользователей - по оперативному показателю "Среднее время ожидания на блокировках СУБД и 1С". Если значения >0 значит ожидания на блокировках есть.
Какое общее время система проводит в режиме ожиданий на блокировках? - По значению в колонке "Сумма" показателя "Суммарное время ожидания на блокировках СУБД и 1С".
Вопрос 4.3. Назовите известные Вам типичные ошибки в коде конфигурации и структуре метаданных, которые могут привести к неоптимальной работе запроса.
Дайте рекомендации по устранению ошибок
Ответ:
- Соединения с подзапросами.
- Соединения с виртуальными таблицами.
- Подзапрос в условии соединения.
- Фильтрация не в параметрах виртуальной таблицы, а на закладке условия.
- Несоответствие индекса заданным условиям.
- Ошибки при работе с полями составного типа.
- Разыменование полей.
- Запросы в цикле, кореллированные запросы.
Для п1-3 одна рекомендация - использовать временные таблицы и соединять с ВТ по проиндексированным полям.
Для п.4 требуется фильтры накладывать в параметрах виртуальных таблиц.
По п.5. существует несколько причин по которым индекс не может быть использован
1) Чтобы поиск по индексу был использован поля на которые накладываются условия должны быть в индексе без зазоров и начинаться с самого первого поля.
2) Использование логического "ИЛИ" в запросе. Следует заменить на объединения нескольких таблиц с помощью "ОБЪЕДИНИТЬ ВСЕ"
3) Арифметические выражения в условиях, функции месяц.
4) Использование операторов (Не, не В, Не подобно). Следует заменить на "ЕСТЬ NULL" в условии соединения
По п6. Есть несколько ошибок при работе с полями составного типа
1) Обращение через точку к реквизитам полей составного типа. Следует ограничить количество полей с помощью ВЫРАЗИТЬ.
2) Использование примитивных полей вместе с ссылочными в субконто.
3) Регистратор, Субконто,Последовательность -это как правило поля составного типа. Желательно например избегать таких вытягиваний как Регистратор.Дата.
4) Обращение через .Cсылка через полю ссылочного типа.
5) Использование ссылочных полей в конструкции ВЫБОР КОГДА
6) Соединения таблиц по полю составного типа.
По п7. Лучше в явном виде добавить таблицу и соединить 2 таблицы.
По п 8. Избегать неявных запросов в цикле.
Комментариев нет:
Отправить комментарий