Проект

Общее

Профиль

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

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

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

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

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

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

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

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

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

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

Вариант 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

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

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

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

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

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

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

Агрегатные функции СКД

https://its.1c.ru/db/v837doc/bookmark/usr/TI000000255

Функция СКД ВычислитьВыражение() - Накопительный итог

Пример использования параметров

Если требуется рассчитать сумму с накоплением, то можно использовать следующее выражение:
Копировать в буфер обмена

ВычислитьВыражение("Сумма(СуммаОборот)", , , "Первая", "Текущая")

Если требуется получить значение группировки в предыдущей строке, то можно использовать следующее выражение:
Копировать в буфер обмена

ВычислитьВыражение("Курс", , , "Предыдущая")

Функция СКД КлассификацияABC

Синтаксис:

КлассификацияABC(Значение, КоличествоГрупп, ПроцентыДляГрупп, ИмяГруппировки)

Параметры:

● Значение – тип Строка. Значение, по которому нужно рассчитывать классификацию. Строка, в которой указано выражение;

● КоличествоГрупп – тип Число. Задает количество групп, на которое нужно разбить;

● ПроцентыДляГрупп – тип Число. Количество групп, на которое нужно разбить минус 1. Указывается через запятую;

● ИмяГруппировки – тип Строка. Имя группировки, в которой нужно вычислять группировку обработки. Если не указано, то вычисление происходит в текущей группировке. Если вычисление выполняется в таблице и параметр содержит пустую строку или не указан, то значение вычисляется для группировки-строки. Данное имя будет заменено на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.

Пример:

КлассификацияABC("Сумма([Количество Оборот])", 3)

Функция СКД СоединитьСтроки

https://1centerprise8.blogspot.com/2015/12/vyvod-tch-v-ja-chejku.html


СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок) - предназначена для объединения строк в одну строку.

    Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
    РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
    РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".

Массив([Различные] Выражение) - в качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра. Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным. Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.

Использовение нескольких СКД

https://1centerprise8.blogspot.com/2015/06/ispolzovanie-neskolkih-skd.html

Выбор макета при компоновке

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

 // Получаем необходимую СКД.
 НеобходимаяСКД = Неопределено;
 Если ЭтотОбъект.НомерСКД = 1 Тогда
  НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерОдин");
 ИначеЕсли ЭтотОбъект.НомерСКД = 2 Тогда
  НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерДва");
 КонецЕсли;

 // Устанавливаем выбранную СКД как основную.
 ЭтотОбъект.СхемаКомпоновкиДанных = НеобходимаяСКД;

 // Загружаем настройки выбранной СКД в компоновщик настроек.
 ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(НеобходимаяСКД);

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

 // Устанавливаем настройки.
 ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
 ПараметрВидЛица = Новый ПараметрКомпоновкиДанных("ЮрФизЛицо");
 ЗначениеВидЛица = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЛица);
 Если ЗначениеВидЛица <> Неопределено Тогда
  ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрВидЛица, ЭтотОбъект.ВидЛица);
 КонецЕсли;
 ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
 ПараметрТолькоНаОснСкладе = Новый ПараметрКомпоновкиДанных("НаОсновномСкладе");
 ЗначениеТолькоНаОснСкладе = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрТолькоНаОснСкладе);
 Если ЗначениеТолькоНаОснСкладе <> Неопределено Тогда
  ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрТолькоНаОснСкладе, ЭтотОбъект.ТолькоНаОсновномСкладе);
 КонецЕсли;

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

дополнение

//Когда выполняется стандартный алгоритм формирования отчета, нужно указать среди параметров ДанныеРасшифровки :

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

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

Восстановление настроек СКД

https://infostart.ru/1c/articles/1224243/

КомпоновщикНастроек.Восстановить()

Как вывести поле между ресурсами, как вывести реквизиты в произвольной позиции.

Настройки отчета - другие настройки - последняя настройка Авто позиция ресурсов (не использовать) -- будет использован порядок полей в выбранных.