Книга знаний

1С:Предприятие / v8 / Приемы программирования / OLE, COM

v8: Охота на Com-ов

Оптимизация работы с COMАвтор статьи: H A D G E H O G s | Редакторы:
Последняя редакция №2 от 25.06.08 | История
URL: http://kb.mista.ru/article.php?id=678

Ключевые слова: COM


Часть первая. Жажда скорости.

Глава первая. Широкозакрытые глаза.


Чтение. Начнем с очевидных вещей. Первым шагом для существенного повышения скорости работы чтения через Внешнее Соединение считаю полный отказ от использования выборок/ссылок внешней базы.
Про конструкции вида
Выборка=V8.Справочники.Склады.Выбрать();
Пока Выборка.Следующий() Цикл
КонецЦикла;

советую вспоминать только в страшных ночных кошмарах. Ибо при обращении к любому реквизиту, не принадлежащему к основным данным объекта произойдет чтение всех реквизитов объекта. Если мы попытаемся получить реквизит основных данных - то произойдет чтение только основных данных, что тоже не хорошо. Использование же запроса позволит читать только то, что вам действительно нужно. Скажем так:
Запрос=V8.NewObject("Запрос");
Запрос.Текст=
"ВЫБРАТЬ
|    Склады.Код,
|    Склады.Наименование,
|    Склады.ВидСклада.Порядок
|ИЗ
|    Справочник.Склады КАК Склады";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл

КонецЦикла;

позволит вам прочесть только то, что нужно... Также хочу вам сказать, что просто забудьте о таких запросах, как:
Запрос=Бухгалтерия.NewObject("Запрос");
Запрос.Текст=
"ВЫБРАТЬ
|    Склады.Ссылка, //Вот здесь оно, это поле
|    Склады.Код,
|    Склады.Наименование,
|    Склады.ВидСклада.Порядок
|ИЗ
|    Справочник.Склады КАК Склады";
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл

КонецЦикла;

ибо ссылка на объект внешней базу в локальной базе БЕСПОЛЕЗНА (в большинстве случаев). Наличие этой ссылки может приводить к конструкции вида:
Пока Выборка.Следующий() Цикл
НашОбъект=ПоискПоКоду(Выборка.Ссылка.Код);
КонецЦикла;

которая циклично читает объект, а значит сводит на нет весь смысл использование запроса. Поверьте моему опыту, вы этого и не заметите, пока вам бухгалтер не скажет, что - же так долго выгрузка ползет...
Также не рекомендую использовать конструкцию вида:
Пока Выборка.Следующий() Цикл
Сообщить("Производится выгрузка склада "+V8.String(Выборка.Ссылка));
КонецЦикла;

И хотя данный код меннее критичен (считываются только основные данные объекта), лучше использовать функцию ПРЕДСТАВЛЕНИЕ()/ПРЕДСТАВЛЕНИЕССЫЛКИ() в запросе, или на крайняк Наименование вытащите. Есть и еще одна причина, о которой расскажу чуть позже.
Хочу отметить, что указанные особенности справедливы не только для Внешнего Соединения, но и для локальных баз. Не пренебрегайте ими. Дабы не быть голословным, приведу тесты на скорость/выносливость/быстроту в таблице1.

Выборка
Время выборки 10000 элементов в секундах
Тип соединения
Запрос

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика