Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Обработка ПолучениеУИД.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
&НаКлиентеНаСервереБезКонтекста Функция ПолучитьТекстЗапроса() Возврат "ВЫБРАТЬ | КлассификаторБанковРФ.Ссылка, | КлассификаторБанковРФ.Наименование |ИЗ | Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ"; КонецФункции // ПолучитьТекстЗапроса() &НаСервере Функция ПолучитьСхемуОбработки() Возврат РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет"); КонецФункции &НаСервереБезКонтекста Функция ПолучитьСхемуКомпоновки() Схема = Новый СхемаКомпоновкиДанных; ИсточникДанных = Схема.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "Источник"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "НаборДанных"; НаборДанных.ИсточникДанных = "Источник"; НаборДанных.Запрос = ПолучитьТекстЗапроса(); НаборСсылка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); НаборСсылка.Поле = "Ссылка"; НаборСсылка.ПутьКДанным = "Ссылка"; НаборНаименование= НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); НаборНаименование.Поле = "Наименование"; НаборНаименование.ПутьКДанным = "Наименование"; ПолеИД = Схема.ВычисляемыеПоля.Добавить(); ПолеИД.Выражение = "XMLСтрока(Ссылка)"; ПолеИД.Заголовок = "ИД"; ПолеИД.ПутьКДанным = "ИД"; СтрокаТЗ = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); СтрокаТЗ.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); ЭлементыВыбора = Схема.НастройкиПоУмолчанию.Выбор.Элементы; ПолеСсылка = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ПолеСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); ПолеНаименование = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ПолеНаименование.Поле = Новый ПолеКомпоновкиДанных("Наименование"); ПолеИД = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ПолеИД.Поле = Новый ПолеКомпоновкиДанных("ИД"); Возврат Схема; КонецФункции &НаСервереБезКонтекста Функция ЗаполнитьПоКомпоновкеПрямойОбход(Схема) Док = Новый ТекстовыйДокумент; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет,,, Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений); ПроцессорВывода.НачатьВывод(); Пока Истина Цикл ЭлементКомпоновки = ПроцессорКомпоновки.Следующий(); Если ЭлементКомпоновки = Неопределено Тогда Прервать; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементКомпоновки); Если ЭлементКомпоновки.Макет = "Макет2" И ЭлементКомпоновки.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда Док.ДобавитьСтроку(ЭлементКомпоновки.ЗначенияПараметров.П2.Значение + ";" + ЭлементКомпоновки.ЗначенияПараметров.П3.Значение); КонецЕсли; КонецЦикла; ТЗ = ПроцессорВывода.ЗакончитьВывод(); Возврат Док; КонецФункции // ЗаполнитьПоКомпоновкеПрямойОбход() &НаСервере Функция ЗаполнитьОбходТЗ(ИспользоватьСхемуОбработки) Если ИспользоватьСхемуОбработки Тогда Схема = ПолучитьСхемуОбработки(); Иначе Схема = ПолучитьСхемуКомпоновки(); КонецЕсли; Возврат ЗаполнитьПоКомпоновкеОбходТЗ(Схема); //Возврат ЗаполнитьПоКомпоновкеОбходТЗ(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки())); КонецФункции // ЗаполнитьОбходТЗ() &НаСервере Функция ЗаполнитьПрямойОбход(ИспользоватьСхемуОбработки) Если ИспользоватьСхемуОбработки Тогда Схема = ПолучитьСхемуОбработки(); Иначе Схема = ПолучитьСхемуКомпоновки(); КонецЕсли; Возврат ЗаполнитьПоКомпоновкеПрямойОбход(Схема); //Возврат ЗаполнитьПоКомпоновкеПрямойОбход(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки())); КонецФункции // ЗаполнитьОбходТЗ() &НаСервереБезКонтекста Функция ЗаполнитьПоКомпоновкеОбходТЗ(Схема) Док = Новый ТекстовыйДокумент; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет,,, Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений); ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки); Для Каждого СтрокаТЗ Из ТЗ Цикл Док.ДобавитьСтроку(СтрокаТЗ.Наименование + ";" + СтрокаТЗ.ИД); КонецЦикла; Возврат Док; КонецФункции // ЗаполнитьПоКомпоновкеОбходТЗ() &НаСервереБезКонтекста Функция ЗаполнитьПоЗапросу() Док = Новый ТекстовыйДокумент; Запрос = Новый Запрос(ПолучитьТекстЗапроса()); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Док.ДобавитьСтроку(Результат.Наименование + ";" + XMLСтрока(Результат.Ссылка)); КонецЦикла; Возврат Док; КонецФункции // ЗаполнитьПоЗапросу() &НаСервере Процедура ЗаполнитьТабДокСхема(ИспользоватьСхемуОбработки) Если ИспользоватьСхемуОбработки Тогда Схема = ПолучитьСхемуОбработки(); ТабДок = ТабДок1; Иначе Схема = ПолучитьСхемуКомпоновки(); ТабДок = ТабДок2; КонецЕсли; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет,,, Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры // ЗаполнитьТабДокСхема() &НаСервере Процедура ЗаполнитьТабДокЗапрос() Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Отчет"); ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); Запрос = Новый Запрос(ПолучитьТекстЗапроса()); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл ОбластьСтрока.Параметры.Заполнить(Результат); ОбластьСтрока.Параметры.ИД = XMLСтрока(Результат.Ссылка); ТабДок3.Вывести(ОбластьСтрока); КонецЦикла; КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ЗаполнитьТабДокСхема(Истина); ЗаполнитьТабДокСхема(Ложь); ЗаполнитьТабДокЗапрос(); Т1 = ЗаполнитьПоЗапросу(); Т2 = ЗаполнитьОбходТЗ(Ложь); Т3 = ЗаполнитьОбходТЗ(Истина); Т4 = ЗаполнитьПрямойОбход(Ложь); Т5 = ЗаполнитьПрямойОбход(Истина); КонецПроцедурыПо результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Обработка ПолучениеУИД.
Комментариев нет:
Отправить комментарий