Сравнение 5 различных методов доступа к базе данных 1С

Не так давно на этом сайте были размещены результаты тестирования вариантов доступа к данным на примере rainbow и технологии ADO. Тестирование проводилось на достаточно сложных запросах, которые нечасто встречаются в работе с базой данных. Результаты его заинтересовали. Вместе с тем было принято решение не ограничиваться только этими вариантами доступа к базе данных, а расширить список. Кроме того было принято решение выполнить в качестве теста достаточно типовые задачи, например типичный запрос к регистру остатков для построения отчета.

Сравнение 5 различных методов доступа к базе данных 1С

Softpoint.ru/

Не так давно на этом сайте были размещены результаты тестирования вариантов доступа к данным на примере rainbow и технологии ADO. Тестирование проводилось на достаточно сложных запросах, которые нечасто встречаются в работе с базой данных. Результаты его заинтересовали. Вместе с тем было принято решение не ограничиваться только этими вариантами доступа к базе данных, а расширить список. Кроме того было принято решение выполнить в качестве теста достаточно типовые задачи, например типичный запрос к регистру остатков для построения отчета.

АнтонГусев

В данном тестировании будут принимать участие следующие методы доступа к данным:

  • стандартный доступ путем выполнения запроса ;
  • прямой запрос к данным с помощью rainbow;
  • прямой запрос к данным с помощью технологии ADO;
  • прямой запрос к данным с помощью 1С++;
  • прямой запрос к данным с помощью внешней компоненты neta.dll.

Параметры тестирования:

Будет использоваться самописная база на компоненте «Торговля». База содержит информацию за период 2,5 года. Перед тестированием базы данных, она была сжата («Shrink Database»). Объем базы данных, отображаемый в «EM», составляет 465 мегабайт. Тестовой задачей будет построение стандартного отчета по регистру «Партии» с периодом с «05.02.2002» по «20.01.2004» (то есть почти за два года). В первом варианте будет задано условие построения отчета по двум местам хранения (без группирования по местам хранения, простое суммирование данных). Второй вариант построяния отчета - без всяких условий.

В запросе должна быть единственная группировка по товару. В отчет выводятся начальные и конечные остатки за период, а также приход и расход товаров в количественном выражении. Печатная форма выводится. Замер времени работы будет производиться с помощью недокументированной функции : _GetPerformanceCounter().

Тестовая платформа:

Аппаратная часть: Атлон-1400 512Мб DDR, HDD 2*40Гб IDE Raid-0.

Программная часть: Win2003 server, SQL 2000 server sp3, 1С (21 релиз).

В качестве тестового вопроса будет использоваться стандартный запрос по регистру партий товаров. Посмотреть текст запроса (вариант без фильтра по местам хранения), а заодно и прочитать статью можно здесь. Запрос с фильтром по двум местам хранения не приводится с целью экономии места и времени. Внимание: отличие тестового запроса от приведенного в том, что результирующая таблица в тестовом запросе еще соединяется со справочником товаров, группируется по наименованию и сортируется по возрастанию. Таким образом запрос возвращает наименование товара, а не ID объекта.

Код модуля отчета для тестирования представлен ниже, думаю по названиям процедур видно, какая за что отвечает...

