Система компоновки данных (СКД) » История » Версия 15
Версия 14 (Всеволод Дорофеев, 23.04.2021 13:00) → Версия 15/19 (Всеволод Дорофеев, 23.04.2021 13:07)
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>
h3. Агрегатные функции СКД
https://its.1c.ru/db/v837doc/bookmark/usr/TI000000255
h3. Функция СКД КлассификацияABC
Синтаксис:
КлассификацияABC(Значение, КоличествоГрупп, ПроцентыДляГрупп, ИмяГруппировки)
Параметры:
● Значение – тип Строка. Значение, по которому нужно рассчитывать классификацию. Строка, в которой указано выражение;
● КоличествоГрупп – тип Число. Задает количество групп, на которое нужно разбить;
● ПроцентыДляГрупп – тип Число. Количество групп, на которое нужно разбить минус 1. Указывается через запятую;
● ИмяГруппировки – тип Строка. Имя группировки, в которой нужно вычислять группировку обработки. Если не указано, то вычисление происходит в текущей группировке. Если вычисление выполняется в таблице и параметр содержит пустую строку или не указан, то значение вычисляется для группировки-строки. Данное имя будет заменено на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.
Пример:
<pre>
КлассификацияABC("Сумма([Количество Оборот])", 3)
</pre>
h3. Функция СКД СоединитьСтроки
https://1centerprise8.blogspot.com/2015/12/vyvod-tch-v-ja-chejku.html
<pre>
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок) - предназначена для объединения строк в одну строку.
Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
Массив([Различные] Выражение) - в качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра. Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным. Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.
</pre>
h3. Использовение нескольких СКД
https://1centerprise8.blogspot.com/2015/06/ispolzovanie-neskolkih-skd.html
Выбор макета при компоновке
<pre>
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем необходимую СКД.
НеобходимаяСКД = Неопределено;
Если ЭтотОбъект.НомерСКД = 1 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерОдин");
ИначеЕсли ЭтотОбъект.НомерСКД = 2 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерДва");
КонецЕсли;
// Устанавливаем выбранную СКД как основную.
ЭтотОбъект.СхемаКомпоновкиДанных = НеобходимаяСКД;
// Загружаем настройки выбранной СКД в компоновщик настроек.
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(НеобходимаяСКД);
ЭтотОбъект.КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НеобходимаяСКД.НастройкиПоУмолчанию);
// Устанавливаем настройки.
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрВидЛица = Новый ПараметрКомпоновкиДанных("ЮрФизЛицо");
ЗначениеВидЛица = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЛица);
Если ЗначениеВидЛица <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрВидЛица, ЭтотОбъект.ВидЛица);
КонецЕсли;
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрТолькоНаОснСкладе = Новый ПараметрКомпоновкиДанных("НаОсновномСкладе");
ЗначениеТолькоНаОснСкладе = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрТолькоНаОснСкладе);
Если ЗначениеТолькоНаОснСкладе <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрТолькоНаОснСкладе, ЭтотОбъект.ТолькоНаОсновномСкладе);
КонецЕсли;
КонецПроцедуры
</pre>
дополнение
<pre>
//Когда выполняется стандартный алгоритм формирования отчета, нужно указать среди параметров ДанныеРасшифровки :
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
</pre>
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>
h3. Агрегатные функции СКД
https://its.1c.ru/db/v837doc/bookmark/usr/TI000000255
h3. Функция СКД КлассификацияABC
Синтаксис:
КлассификацияABC(Значение, КоличествоГрупп, ПроцентыДляГрупп, ИмяГруппировки)
Параметры:
● Значение – тип Строка. Значение, по которому нужно рассчитывать классификацию. Строка, в которой указано выражение;
● КоличествоГрупп – тип Число. Задает количество групп, на которое нужно разбить;
● ПроцентыДляГрупп – тип Число. Количество групп, на которое нужно разбить минус 1. Указывается через запятую;
● ИмяГруппировки – тип Строка. Имя группировки, в которой нужно вычислять группировку обработки. Если не указано, то вычисление происходит в текущей группировке. Если вычисление выполняется в таблице и параметр содержит пустую строку или не указан, то значение вычисляется для группировки-строки. Данное имя будет заменено на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.
Пример:
<pre>
КлассификацияABC("Сумма([Количество Оборот])", 3)
</pre>
h3. Функция СКД СоединитьСтроки
https://1centerprise8.blogspot.com/2015/12/vyvod-tch-v-ja-chejku.html
<pre>
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок) - предназначена для объединения строк в одну строку.
Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
Массив([Различные] Выражение) - в качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра. Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным. Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.
</pre>
h3. Использовение нескольких СКД
https://1centerprise8.blogspot.com/2015/06/ispolzovanie-neskolkih-skd.html
Выбор макета при компоновке
<pre>
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем необходимую СКД.
НеобходимаяСКД = Неопределено;
Если ЭтотОбъект.НомерСКД = 1 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерОдин");
ИначеЕсли ЭтотОбъект.НомерСКД = 2 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерДва");
КонецЕсли;
// Устанавливаем выбранную СКД как основную.
ЭтотОбъект.СхемаКомпоновкиДанных = НеобходимаяСКД;
// Загружаем настройки выбранной СКД в компоновщик настроек.
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(НеобходимаяСКД);
ЭтотОбъект.КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НеобходимаяСКД.НастройкиПоУмолчанию);
// Устанавливаем настройки.
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрВидЛица = Новый ПараметрКомпоновкиДанных("ЮрФизЛицо");
ЗначениеВидЛица = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЛица);
Если ЗначениеВидЛица <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрВидЛица, ЭтотОбъект.ВидЛица);
КонецЕсли;
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрТолькоНаОснСкладе = Новый ПараметрКомпоновкиДанных("НаОсновномСкладе");
ЗначениеТолькоНаОснСкладе = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрТолькоНаОснСкладе);
Если ЗначениеТолькоНаОснСкладе <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрТолькоНаОснСкладе, ЭтотОбъект.ТолькоНаОсновномСкладе);
КонецЕсли;
КонецПроцедуры
</pre>
дополнение
<pre>
//Когда выполняется стандартный алгоритм формирования отчета, нужно указать среди параметров ДанныеРасшифровки :
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
</pre>