Проект

Общее

Профиль

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

« Предыдущее - Версия 11/19 (Разница(diff)) - Следующее » - Текущая версия
Всеволод Дорофеев, 30.03.2021 03:17


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

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

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

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

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

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

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

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

            КонецЕсли;

        КонецЦикла;

    КонецЕсли;

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

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

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

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

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

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

    Иначе

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

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

    КонецЕсли;

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

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

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

//****************************************************************************
// }}
//****************************************************************************

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

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

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

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

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

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

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

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

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

        КонецЕсли;

    КонецЦикла;

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

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

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

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

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

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

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

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

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

        КонецЕсли;

    КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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

В реквизитах формы имеем реквизит АдресСхемыКомпоновкиДанных типа Строка.

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

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

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

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

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