Перем НачДата,КонДата;
Перем Магазин1, Магазин2;
Перем ТекстЗапросаРадуга, ТекстЗапросаАДО;
//________________________________________________________
Процедура Выполнить1С()
НачЧисло=_GetPerformanceCounter();
//начало теста
Запрос=СоздатьОбъект("Запрос");
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.ДобавитьЗначение(Магазин1);
СЗ.ДобавитьЗначение(Магазин2);
ТекстЗапроса="//{{ЗАПРОС(ОдинС)
|Период с НачДата по КонДата;
|Магазин = Регистр.Партии.Магазин;
|Наименование = Регистр.Партии.Товар;
|Количество = Регистр.Партии.Количество;
|Функция Нач = НачОст(Количество);
|Функция Прих = Приход(Количество);
|Функция Расх = Расход(Количество);
|Функция Кон = КонОст(Количество);
|Группировка Наименование без групп;
|Условие(Магазин в СЗ);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Предупреждение("Не выполнился запрос!",10);
Возврат;
КонецЕсли;
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
Пока Запрос.Группировка(1)=1 Цикл
ТекИмя=Запрос.Наименование;
ТекНач=Запрос.Нач;
ТекПрих=Запрос.Прих;
ТекРасх=Запрос.Расх;
ТекКон=Запрос.Кон;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать();
Запрос="";
//конец теста
КонЧисло=_GetPerformanceCounter();
ТекРезультат=КонЧисло-НачЧисло;
Сообщить(ТекРезультат);
КонецПроцедуры
//________________________________________________________
Процедура ВыполнитьРадуга()
НачЧисло=_GetPerformanceCounter();
//начало теста
ЗапросРадуги=СоздатьОбъект("ODBCQuery");
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
Если ЗапросРадуги.Prepare(ТекстЗапросаРадуга,1,1)=1 Тогда
Если ЗапросРадуги.Open()=1 Тогда
ЗапросРадуги.GotoNext();
Пока ЗапросРадуги.IsOK()=1 Цикл
//Считываем данные
ТекИмя=ЗапросРадуги.GetString(0);
ТекНач=ЗапросРадуги.GetString(1);
ТекПрих=ЗапросРадуги.GetString(2);
ТекРасх=ЗапросРадуги.GetString(3);
ТекКон=ЗапросРадуги.GetString(4);
Таб.ВывестиСекцию("Строка");
//****************
ЗапросРадуги.GotoNext();
КонецЦикла;
ЗапросРадуги.Close();
Иначе
Предупреждение("Ошибка открытия запроса!",10);
КонецЕсли;
ЗапросРадуги.Reset();
Иначе
Предупреждение("Ошибка выполнения запроса!",10);
КонецЕсли;
ЗапросРадуги="";
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать();
//конец теста
КонЧисло=_GetPerformanceCounter();
ТекРезультат=КонЧисло-НачЧисло;
Сообщить(ТекРезультат);
КонецПроцедуры
//________________________________________________________
Процедура ВыполнитьАДО()
//начало теста
Если МонопольныйРежим()=1 Тогда
Предупреждение("Невозможно выполнить запрос в монопольном режиме!",10);
//Действия
Возврат;
//********
КонецЕсли;
Соединение=СоздатьОбъект("ADODB.Connection");
ТекСервер="***";
ТекПароль="***";
ТекБаза="***";
СтрокаКоннекта="driver={SQL Server};server="+ТекСервер+";uid=sa;pwd="+ТекПароль+";Database="+ТекБаза;
Соединение.ConnectionTimeOut=20;
Соединение.CursorLocation=3;
Попытка
Соединение.Open(СтрокаКоннекта);
Исключение
Предупреждение("Невозможно установить соединение с базой данных!");
//Действия

