helpf.pro
Регистрация
 0 
Распечатать

Получение уникального идентификатора ссылки в СКД

Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.

Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.

Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.

Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.

Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).

Код 1C v 8.2 УП
 &НаКлиентеНаСервереБезКонтекста
Функция ПолучитьТекстЗапроса()


 Возврат "ВЫБРАТЬ
         | КлассификаторБанковРФ.Ссылка,
         | КлассификаторБанковРФ.Наименование
         |ИЗ
         | Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ";


КонецФункции // ПолучитьТекстЗапроса()


&НаСервере
Функция ПолучитьСхемуОбработки()
 
 Возврат РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет");
 
КонецФункции


&НаСервереБезКонтекста
Функция ПолучитьСхемуКомпоновки()
 
 Схема = Новый СхемаКомпоновкиДанных;
 
 ИсточникДанных = Схема.ИсточникиДанных.Добавить();
 ИсточникДанных.Имя = "Источник";
 ИсточникДанных.ТипИсточникаДанных = "Local";
 
 НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
 НаборДанных.Имя = "НаборДанных";
 НаборДанных.ИсточникДанных = "Источник";
 НаборДанных.Запрос = ПолучитьТекстЗапроса();
 
 НаборСсылка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
 НаборСсылка.Поле = "Ссылка";
 НаборСсылка.ПутьКДанным = "Ссылка";
 НаборНаименование= НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
 НаборНаименование.Поле = "Наименование";
 НаборНаименование.ПутьКДанным = "Наименование";
 
 ПолеИД = Схема.ВычисляемыеПоля.Добавить();
 ПолеИД.Выражение = "XMLСтрока(Ссылка)";
 ПолеИД.Заголовок = "ИД";
 ПолеИД.ПутьКДанным = "ИД";
 
 СтрокаТЗ = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
 СтрокаТЗ.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 
 ЭлементыВыбора = Схема.НастройкиПоУмолчанию.Выбор.Элементы;
 ПолеСсылка = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ПолеСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
 ПолеНаименование = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ПолеНаименование.Поле = Новый ПолеКомпоновкиДанных("Наименование");
 ПолеИД = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ПолеИД.Поле = Новый ПолеКомпоновкиДанных("ИД");
 
 Возврат Схема;
 
КонецФункции


&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеПрямойОбход(Схема)


 Док = Новый ТекстовыйДокумент;
 
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); 
 
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
 
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
 ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
 ПроцессорВывода.НачатьВывод();
 
 Пока Истина Цикл
  
  ЭлементКомпоновки = ПроцессорКомпоновки.Следующий();
  Если ЭлементКомпоновки = Неопределено Тогда
   Прервать;
  КонецЕсли;
  
  ПроцессорВывода.ВывестиЭлемент(ЭлементКомпоновки);
  Если ЭлементКомпоновки.Макет = "Макет2" И ЭлементКомпоновки.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда
   Док.ДобавитьСтроку(ЭлементКомпоновки.ЗначенияПараметров.П2.Значение + ";" + ЭлементКомпоновки.ЗначенияПараметров.П3.Значение);
  КонецЕсли;
  
 КонецЦикла;
 
 ТЗ = ПроцессорВывода.ЗакончитьВывод();
 
 Возврат Док;


КонецФункции // ЗаполнитьПоКомпоновкеПрямойОбход()


&НаСервере
Функция ЗаполнитьОбходТЗ(ИспользоватьСхемуОбработки)


 Если ИспользоватьСхемуОбработки Тогда
  Схема = ПолучитьСхемуОбработки();
 Иначе
  Схема = ПолучитьСхемуКомпоновки();
 КонецЕсли;
 
 Возврат ЗаполнитьПоКомпоновкеОбходТЗ(Схема);


 //Возврат ЗаполнитьПоКомпоновкеОбходТЗ(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));
 
КонецФункции // ЗаполнитьОбходТЗ()


