Проект

Общее

Профиль

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

Всеволод Дорофеев, 30.03.2021 03:17

1 1 Всеволод Дорофеев
h1. Система компоновки данных (СКД)
2 1 Всеволод Дорофеев
3 1 Всеволод Дорофеев
h3. Программное выполнение СКД с выводом в таблицу значений
4 1 Всеволод Дорофеев
5 1 Всеволод Дорофеев
<pre>
6 1 Всеволод Дорофеев
&НаСервере
7 1 Всеволод Дорофеев
Процедура ПеренестиНоменклатуруСервере()
8 1 Всеволод Дорофеев
	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
9 1 Всеволод Дорофеев
	СхемаНоменклатуры = ОбъектНаСервере.ПолучитьМакет("СКД");          
10 1 Всеволод Дорофеев
11 2 Всеволод Дорофеев
	//СКД. Программная установка параметров в управляемой форме отчета
12 2 Всеволод Дорофеев
    ПараметрДанных = КомпоновщикНаФорме.Настройки.ПараметрыДанных.Элементы.Найти("ГруппаНоменклатуры");
13 1 Всеволод Дорофеев
	ПараметрДанных.Использование = Истина;
14 1 Всеволод Дорофеев
	ПараметрДанных.Значение  = Объект.ПапкаАрхив;  
15 1 Всеволод Дорофеев
	
16 1 Всеволод Дорофеев
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
17 1 Всеволод Дорофеев
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаНоменклатуры, КомпоновщикНаФорме.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
18 1 Всеволод Дорофеев
                               
19 1 Всеволод Дорофеев
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
20 1 Всеволод Дорофеев
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,, Истина);
21 1 Всеволод Дорофеев
	
22 1 Всеволод Дорофеев
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
23 1 Всеволод Дорофеев
                               
24 1 Всеволод Дорофеев
    ТЗНоменклатура = Новый ТаблицаЗначений;
25 1 Всеволод Дорофеев
    ПроцессорВывода.УстановитьОбъект(ТЗНоменклатура);
26 1 Всеволод Дорофеев
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
27 1 Всеволод Дорофеев
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
28 1 Всеволод Дорофеев
	
29 1 Всеволод Дорофеев
	Для каждого СтрокаТЗ из ТЗНоменклатура Цикл
30 1 Всеволод Дорофеев
		ОбработкаОбъект.ПеренестиНоменклатурнуюПозициюВПапкуНаСервере(СтрокаТЗ);
31 1 Всеволод Дорофеев
	КонецЦикла;
32 1 Всеволод Дорофеев
	
33 1 Всеволод Дорофеев
КонецПроцедуры
34 1 Всеволод Дорофеев
</pre>
35 5 Всеволод Дорофеев
Вариант 2.
36 5 Всеволод Дорофеев
<pre>
37 5 Всеволод Дорофеев
Процедура СформироватьОтчетВТаблицуЗначений(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина, ВнешниеНаборыДанных = Неопределено) Экспорт
38 5 Всеволод Дорофеев
39 5 Всеволод Дорофеев
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
40 5 Всеволод Дорофеев
41 5 Всеволод Дорофеев
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
42 5 Всеволод Дорофеев
43 5 Всеволод Дорофеев
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
44 5 Всеволод Дорофеев
        КомпоновщикНастроек.Настройки, , ,
45 5 Всеволод Дорофеев
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
46 5 Всеволод Дорофеев
47 5 Всеволод Дорофеев
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
48 5 Всеволод Дорофеев
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
49 5 Всеволод Дорофеев
50 5 Всеволод Дорофеев
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
51 5 Всеволод Дорофеев
52 5 Всеволод Дорофеев
    ПроцессорВывода.УстановитьОбъект(Результат);