//********
КонецПопытки;
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
ЗапросАДО=СоздатьОбъект("ADODB.Command");
ЗапросАДО.ActiveConnection=Соединение;
НачЧисло=_GetPerformanceCounter();
ЗапросАДО.CommandText=ТекстЗапросаАДО;
Выборка=ЗапросАДО.Execute();
Если Выборка.EOF()=-1 Тогда
Иначе
Выборка.MoveFirst();
Пока Выборка.EOF()=0 Цикл
//Обработка выборки данных
ТекИмя=Выборка.Fields(0).Value;
ТекНач=Выборка.Fields(1).Value;
ТекПрих=Выборка.Fields(2).Value;
ТекРасх=Выборка.Fields(3).Value;
ТекКон=Выборка.Fields(4).Value;
Таб.ВывестиСекцию("Строка");
//*****************
Выборка.MoveNext();
КонецЦикла;
КонецЕсли;
Выборка.Close();
Соединение.Close();
Выборка="";
ЗапросАДО="";
Соединение="";
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать();
//конец теста
КонЧисло=_GetPerformanceCounter();
ТекРезультат=КонЧисло-НачЧисло;
Сообщить(ТекРезультат);
КонецПроцедуры
//________________________________________________________
Процедура Выполнить1Спп()
НачЧисло=_GetPerformanceCounter();
//начало теста
Запрос=СоздатьОбъект("ODBCRecordSet");
Запрос.Открыть(ТекстЗапросаРадуга);
Запрос.УстТипыКолонок1С("Строка,Число,Число,Число,Число");
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Запрос.ПолучитьРезультатыВ_ТЗ(ТЗ,1);
Запрос.Закрыть();
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ТекИмя=ТЗ.Имя;
ТекНач=ТЗ.Нач;
ТекПрих=ТЗ.Прих;
ТекРасх=ТЗ.Расх;
ТекКон=ТЗ.Кон;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать();
//конец теста
КонЧисло=_GetPerformanceCounter();
ТекРезультат=КонЧисло-НачЧисло;
Сообщить(ТекРезультат);
КонецПроцедуры
//________________________________________________________
Процедура ВыполнитьНета()
НачЧисло=_GetPerformanceCounter();
//начало теста
Запрос=СоздатьОбъект("AddIn.NPeriodik");
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Имя");
ТЗ.НоваяКолонка("Нач");
ТЗ.НоваяКолонка("Прих");
ТЗ.НоваяКолонка("Расх");
ТЗ.НоваяКолонка("Кон");
ТЗПарм=СоздатьОбъект("ТаблицаЗначений");
ТЗПарм.НоваяКолонка("Номер");
ТЗПарм.НоваяКолонка("Тип");
ТЗПарм.НоваяКолонка("Размер");
ТЗПарм.НоваяСтрока();
ТЗПарм.Номер=1;
ТЗПарм.Тип=1;
ТЗПарм.Размер=0;
ТЗПарм.НоваяСтрока();
ТЗПарм.Номер=2;
ТЗПарм.Тип=4;
ТЗПарм.Размер=4;
ТЗПарм.НоваяСтрока();
ТЗПарм.Номер=3;
ТЗПарм.Тип=4;
ТЗПарм.Размер=4;
ТЗПарм.НоваяСтрока();
ТЗПарм.Номер=4;
ТЗПарм.Тип=4;
ТЗПарм.Размер=4;
ТЗПарм.НоваяСтрока();
ТЗПарм.Номер=5;
ТЗПарм.Тип=4;
ТЗПарм.Размер=4;
//________________________________________________________
Запрос.ЗапросК1С(ТекстЗапросаРадуга,ТЗПарм,ТЗ,2);
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ТекИмя=ТЗ.Имя;
ТекНач=ТЗ.Нач;
ТекПрих=ТЗ.Прих;
ТекРасх=ТЗ.Расх;
ТекКон=ТЗ.Кон;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.Показать();
//конец теста
КонЧисло=_GetPerformanceCounter();
ТекРезультат=КонЧисло-НачЧисло;
Сообщить(ТекРезультат);
КонецПроцедуры
//________________________________________________________
Процедура ПриОткрытии()
НачДата='05.02.2002';
КонДата='20.01.2004';
Спр=СоздатьОбъект("Справочник.Магазины");
Спр.НайтиПоКоду("1");
Магазин1=Спр.ТекущийЭлемент();
Спр.НайтиПоКоду("3");
Магазин2=Спр.ТекущийЭлемент();
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll")=0 тогда
Предупреждение ("Компонента 1с++ не найдена");
Форма.кнПлюс.Доступность(0);
КонецЕсли;
Если ЗагрузитьВнешнююКомпоненту("neta.dll")=0 тогда
Предупреждение ("Компонента neta не найдена");
Форма.кнНета.Доступность(0);
КонецЕсли;
КонецПроцедуры

Тестирования проводилось по 3 раза для каждого варианта. Перед началом тестирования все варианты прогонялись, чтобы все необходимые данные закэшировались в оперативной памяти. Время теста дано в миллисекундах.

Ниже приведена таблица для режима тестирования с фильтром по двум местам хранения:

Наименование.
1C Rainbow ADO 1С++ Neta.dll
1 36298 4243 4302 3810 3802
2 35838 4219 4238 3797 3800
3 36060 4203 4226 3753 3798
Среднее: 36065 4222 4255 3787 3800

Ниже приведена таблица для режима тестирования без фильтров:

Наименование.
1C Rainbow ADO 1С++ Neta.dll
1 149338 6502 6429 5889 6004
2 155806 6389 6437 5880 5998
3 151409 6451 6393 5889 5995
Среднее: 152184 6447 6420 5886 5999

Итак, объявляем победителей. Первое место достается 1С++, второе Neta.dll, третье rainbow.

Также хотелось бы обратить внимание на некоторые закономерности, выявленные тестированием. При отключении фильтра по местам хранения время формирования прямого запроса увеличилось в 1,5 раза. 1C при этом стала затрачивать почти в 4,5 раза больше времени. Это показывает нам, что производительность стандартного запроса деградирует гораздо более высокими темпами при росте выборки, чем производительность прямого запроса.


Начать дискуссию

О подозрительных операциях нотариусы и майнеры будут сообщать в Росфинмониторинг

Майнеров криптовалют и нотариусов обязали соблюдать антиотмывочный закон 115-ФЗ.

Застройщиков обяжут рядом с ЖК возводить школы

Вместе с жилищными комплексами застройщики будут стоить объекты социальной и транспортной инфраструктуры.

⚡️ Итоги дня: ФАС раскрыла картель на торгах соцтоварами, активисты приклеили себя к взлетной полосе, а спортсмены жалуются на еду в Олимпийской деревне

Подготовили обзор главных событий дня — 25 июля 2024 года. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

Курсы повышения
квалификации

18
Официальное удостоверение с занесением в госреестр Рособрнадзора
Банки

У ВТБ появился сервис покупки автомобилей частями

