v8: Охота на Com-ов Ключевые слова: COM
Часть первая. Жажда скорости.Глава первая. Широкозакрытые глаза.
Чтение. Начнем с очевидных вещей. Первым шагом для существенного повышения скорости работы чтения через Внешнее Соединение считаю полный отказ от использования выборок/ссылок внешней базы.
Про конструкции вида
Выборка=V8.Справочники.Склады.Выбрать();
Пока Выборка.Следующий() Цикл
КонецЦикла;
советую вспоминать только в страшных ночных кошмарах. Ибо при обращении к любому реквизиту, не принадлежащему к основным данным объекта произойдет чтение всех реквизитов объекта. Если мы попытаемся получить реквизит основных данных - то произойдет чтение только основных данных, что тоже не хорошо. Использование же запроса позволит читать только то, что вам действительно нужно. Скажем так:
Запрос=V8.NewObject("Запрос");
Запрос.Текст=
"ВЫБРАТЬ
| Склады.Код,
| Склады.Наименование,
| Склады.ВидСклада.Порядок
|ИЗ
| Справочник.Склады КАК Склады";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КонецЦикла;
позволит вам прочесть только то, что нужно... Также хочу вам сказать, что просто забудьте о таких запросах, как:
Запрос=Бухгалтерия.NewObject("Запрос");
Запрос.Текст=
"ВЫБРАТЬ
| Склады.Ссылка, //Вот здесь оно, это поле
| Склады.Код,
| Склады.Наименование,
| Склады.ВидСклада.Порядок
|ИЗ
| Справочник.Склады КАК Склады";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КонецЦикла;
ибо ссылка на объект внешней базу в локальной базе БЕСПОЛЕЗНА (в большинстве случаев). Наличие этой ссылки может приводить к конструкции вида:
Пока Выборка.Следующий() Цикл
НашОбъект=ПоискПоКоду(Выборка.Ссылка.Код);
КонецЦикла;
которая циклично читает объект, а значит сводит на нет весь смысл использование запроса. Поверьте моему опыту, вы этого и не заметите, пока вам бухгалтер не скажет, что - же так долго выгрузка ползет...
Также не рекомендую использовать конструкцию вида:
Пока Выборка.Следующий() Цикл
Сообщить("Производится выгрузка склада "+V8.String(Выборка.Ссылка));
КонецЦикла;
И хотя данный код меннее критичен (считываются только основные данные объекта), лучше использовать функцию ПРЕДСТАВЛЕНИЕ()/ПРЕДСТАВЛЕНИЕССЫЛКИ() в запросе, или на крайняк Наименование вытащите. Есть и еще одна причина, о которой расскажу чуть позже.
Хочу отметить, что указанные особенности справедливы не только для Внешнего Соединения, но и для локальных баз. Не пренебрегайте ими. Дабы не быть голословным, приведу тесты на скорость/выносливость/быстроту в таблице1.
Время выборки 10000 элементов в секундах | Тип соединения | | Выборка Запрос |
|