А лисички, две сестрички,
Разыскали где-то спички.
К 1С-ке подошли,
1С-ку подожгди.
К.Чуковстий, как оно было
на самом деле...
Описание проблемы:
Узким местом работы с ADO в 1С: Предприятие является преобразование результата запроса (объекта ADODB.RecordSet)
к удобному для работы в коде 1С типу (объекту «ТаблицаЗначений» или «ДеревоЗначений»).
Выгрузку результата запроса приходится делать в двойном цикле по полям и строкам объекта ADODB.RecordSet,
что для выборки данных с большим числом строк и полей может занимать значительное время.
Одним из вариантов решения проблемы является использование для выгрузки результата запроса внешних компонент.
Для этой цели в подсистеме «COMExchange», начиная с версии 8.1.1.2, реализована поддержка работы
с внешней компонентой GameWhithFire.dll (© Дмитрий Ощепков, aka DmitrO).
О версии подсистемы можно узнать из справочной информации к подсистеме или к консоли запросов в её комплекте (Рис.3).
Внешняя компонента распространяется свободно в комплекте поставки
инструментального пакета «Enterprise Integrator» (для использования ВК не требуется приобретение лицензий пакета).
ВК GameWhithFire.dll поставляет объект "AddIn.ADOUtils", который имеет методы, позволяющие
получить объекты «ТаблицаЗначений» и «РезультатЗапроса», заполненные по данным объекта ADODB.RecordSet.
При этом могут выполняться дополнительные действия: типизация колонок по соответствию типов ADO и 1С,
преобразование значений типа BINARY к строковому 16-тиричному представлению и т.п. (смотри подробности в документации).
Для работы с ВК GameWhithFire.dll в подсистеме сделаны следующие изменения:
1. В общий модуль «COMОбмен» добавлены функции возвращающие объекты ВК "AddIn.ADOUtils" и "AddIn.V8Storage",
при необходимости подключая ВК;
2. Добавлены новые опции выполнения запросов ADO, передаваемые функциям ВыполнитьЗапросADO() и ВыполнитьЗапросADO_ТЗ():
- GWFUnload - (Булево) выгружать объект 'ADODB.RecordSet' (результат запроса ADO) в таблицу значений с помощью средств ВК;
- GWFConvert - (Булево) преобразовывать объект 'ADODB.RecordSet' в объект 'РезультатЗапроса' (1С) с помощью средств ВК;
- GWFYearOffset - используемое смещение дат при выгрузке и преобразовании результата запроса ADO;
3. В форме опций ADO добавлены элементы управления для доступа к новым опциям (Рис.1, Рис.2);
По умолчанию новые опции запросов ADO не используются. Если передана одна из опций запроса GWFUnload или GWFConvert и
не удаётся подключить ВК, функция выполняющая запрос возвращает признак ошибки.
Как видно на Рис.1 и Рис.2 при использовании ВК выгрузка результата запроса ADO в таблицу значений ускоряется на порядок (раз в 10).
Пример взят из файла в архиве поставки .\COMExchange-8x\Sampels\!ЗагрузкаКурсов\!ЗагрузкаКурсовЦБ_USD.selx.
Ещё значительнее эффект, если выполняется преобразование значений типа BINARY к 16-тиричному представлению (в несколько десятков раз).
Для того, что бы воспроизвести результат описанного выше примера, потребуется установить подсистему «COMExchange»,
выполнить автоматическое заполнение плана обмена «Обмен данными COM» и открыть в обработке указанный выше файл.
Замечания о типизации колонок результата запроса ADO при выгрузке в таблицу значений:
Поля объекта ADODB.RecordSet, имеющие типы FLOAT или DOUBLE, при выгрузке средствами ВК не типизируются,
поскольку соответствующие числовые типы платформой 1С не поддерживаются.
Это может приводить к определённым проблемам, если полученную таблицу значений требуется
загрузить во временную таблицу для обработки в запросе 1С.
В этой связи при выгрузке результата запроса ADO средствами самой подсистемы «COMExchange» указанные выше типы ADO
типизируются «взвешенно-максимальным» в 1С числовым типом Число(32,10) с возможной потерей точности значений.