Проект

Общее

Профиль

Система компоновки данных (СКД) » История » Версия 11

Версия 10 (Всеволод Дорофеев, 30.03.2021 03:13) → Версия 11/19 (Всеволод Дорофеев, 30.03.2021 03:17)

h1. Система компоновки данных (СКД)

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

<pre>
&НаСервере
Процедура ПеренестиНоменклатуруСервере()
ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
СхемаНоменклатуры = ОбъектНаСервере.ПолучитьМакет("СКД");

//СКД. Программная установка параметров в управляемой форме отчета
ПараметрДанных = КомпоновщикНаФорме.Настройки.ПараметрыДанных.Элементы.Найти("ГруппаНоменклатуры");
ПараметрДанных.Использование = Истина;
ПараметрДанных.Значение = Объект.ПапкаАрхив;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаНоменклатуры, КомпоновщикНаФорме.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,, Истина);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

ТЗНоменклатура = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗНоменклатура);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

Для каждого СтрокаТЗ из ТЗНоменклатура Цикл
ОбработкаОбъект.ПеренестиНоменклатурнуюПозициюВПапкуНаСервере(СтрокаТЗ);
КонецЦикла;

КонецПроцедуры
</pre>
Вариант 2.
<pre>
Процедура СформироватьОтчетВТаблицуЗначений(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина, ВнешниеНаборыДанных = Неопределено) Экспорт

Настройки = КомпоновщикНастроек.ПолучитьНастройки();

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
КомпоновщикНастроек.Настройки, , ,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

ПроцессорВывода.УстановитьОбъект(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры

//Пример вызова:
Результат = новый ТаблицаЗначений;
СформироватьОтчетВТаблицуЗначений(Результат, ЭтаФорма.ДанныеРасшифровки);
</pre>

h3. ШАБЛОНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ СКД

<pre>
//****************************************************************************
// ШАБЛОНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ СКД
// {{
//****************************************************************************
// Заполняет переданный объект на основани СКД
//
// Параметры
//
// СКД – собствеено настройки СКД
//
// ОбъектДляЗагрузки – объект в который выгружаются данные, таблица значений, дерево значений, табличный документ
//
// ИсполняемыеНастройки – Пользовательские настройки СКД если не указаны будут использованы настроки СКД по умолчанию
//
// СтруктураПараметров - Структура – Передаваемые для СКД параметры
//
// ДеревоЗначений = Новый ДеревоЗначений;
//
// ПРИМЕР ВЫЗОВА
// СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// СтруктураПараметров = Новый Структура("ДатаОтчета", НашаДата);
// ПолучитьДанныеНаОснованииСКД(СхемаКомпоновкиДанных, ДеревоЗначений, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, СтруктураПараметров);
//
&НаСервере
Процедура ПолучитьДанныеНаОснованииСКД(СКД, ОбъектДляЗагрузки, ИсполняемыеНастройки = Неопределено, СтруктураПараметров = Неопределено, РасшифровкаСКД = Неопределено, МакетКомпоновки = Неопределено, ВнешниеНаборыДанных = Неопределено) Экспорт

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

//Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") ИЛИ ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанных");
Иначе
ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
КонецЕсли;

Если ИсполняемыеНастройки = Неопределено Тогда

ИсполняемыеНастройки = СКД.НастройкиПоУмолчанию;

КонецЕсли;

Если СтруктураПараметров <> Неопределено Тогда

КоллекцияЗначенийПараметров = ИсполняемыеНастройки.ПараметрыДанных.Элементы;

Для каждого Параметр Из СтруктураПараметров Цикл

НайденноеЗначениеПараметра = КоллекцияЗначенийПараметров.Найти(Параметр.Ключ);

Если НайденноеЗначениеПараметра <> Неопределено Тогда

НайденноеЗначениеПараметра.Использование = Истина;

НайденноеЗначениеПараметра.Значение = Параметр.Значение;

КонецЕсли;

КонецЦикла;

КонецЕсли;

МакетКомпоновкиСКД = КомпоновщикМакета.Выполнить(СКД, ИсполняемыеНастройки, РасшифровкаСКД, МакетКомпоновки, ТипГенератора);

ПроцессорКомпановки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпановки.Инициализировать(МакетКомпоновкиСКД, ВнешниеНаборыДанных, РасшифровкаСКД, Истина);

//Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") ИЛИ ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ОбъектДляЗагрузки);

Иначе

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

ПроцессорВывода.УстановитьОбъект(ОбъектДляЗагрузки);

КонецЕсли;

ПроцессорВывода.ОтображатьПроцентВывода = Истина;

ПроцессорВывода.Вывести(ПроцессорКомпановки, Истина);

КонецПроцедуры // ПолучитьДанныеНаОснованииСКД()

//****************************************************************************
// }}
//****************************************************************************
</pre>

h3. Смена схемы СКД

<pre>
Функция СохранитьПараметры(ИменаПараметров)

Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;

МассивСИменами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ИменаПараметров,",");

