Получение уникального идентификатора ссылки в СКД Как известно, с помощью языка запросов 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 = ЗаполнитьПрямойОбход( Истина ) ;
КонецПроцедуры
По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Источник
Категория:
Схема Компоновки Данных Своя функция в вычисляемых полях СКД В
вычисляемых полях СКД можно использовать свои функции расчетов!
для этого необходимо
добавить экспорнутю функцию в общий модуль :
Код 1C v 8.х Функция МояФункцияДляСКД(ТекЗнач) Экспорт
Возврат ТекЗнач;
КонецФункции
В скд на закладке вычисляемые поля добавляете поле:
указываете Путь к данными и пишете по аналогии с примером:
Категория:
Схема Компоновки Данных Табличное поле ~ Дополнительные колонки в динамическом списке В процессе написания кода для отображения дополнительных
вычисляемых полей в динамическом списке документов получились вот такие приемы (просто код, без комментариев).
Код 1C v 8.х Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ТекДокумент = ДанныеСтроки. Ссылка;
СуммаДокумента = ТекДокумент. Товары. Итог( "СуммаСНДС" ) ;
СуммаБезнал = ТекДокумент. Оплата. Итог( "СуммаОплаты" ) ;
СуммаНал = ? ( СуммаДокумента > СуммаБезнал, СуммаДокумента - СуммаБезнал, 0 ) ;
ОформлениеСтроки. Ячейки. СуммаДокумента. ОтображатьТекст = Истина ;
ОформлениеСтроки. Ячейки. НаличнаяОплата. ОтображатьТекст = Истина ;
ОформлениеСтроки. Ячейки. БезналичнаяОплата. ОтображатьТекст = Истина ;
ОформлениеСтроки. Ячейки. СуммаДокумента. Текст = Формат( СуммаДокумента, "ЧДЦ=2; ЧН=" ) ;
ОформлениеСтроки. Ячейки. НаличнаяОплата. Текст = Формат( СуммаНал, "ЧДЦ=2; ЧН=" ) ;
ОформлениеСтроки. Ячейки. БезналичнаяОплата. Текст = Формат( СуммаБезнал, "ЧДЦ=2; ЧН=" ) ;
Если ТекДокумент. ПолучитьОбъект( ) . ПолучитьСвязанныйПКО( ) < > Неопределено Тогда
ОформлениеСтроки. Ячейки. ЕстьПКО. ОтображатьКартинку = Истина ;
ОформлениеСтроки. Ячейки. ЕстьПКО. Картинка = БиблиотекаКартинок. ВыполненоУспешно32 ;
КонецЕсли ;
КонецПроцедуры
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
МассивДокументов = Новый Массив;
Для каждого ТекСтрока Из ОформленияСтрок Цикл
МассивДокументов. Добавить( ТекСтрока. ДанныеСтроки. Ссылка) ;
КонецЦикла ;
Запрос = Новый Запрос( "ВЫБРАТЬ Основание ИЗ РегистрСведений.АА_СвязанныеДокументы КАК СД ГДЕ СД.Основание В (&Документы)" ) ;
Запрос. УстановитьПараметр( "Документы" , МассивДокументов) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого ТекСтрока Из ОформленияСтрок Цикл
Ссылка = ТекСтрока. ДанныеСтроки. Ссылка;
ТекСтрока. Ячейки. ЕстьПКО. ЗначениеКартинки = Результат. Найти( Ссылка, "Основание" ) < > Неопределено ;
КонецЦикла ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Конструктор схемы компоновки данных Категория:
Схема Компоновки Данных