&НаСервере
Функция ЗаполнитьПрямойОбход(ИспользоватьСхемуОбработки)


 Если ИспользоватьСхемуОбработки Тогда
  Схема = ПолучитьСхемуОбработки();
 Иначе
  Схема = ПолучитьСхемуКомпоновки();
 КонецЕсли;
 
 Возврат ЗаполнитьПоКомпоновкеПрямойОбход(Схема);
 //Возврат ЗаполнитьПоКомпоновкеПрямойОбход(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));


КонецФункции // ЗаполнитьОбходТЗ()


&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеОбходТЗ(Схема)


 Док = Новый ТекстовыйДокумент;
 
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); 
 
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
 
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
 ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
 ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
 
 Для Каждого СтрокаТЗ Из ТЗ Цикл
  Док.ДобавитьСтроку(СтрокаТЗ.Наименование + ";" + СтрокаТЗ.ИД);
 КонецЦикла;
 
 Возврат Док;


КонецФункции // ЗаполнитьПоКомпоновкеОбходТЗ()


&НаСервереБезКонтекста
Функция ЗаполнитьПоЗапросу()


 Док = Новый ТекстовыйДокумент;
 
 Запрос = Новый Запрос(ПолучитьТекстЗапроса());
 Результат = Запрос.Выполнить().Выбрать();
 Пока Результат.Следующий() Цикл
  Док.ДобавитьСтроку(Результат.Наименование + ";" + XMLСтрока(Результат.Ссылка));
 КонецЦикла;
 
 Возврат Док;


КонецФункции // ЗаполнитьПоЗапросу()


&НаСервере
Процедура ЗаполнитьТабДокСхема(ИспользоватьСхемуОбработки)


 Если ИспользоватьСхемуОбработки Тогда
  Схема = ПолучитьСхемуОбработки();
  ТабДок = ТабДок1;
 Иначе
  Схема = ПолучитьСхемуКомпоновки();
  ТабДок = ТабДок2;
 КонецЕсли;
 
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию); 
 
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
 
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
 ПроцессорВывода.УстановитьДокумент(ТабДок);
 ПроцессорВывода.Вывести(ПроцессорКомпоновки);


КонецПроцедуры // ЗаполнитьТабДокСхема()


&НаСервере
Процедура ЗаполнитьТабДокЗапрос()
 
 Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Отчет");
 ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
 
 Запрос = Новый Запрос(ПолучитьТекстЗапроса());
 Результат = Запрос.Выполнить().Выбрать();
 Пока Результат.Следующий() Цикл
  ОбластьСтрока.Параметры.Заполнить(Результат);
  ОбластьСтрока.Параметры.ИД = XMLСтрока(Результат.Ссылка);
  ТабДок3.Вывести(ОбластьСтрока);
 КонецЦикла;
 
КонецПроцедуры


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 
 ЗаполнитьТабДокСхема(Истина);
 ЗаполнитьТабДокСхема(Ложь);
 ЗаполнитьТабДокЗапрос();
 
 Т1 = ЗаполнитьПоЗапросу(); 
 Т2 = ЗаполнитьОбходТЗ(Ложь);
 Т3 = ЗаполнитьОбходТЗ(Истина);
 Т4 = ЗаполнитьПрямойОбход(Ложь);
 Т5 = ЗаполнитьПрямойОбход(Истина);
 
КонецПроцедуры

По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.

В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.

Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.

Источник

Разместил:   Версии: | 8.2 УП | 8.3 |  Дата:   Прочитано: 20239
 0 
Распечатать
Возможно, вас также заинтересует
Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 2
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: ... по причине: Ошибка компоновки данных по причине: Ошибка получени
Вертикальная автофиксация для СКД 0
В СКД очень не хватает возможности автофиксации строк. Обусловлено это невозможностью однозначно определить их количество в общем случае. Однако в большинстве случаев это можно сделать Обращаю ваше внимание, что приведенная процедура работает не все
Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр
Внутреннее устройство PostgreSQL, в помощь администраторам 1С 1
Понимание архитектуры используемой СУБД очень важно для правильной эксплуатации, но местами переоценено: администратору, DevOps-специалисту или разработчику прикладных систем вовсе необязательно знать подробности внутреннего устройства B-дерева или
Временные таблицы в отчетах СКД 0
Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.