пятница, 23 октября 2015 г.

1С: Эксперт. Решение билета №4

Вопрос 4.1.  Обработчик проведения содержит следующий фрагмент. Укажите на неоптимальности.

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

Запрос.УстановитьПараметр("ДокументСсылка", ТекущийДокумент);
Запрос.УстановитьПараметр("Склад", СпрСклады.НайтиПоНаименованию("Основной"));
ВыборкаОстатков = Запрос.Выполнить().Выбрать();

Пока (ВыборкаОстатков.Следующий()) Цикл    
     // Запрос к лимитам
     Запрос.Текст = "ВЫБРАТЬ Лимиты.Лимит КАК Лимит
     |ИЗ РегистрСведений.Лимиты КАК Лимиты
     |ГДЕ Лимиты.Номенклатура = &Номенклатура";
   
     Запрос.УстановитьПараметр("Номенклатура", ВыборкаОстатков.Номенклатура);
     ВыборкаЛимитов = Запрос.Выполнить().Выбрать();
     ВыборкаЛимитов.Следующий();
   
     // Остаток по товару после списания, должен быть больше установленного лимита
     Если (ВыборкаОстатков.Остаток - ВыборкаОстатков.Количество < ВыборкаЛимитов.Лимит) Тогда
          Сообщить ("Документ не проведен, превышен лимит!");
          Отказ = Истина;
     КонецЕсли;    

КонецЦикла;

Ответ:
1) Условие по складу перенести в  параметры вирт. таблицы
2) Запрос в цикле. Лимиты нужно получать в самом запросе.
3) Соединение с вирт. таблицей. Оптимальнее вирт. таблицу предварительно поместить во ВТ.

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

Комментариев нет:

Отправить комментарий