53 5 Всеволод Дорофеев
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
54 5 Всеволод Дорофеев
55 5 Всеволод Дорофеев
КонецПроцедуры
56 5 Всеволод Дорофеев
57 5 Всеволод Дорофеев
//Пример вызова:
58 5 Всеволод Дорофеев
Результат = новый ТаблицаЗначений;
59 5 Всеволод Дорофеев
СформироватьОтчетВТаблицуЗначений(Результат, ЭтаФорма.ДанныеРасшифровки);
60 5 Всеволод Дорофеев
</pre>
61 5 Всеволод Дорофеев
62 3 Всеволод Дорофеев
63 3 Всеволод Дорофеев
h3.  ШАБЛОНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ СКД
64 3 Всеволод Дорофеев
65 3 Всеволод Дорофеев
<pre>
66 3 Всеволод Дорофеев
//****************************************************************************
67 3 Всеволод Дорофеев
// ШАБЛОНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ СКД
68 3 Всеволод Дорофеев
// {{
69 3 Всеволод Дорофеев
//****************************************************************************
70 3 Всеволод Дорофеев
// Заполняет переданный объект на основани СКД
71 3 Всеволод Дорофеев
//
72 3 Всеволод Дорофеев
// Параметры
73 3 Всеволод Дорофеев
//
74 3 Всеволод Дорофеев
//  СКД – собствеено настройки СКД
75 3 Всеволод Дорофеев
//
76 3 Всеволод Дорофеев
//  ОбъектДляЗагрузки – объект в который выгружаются данные, таблица значений, дерево значений, табличный документ
77 3 Всеволод Дорофеев
//
78 3 Всеволод Дорофеев
//  ИсполняемыеНастройки – Пользовательские настройки СКД если не указаны будут использованы настроки СКД по умолчанию
79 3 Всеволод Дорофеев
//
80 3 Всеволод Дорофеев
//  СтруктураПараметров - Структура – Передаваемые для СКД параметры
81 3 Всеволод Дорофеев
//
82 3 Всеволод Дорофеев
//  ДеревоЗначений = Новый ДеревоЗначений;
83 3 Всеволод Дорофеев
//
84 3 Всеволод Дорофеев
//  ПРИМЕР ВЫЗОВА
85 3 Всеволод Дорофеев
//    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
86 3 Всеволод Дорофеев
//    СтруктураПараметров = Новый Структура("ДатаОтчета", НашаДата);
87 3 Всеволод Дорофеев
//    ПолучитьДанныеНаОснованииСКД(СхемаКомпоновкиДанных, ДеревоЗначений, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, СтруктураПараметров);
88 3 Всеволод Дорофеев
//
89 3 Всеволод Дорофеев
&НаСервере
90 3 Всеволод Дорофеев
Процедура ПолучитьДанныеНаОснованииСКД(СКД, ОбъектДляЗагрузки, ИсполняемыеНастройки = Неопределено, СтруктураПараметров = Неопределено, РасшифровкаСКД = Неопределено, МакетКомпоновки = Неопределено, ВнешниеНаборыДанных = Неопределено) Экспорт
91 3 Всеволод Дорофеев
92 3 Всеволод Дорофеев
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
93 3 Всеволод Дорофеев
94 3 Всеволод Дорофеев
    //Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") ИЛИ ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
95 3 Всеволод Дорофеев
    Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
96 3 Всеволод Дорофеев
        ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанных");
97 3 Всеволод Дорофеев
    Иначе
98 3 Всеволод Дорофеев
        ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
99 3 Всеволод Дорофеев
    КонецЕсли;
100 3 Всеволод Дорофеев
101 3 Всеволод Дорофеев
    Если ИсполняемыеНастройки = Неопределено Тогда
102 3 Всеволод Дорофеев
103 3 Всеволод Дорофеев
        ИсполняемыеНастройки = СКД.НастройкиПоУмолчанию;
104 3 Всеволод Дорофеев
105 3 Всеволод Дорофеев
    КонецЕсли;