Сервис «ВТБ Авто» позволяет разделить покупку машины на части: сначала взять авто в аренду, а в конце срока выкупить его по остаточной стоимости.

Сервисы по аренде электросамокатов наказали нарушителей больше 400 тысяч раз

Информацию о нарушениях операторы получают от пользователей приложений, ГАИ и с камер наблюдения.

Бесплатно с ФСБУ Документооборот

ФСБУ 27/2021 «Документы и документооборот в бухгалтерском учете»

Кто должен применять ФСБУ 27/2021, какие требования предъявляются к бухгалтерским документам и документообороту, как правильно составить документ и исправить ошибку.

ФСБУ 27/2021 «Документы и документооборот в бухгалтерском учете»
Опытом делятся эксперты-практики, без воды
НДС

Сегодня последний день сдачи отчетности по НДС без штрафов

25 июля это крайний срок сдачи декларации НДС организациями и ИП на ОСНО, а также на ЕСХН.

👉 Приняты поправки в НК, разработанные еще до налоговой реформы-2025: обзор всех изменений для бухгалтера

Отменят свидетельства об ИНН, сдавать ЕУД надо будет один раз, а не ежеквартально, изменят минимальный срок владения для квартир после перепланировки и многое другое.

1
Банки

Банки ближнего зарубежья стали на 30% чаще отказывать в проведении платежей

Денежные переводы идут больше двух недель, а некоторые платежи отклоняют без объяснения причин.

Общество

Цифра дня. Про новогодние каникулы

Минтруд опубликовал проект постановления о рабочих и праздничных днях в 2025 году.

Цифра дня. Про новогодние каникулы

Предпринимателям окажут поддержку при открытии бизнеса на автомаршрутах

Бизнес, который хочет работать в сфере туризма по пути следования автомобильных маршрутов для путешествий, получит поддержку от Корпорации МСП и Минэка.

Роструд: работодатель не вправе удерживать из зарплат штрафы

В рамках трудового законодательства работодатель не вправе налагать на работников штрафы.

Уголовное дело Елены Блиновской передали в суд

Блогер спрятала от налоговой 906 млн рублей, из них 716 млн вывела через две подконтрольные фирмы. Следователи допросили больше 200 свидетелей и провели свыше 20 обысков.

Бесплатно с Госзакупки

Ведение казначейского счета: начало работы, требования к предоставляемым подтверждающим документам

Казначейский счет — это специальный 71 счет, который открывается для учета бюджетных средств в рамках казначейского сопровождения.

Ведение казначейского счета: начало работы, требования к предоставляемым подтверждающим документам

Брокер ВТБ запустил голосовые рекомендации для инвесторов

Голосовые советы позволят инвесторам быстрее принимать решения о проведении наиболее выгодных сделок.

Расчетный счет

Расчетно-кассовое обслуживание для ИП: как найти свой идеальный тариф

Открытие расчетного счета — один из первых шагов для любого индивидуального предпринимателя. С помощью РКО ИП ведет безналичные расчеты, принимает оплату от клиентов на счет, переводит средства контрагентам и бюджету. Банки предлагают разные тарифы на расчетно-кассовое обслуживание, которые отличаются по стоимости и условиям. 

Расчетно-кассовое обслуживание для ИП: как найти свой идеальный тариф

15 курсов бренд-менеджера для начинающих 

Бренд-менеджер — это специалист в области маркетинга, который занимается продвижением бренда. Его задача: сформировать мнение у покупателей по продукту, услуге или самой компании, склонить их к приобретению. На всех этапах он должен следить за репутацией компании и торговой марки.

15 курсов бренд-менеджера для начинающих 
ПСН

Как совместить патент с УСН и что делать, если ИП превысил лимиты

Индивидуальный предприниматель теряет право на применение патентной системы налогообложения, когда его совокупный доход превышает 60 млн рублей. В таком случае нужно применять только УСН и пересчитать весь налог.

ЭДО

Хранение документов. На бумаге или в электронном виде? Затраты и риски

Документооборот — это настоящее и прошлое любой организации. В данном материале рассмотрим варианты форм хранения документа, сравним, какие затраты на это потребуются, обозначим преимущества того или иного метода хранения и возможные риски.

Хранение документов. На бумаге или в электронном виде? Затраты и риски

Интересные материалы

Право

Как подписать соглашение NDA с самозанятым

Для нормальной работы самозанятому нужен доступ к конфиденциальной информации. Но плательщик НПД — не штатный работник, он не подписывает ЛНА компании и на него нельзя повлиять дисциплинарными мерами ответственности. Проблему может решить соглашение о конфиденциальности (NDA). Рассказываем, как его правильно оформить.

Как подписать соглашение NDA с самозанятым