Технология клиент-сервер учит избегать передачи больших объемов данных между клиентом и сервером. Предполагается, что клиент должен отправлять на сервер короткий запрос, и получать в ответ строго необходимые данные. Поэтому необходимо оговорить, что предлагаемый способ выходит за рамки данной технологии и рекомендуется к использованию, в тех случаях, когда передачи больших объемов данных с сервера на клиент избежать не удается.
При работе обычным способом, если запрос выбирает, например, пару сотен тысяч записей за пять секунд (время можно уточнить с помощью консоли запросов), то последующая сериализация, передача на клиент и десереализация, может достигать нескольких минут. Именно это составляет основные временные затраты на заполнение таблиц на формах и формирование отчетов. Рассмотрим, как будет выглядеть работа при использовании COM-соединения.
Как известно, объект "Запрос" не существует на клиенте, однако мы можем получить его COM-отбражение:
// Создаём соединение
COMConnector = Новый COMОбъект("V83.COMConnector");
Сединение = COMConnector.Connect(СтрокаСоединения);
// Получаем COM-объект "Запрос"
Запрос = Сединение.NewObject("Запрос");
Здесь "Запрос" - это COM-объект, однако с ним можно производить все теже манипуляции, что и с обычным "Запросом":
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
Выполнение последней строки происходит относительно быстро, практически также быстро, как и обычное выполнение запроса на сервере. В результате мы получаем COM-объект "РезультатЗапроса", из которого можно получить выборку. Обратите внимание, всё это проиходит на клиенте.
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
. . .
// Делаем все, что нам нужно
. . .
КонецЦикла;
Как показала практика, такой обход запроса работает гораздо быстрее, чем обход запроса на сервере с заполнением какой-нибудь коллекции и передачей этой коллекции на клиента, будь это хоть массив, хоть табличный документ. Я не стал делать замеры, так как результаты могут сильно различасться в различных условиях. В моём случае удалось достичь сокращения времени примерно в 3-5 раз. И это несмотря, что все операции производятся над COM-объектами. Я не могу точно сказать, почему так происходит. Возможно это из-за того, что используется один цикл и для извлечения данных из СУБД, и для их обработки, а не два, как в случае заполнения коллекции на сервере и передачи её на клиент (сериализацию/десереализацию можно принять за циклы). Может быть потому что сериализация/десереализация средствами системы при работе серез COM работает быстрее, чем средствами 1C при обмене сервера и клиента. А может и то, и другое
Естественно, мы можем передавать таким образом только данные примитивных типов, то есть Число, Строка, Дата и Булево. Ну а что еще нам приходится передавать на клиент, когда мы работаем обычным способом? Ссылки? Но что такое ссылка на клиенте? Так, только представление, по сути-то. Если вдруг потребуется использовать ссылку именно как ссылку, т. е. запомнить, чтобы потом передать на сервер и как-то использовать, то в этом случае мы можем оперировать строками-уникальными идентификаторами:
Ссылка = Соединение.XMLСтрока(Выборка.Ссылка);
После передачи такой строки на сервер восстановить ссылку не составит никакого труда.
В любом случае, использование COM-соединения для работы с данными на клиенте, может оказаться полезным инструментом для решения разнообразных задач. И возможно, передача результата запроса на клиент это - лишь один из примеров подобного использования.
В заключении хочу предложить в качестве примера обработку, использующую подобную методику: Общий журнал (COM). Функционал данного журнала весьма прост, но позволяет оценить возможность работы с результатом запроса на клиенте серез COM.