106 3 Всеволод Дорофеев
107 3 Всеволод Дорофеев
    Если СтруктураПараметров <> Неопределено Тогда
108 3 Всеволод Дорофеев
109 3 Всеволод Дорофеев
        КоллекцияЗначенийПараметров = ИсполняемыеНастройки.ПараметрыДанных.Элементы;
110 3 Всеволод Дорофеев
111 3 Всеволод Дорофеев
        Для каждого Параметр Из СтруктураПараметров Цикл
112 3 Всеволод Дорофеев
113 3 Всеволод Дорофеев
            НайденноеЗначениеПараметра = КоллекцияЗначенийПараметров.Найти(Параметр.Ключ);
114 3 Всеволод Дорофеев
115 3 Всеволод Дорофеев
            Если НайденноеЗначениеПараметра <> Неопределено Тогда
116 3 Всеволод Дорофеев
117 3 Всеволод Дорофеев
                НайденноеЗначениеПараметра.Использование = Истина;
118 3 Всеволод Дорофеев
119 3 Всеволод Дорофеев
                НайденноеЗначениеПараметра.Значение = Параметр.Значение;
120 3 Всеволод Дорофеев
121 3 Всеволод Дорофеев
            КонецЕсли;
122 3 Всеволод Дорофеев
123 3 Всеволод Дорофеев
        КонецЦикла;
124 3 Всеволод Дорофеев
125 3 Всеволод Дорофеев
    КонецЕсли;
126 3 Всеволод Дорофеев
127 3 Всеволод Дорофеев
    МакетКомпоновкиСКД = КомпоновщикМакета.Выполнить(СКД, ИсполняемыеНастройки, РасшифровкаСКД, МакетКомпоновки, ТипГенератора);
128 3 Всеволод Дорофеев
129 3 Всеволод Дорофеев
    ПроцессорКомпановки = Новый ПроцессорКомпоновкиДанных;
130 3 Всеволод Дорофеев
131 6 Всеволод Дорофеев
    ПроцессорКомпановки.Инициализировать(МакетКомпоновкиСКД, ВнешниеНаборыДанных, РасшифровкаСКД, Истина);
132 3 Всеволод Дорофеев
133 3 Всеволод Дорофеев
    //Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") ИЛИ ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
134 3 Всеволод Дорофеев
    Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
135 3 Всеволод Дорофеев
136 3 Всеволод Дорофеев
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
137 3 Всеволод Дорофеев
138 3 Всеволод Дорофеев
        ПроцессорВывода.УстановитьДокумент(ОбъектДляЗагрузки);
139 3 Всеволод Дорофеев
140 3 Всеволод Дорофеев
    Иначе
141 3 Всеволод Дорофеев
142 3 Всеволод Дорофеев
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
143 3 Всеволод Дорофеев
144 3 Всеволод Дорофеев
        ПроцессорВывода.УстановитьОбъект(ОбъектДляЗагрузки);
145 3 Всеволод Дорофеев
146 3 Всеволод Дорофеев
    КонецЕсли;
147 3 Всеволод Дорофеев
148 3 Всеволод Дорофеев
    ПроцессорВывода.ОтображатьПроцентВывода = Истина;
149 3 Всеволод Дорофеев
150 3 Всеволод Дорофеев
    ПроцессорВывода.Вывести(ПроцессорКомпановки, Истина);
151 3 Всеволод Дорофеев
152 3 Всеволод Дорофеев
КонецПроцедуры // ПолучитьДанныеНаОснованииСКД()
153 3 Всеволод Дорофеев
154 3 Всеволод Дорофеев
//****************************************************************************
155 3 Всеволод Дорофеев
// }}
156 3 Всеволод Дорофеев
//****************************************************************************
157 3 Всеволод Дорофеев
</pre>
158 4 Всеволод Дорофеев
159 4 Всеволод Дорофеев
h3. Смена схемы СКД
160 4 Всеволод Дорофеев
161 4 Всеволод Дорофеев
<pre>
162 4 Всеволод Дорофеев
Функция СохранитьПараметры(ИменаПараметров)
163 4 Всеволод Дорофеев
164 4 Всеволод Дорофеев
    Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