СтруктураДляПараметров = Новый Структура;

Для Каждого ИмяПараметра Из МассивСИменами Цикл

Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));

Если Параметр <> Неопределено Тогда

СтруктураДляПараметров.Вставить(ИмяПараметра, Параметр.Значение);

КонецЕсли;

КонецЦикла;

Возврат СтруктураДляПараметров;

КонецФункции

Процедура ЗагрузитьПараметры(СтруктураСПараметрами)

Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;

Для Каждого ТекущийПараметр Из СтруктураСПараметрами Цикл

Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекущийПараметр.Ключ));

Если Параметр <> Неопределено Тогда

Параметр.Значение = ТекущийПараметр.Значение;

Параметр.Использование = Истина;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Процедура СменитьСхему()

СтруктураСНастройками = СохранитьПараметры("Параметр1,Параметр2,Параметр3");

СхемаКомпоновкиДанных = ПолучитьМакет("ЗдесьИмяНужнойВамСхемы");

Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

ЗагрузитьПараметры(СтруктураСНастройками);

КонецПроцедуры
</pre>

h3. Как в СКД получить GUID (ГУИД) объекта

В вычисляемые поля добавить выражение "XMLСтрока(Номенклатура)"

Все работает если процессор компоновки инициализировать программно и четвертым параметром указать использование общих модулей конфигурации в выражениях.
Казалось бы, причем здесь функции глобального контекста? Но факт остается фактом, без этого при компоновке вываливается приведенная вами ошибка. Проверено на версии платформы 8.3.8.1747.
<pre>
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
</pre>

h3. Функции округления в СКД в вычисляемых полях

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

Например:
<pre>
Цел(ОстатокУТ11*&КоэффициентОстатка/100) - ЕстьNull(ОстатокБухгалтерия,0)
//где &КоэффициентОстатка - Параметр
</pre>

h3. Приемы работы с СКД: делаем за 5 минут то, на что у других уйдет час

Использование функций, фреймвока

https://infostart.ru/public/864434/

h3. Программная инициализация КомпоновщикаНастроек на управляемой форме.

http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=576334
https://its.1c.ru/db/metod8dev/content/3480/hdoc

В *реквизитах формы* имеем реквизит АдресСхемыКомпоновкиДанных типа Строка. *обычной* форме можно использовать источник доступных настроек для схемы компоновки данных.

Пример:

<pre>
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
</pre>

В обработчике события формы ПриСозданииНаСервере пишем:
данном примере предполагается, что в переменной Схема находится схема компоновки данных.

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

В качестве адреса схемы компоновки данных может выступать *адрес* во временном хранилище, в которое поместили схему компоновки данных, или адрес значения в записи базы данных.

Пример создания источника доступных настроек для схемы, помещенной во временное хранилище:

<pre>
СхемаКомпоновкиДанных АдресСхемы = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОбъёмыРеализации");
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных,
ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);

Объект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));

Объект.КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
</pre>


При формировании данных пишем что-то типа такого:


В данном примере во временное хранилище помещается схема компоновки данных, находящаяся в переменной Схема.

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

<pre>
КомпоновщикМакета АдресСхемы = Новый КомпоновщикМакетаКомпоновкиДанных; ПолучитьНавигационнуюСсылку(Ссылка, "СхемаКомпоновкиДанных");
МакетКомпоновки = КомпоновщикМакета.Выполнить(ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных), Настройки); КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
</pre>

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