165 4 Всеволод Дорофеев
166 4 Всеволод Дорофеев
    МассивСИменами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ИменаПараметров,",");
167 4 Всеволод Дорофеев
168 4 Всеволод Дорофеев
    СтруктураДляПараметров = Новый Структура;
169 4 Всеволод Дорофеев
170 4 Всеволод Дорофеев
    Для Каждого ИмяПараметра Из МассивСИменами Цикл
171 4 Всеволод Дорофеев
172 4 Всеволод Дорофеев
        Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
173 4 Всеволод Дорофеев
174 4 Всеволод Дорофеев
        Если Параметр <> Неопределено Тогда
175 4 Всеволод Дорофеев
176 4 Всеволод Дорофеев
            СтруктураДляПараметров.Вставить(ИмяПараметра, Параметр.Значение);
177 4 Всеволод Дорофеев
178 4 Всеволод Дорофеев
        КонецЕсли;
179 4 Всеволод Дорофеев
180 4 Всеволод Дорофеев
    КонецЦикла;
181 4 Всеволод Дорофеев
182 4 Всеволод Дорофеев
183 4 Всеволод Дорофеев
184 4 Всеволод Дорофеев
Возврат СтруктураДляПараметров;
185 4 Всеволод Дорофеев
186 4 Всеволод Дорофеев
КонецФункции
187 4 Всеволод Дорофеев
188 4 Всеволод Дорофеев
189 4 Всеволод Дорофеев
190 4 Всеволод Дорофеев
191 4 Всеволод Дорофеев
192 4 Всеволод Дорофеев
Процедура ЗагрузитьПараметры(СтруктураСПараметрами)
193 4 Всеволод Дорофеев
194 4 Всеволод Дорофеев
    Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
195 4 Всеволод Дорофеев
196 4 Всеволод Дорофеев
    Для Каждого ТекущийПараметр Из СтруктураСПараметрами Цикл
197 4 Всеволод Дорофеев
198 4 Всеволод Дорофеев
        Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекущийПараметр.Ключ));
199 4 Всеволод Дорофеев
200 4 Всеволод Дорофеев
        Если Параметр <> Неопределено Тогда
201 4 Всеволод Дорофеев
202 4 Всеволод Дорофеев
            Параметр.Значение = ТекущийПараметр.Значение;
203 4 Всеволод Дорофеев
204 4 Всеволод Дорофеев
            Параметр.Использование = Истина;
205 4 Всеволод Дорофеев
206 4 Всеволод Дорофеев
        КонецЕсли;
207 4 Всеволод Дорофеев
208 4 Всеволод Дорофеев
    КонецЦикла;
209 4 Всеволод Дорофеев
210 4 Всеволод Дорофеев
КонецПроцедуры
211 4 Всеволод Дорофеев
212 4 Всеволод Дорофеев
213 4 Всеволод Дорофеев
214 4 Всеволод Дорофеев
215 4 Всеволод Дорофеев
216 4 Всеволод Дорофеев
Процедура СменитьСхему()
217 4 Всеволод Дорофеев
218 4 Всеволод Дорофеев
    СтруктураСНастройками = СохранитьПараметры("Параметр1,Параметр2,Параметр3");
219 4 Всеволод Дорофеев
220 4 Всеволод Дорофеев
    СхемаКомпоновкиДанных = ПолучитьМакет("ЗдесьИмяНужнойВамСхемы");
221 4 Всеволод Дорофеев
222 4 Всеволод Дорофеев
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
223 4 Всеволод Дорофеев
224 4 Всеволод Дорофеев
    КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
225 4 Всеволод Дорофеев
226 4 Всеволод Дорофеев
    ЗагрузитьПараметры(СтруктураСНастройками);
227 4 Всеволод Дорофеев
228 1 Всеволод Дорофеев
КонецПроцедуры
229 6 Всеволод Дорофеев
</pre>
230 6 Всеволод Дорофеев
231 6 Всеволод Дорофеев
h3. Как в СКД получить GUID (ГУИД) объекта
232 6 Всеволод Дорофеев
233 6 Всеволод Дорофеев
В вычисляемые поля добавить выражение "XMLСтрока(Номенклатура)"
234 6 Всеволод Дорофеев
235 6 Всеволод Дорофеев
Все работает если процессор компоновки инициализировать программно и четвертым параметром указать использование общих модулей конфигурации в выражениях.
236 6 Всеволод Дорофеев
Казалось бы, причем здесь функции глобального контекста? Но факт остается фактом, без этого при компоновке вываливается приведенная вами ошибка. Проверено на версии платформы 8.3.8.1747.
237 6 Всеволод Дорофеев
<pre>
238 6 Всеволод Дорофеев
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
239 4 Всеволод Дорофеев
</pre>
240 7 Всеволод Дорофеев
241 7 Всеволод Дорофеев
h3. Функции округления в СКД в вычисляемых полях
242 7 Всеволод Дорофеев
243 7 Всеволод Дорофеев
В выражении вычисляемого поля можно использовать функции платформы, например: Окр() (без третьего параметра), Цел(), Макс()
244 7 Всеволод Дорофеев
Так же можно использовать функции общих модулей.
245 7 Всеволод Дорофеев
246 8 Всеволод Дорофеев
Например:
247 7 Всеволод Дорофеев
<pre>
248 1 Всеволод Дорофеев
Цел(ОстатокУТ11*&КоэффициентОстатка/100) - ЕстьNull(ОстатокБухгалтерия,0)
249 8 Всеволод Дорофеев
//где &КоэффициентОстатка - Параметр
250 7 Всеволод Дорофеев
</pre>
251 9 Всеволод Дорофеев
252 9 Всеволод Дорофеев
h3. Приемы работы с СКД: делаем за 5 минут то, на что у других уйдет час
253 9 Всеволод Дорофеев
254 9 Всеволод Дорофеев
Использование функций, фреймвока
255 9 Всеволод Дорофеев
256 9 Всеволод Дорофеев
https://infostart.ru/public/864434/
257 10 Всеволод Дорофеев
258 11 Всеволод Дорофеев
h3. Программная инициализация КомпоновщикаНастроек на управляемой форме.
259 1 Всеволод Дорофеев
260 11 Всеволод Дорофеев
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=576334
261 1 Всеволод Дорофеев
https://its.1c.ru/db/metod8dev/content/3480/hdoc
262 10 Всеволод Дорофеев
263 11 Всеволод Дорофеев
В *реквизитах формы* имеем реквизит АдресСхемыКомпоновкиДанных типа Строка.
264 10 Всеволод Дорофеев
265 11 Всеволод Дорофеев
В обработчике события формы ПриСозданииНаСервере пишем:
266 10 Всеволод Дорофеев
<pre>
267 11 Всеволод Дорофеев
СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОбъёмыРеализации");
268 11 Всеволод Дорофеев
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
269 10 Всеволод Дорофеев
270 11 Всеволод Дорофеев
Объект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));
271 11 Всеволод Дорофеев
Объект.КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
272 10 Всеволод Дорофеев
</pre>
273 11 Всеволод Дорофеев
 
274 10 Всеволод Дорофеев
275 11 Всеволод Дорофеев
При формировании данных пишем что-то типа такого:
276 10 Всеволод Дорофеев
<pre>
277 11 Всеволод Дорофеев
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
278 11 Всеволод Дорофеев
МакетКомпоновки = КомпоновщикМакета.Выполнить(ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных), Настройки);
279 10 Всеволод Дорофеев
</pre>