-
Notifications
You must be signed in to change notification settings - Fork 5
/
rebuild.bsl
366 lines (273 loc) · 22.3 KB
/
rebuild.bsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
Перем Корень; // реквизит формы в оригинале
Процедура КнопкаНажатие(Элемент)
Корень = "Z:\Users\klimenko\Documents\Миграция_XML";
ИзменитьИдентификаторы(Корень, "Отчет");
ИзменитьИдентификаторы(Корень, "Обработка");
КонецПроцедуры
Процедура ИзменитьИдентификаторы(Каталог, ТипФайлов)
Если ТипФайлов = "Отчет" Тогда
Подкаталог = "Reports";
Тип = "Report";
ИначеЕсли ТипФайлов = "Обработка" Тогда
Подкаталог = "DataProcessors";
Тип = "DataProcessor";
Иначе
ВызватьИсключение "НеизвестныйТипФайлов";
КонецЕсли;
ПравилаОсновногоФайла = ПолучитьПравилаОсновногоФайла(Тип);
Для Каждого Файл Из НайтиФайлы(Каталог + "\" + Подкаталог, "*.xml") Цикл
ИмяОбъекта = Файл.ИмяБезРасширения;
ИмяОбъектаОригинальное = "";
ЗаменыИД = Новый Соответствие;
ПересобратьФайлПоПравилам(Файл.ПолноеИмя, ПравилаОсновногоФайла, Тип, ИмяОбъекта, ИмяОбъектаОригинальное, ЗаменыИД);
ПравилаПодчиненныхФайлов = ПолучитьПравилаПодчиненныхФайлов(Тип, ИмяОбъектаОригинальное);
Для Каждого ПодчиненныйФайл Из НайтиФайлы(Каталог + "\" + Подкаталог + "\" + ИмяОбъекта, "*.xml", Истина) Цикл
ПересобратьФайлПоПравилам(ПодчиненныйФайл.ПолноеИмя, ПравилаПодчиненныхФайлов, Тип, ИмяОбъекта, ИмяОбъектаОригинальное, ЗаменыИД);
КонецЦикла;
ИзменитьПодчиненныеФайлыFormBIN(Каталог + "\" + Подкаталог + "\" + ИмяОбъекта, ЗаменыИД);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьПравилаОсновногоФайла(Тип)
ЗаменаЭлементов = Новый Массив;
ЗаменаЭлементов.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть,Имя", "\MetaDataObject", "External" + Тип), Новый Структура("Имя", Код("Тип"))));
ЗаменаЭлементов.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть,Имя", "\MetaDataObject\" + Тип + "\InternalInfo", "xr:ContainedObject"), Новый Структура("Имя", Стр("xr:GeneratedType"))));
ЗаменаЭлементов.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть,Имя", "\MetaDataObject\" + Тип + "\InternalInfo\xr:GeneratedType", "xr:ClassId"), Новый Структура("Имя", Стр("xr:TypeId"))));
ЗаменаЭлементов.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть,Имя", "\MetaDataObject\" + Тип + "\InternalInfo\xr:GeneratedType", "xr:ObjectId"), Новый Структура("Имя", Стр("xr:ValueId"))));
Код_Значение_3 = Код("СтрПолучитьСтроку(СтрЗаменить(Значение, Точка, Символы.ПС), 3)");
Код_Значение_4 = Код("СтрПолучитьСтроку(СтрЗаменить(Значение, Точка, Символы.ПС), 4)");
ЗаменаАтрибутов = Новый Массив;
Замена = Новый Структура("Условия,Замена", Новый Массив, Неопределено);
Замена.Условия.Добавить("ТекущийПуть" + "=" + """\MetaDataObject\" + Тип + "\InternalInfo\xr:GeneratedType""");
Замена.Условия.Добавить("Имя" + "=" + """name""");
Замена.Замена = Новый Структура("Значение", Код("Тип") + "+" + Стр("Object.") + "+" + Код("ИмяОбъекта"));
ЗаменаАтрибутов.Добавить(Замена);
Замена = Новый Структура("Условия,Замена,Повторяется", Новый Массив, Неопределено, Истина);
Замена.Условия.Добавить("ИмяУзла" + "=" + """xr:GeneratedType""");
Замена.Условия.Добавить("Имя" + "=" + """name""");
Замена.Условия.Добавить("СтрНачинаетсяС(Значение, """ + Тип + "TabularSection."")");
Замена.Замена = Новый Структура("Значение", Код("Тип") + "+" + Стр("TabularSection.") + "+" + Код("ИмяОбъекта") + "+" + Стр(".") + "+" + Код_Значение_3);
ЗаменаАтрибутов.Добавить(Замена);
Замена = Новый Структура("Условия,Замена,Повторяется", Новый Массив, Неопределено, Истина);
Замена.Условия.Добавить("ИмяУзла" + "=" + """xr:GeneratedType""");
Замена.Условия.Добавить("Имя" + "=" + """name""");
Замена.Условия.Добавить("СтрНачинаетсяС(Значение, """ + Тип + "TabularSectionRow."")");
Замена.Замена = Новый Структура("Значение", Код("Тип") + "+" + Стр("TabularSectionRow.") + "+" + Код("ИмяОбъекта") + "+" + Стр(".") + "+" + Код_Значение_3);
ЗаменаАтрибутов.Добавить(Замена);
Тип_Имя_34 = Код("Тип") + "+" + Стр(".") + "+" + Код("ИмяОбъекта") + "+" + Стр(".") + "+" + Код_Значение_3 + "+" + Стр(".") + "+" + Код_Значение_4;
ЗаменаТекста = Новый Массив;
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\Name"), Новый Структура("Значение", Код("ИмяОбъекта"))));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\DefaultForm"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\AuxiliaryForm"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\MainDataCompositionSchema"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\DefaultSettingsForm"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\AuxiliarySettingsForm"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ТекущийПуть", "\MetaDataObject\" + Тип + "\Properties\DefaultVariantForm"), Новый Структура("Значение", Тип_Имя_34)));
ЗаменаТекстаИД = Новый Массив;
ЗаменаТекстаИД.Добавить("xr:TypeId");
ЗаменаТекстаИД.Добавить("xr:ValueId");
ОбработчикиСобытияЗаменаЭлементовПосле = Новый Соответствие;
ОбработчикиСобытияЗаменаЭлементовПосле.Вставить(
"ТекущийПуть = ""\MetaDataObject\"" + Тип + ""\InternalInfo\xr:GeneratedType"" И Чтение.КоличествоАтрибутов() = 0",
"Запись.ЗаписатьАтрибут(""name"", Тип + ""Manager."" + ИмяОбъекта);
|Запись.ЗаписатьАтрибут(""category"", ""Manager"");
|СтандартнаяОбработка = Ложь;"
);
ОбработчикиСобытияЗаменаТекстаПеред = Новый Соответствие;
ОбработчикиСобытияЗаменаТекстаПеред.Вставить(
"ТекущийПуть = ""\MetaDataObject\"" + Тип + ""\Properties\Name""",
"ИмяОбъектаОригинальное = Значение"
);
Правила = Новый Соответствие;
Правила.Вставить("ЗаменаЭлементов", ЗначениеВСтрокуВнутр(ЗаменаЭлементов));
Правила.Вставить("ЗаменаАтрибутов", ЗначениеВСтрокуВнутр(ЗаменаАтрибутов));
Правила.Вставить("ЗаменаТекста", ЗначениеВСтрокуВнутр(ЗаменаТекста));
Правила.Вставить("ЗаменаТекстаИД", ЗначениеВСтрокуВнутр(ЗаменаТекстаИД));
Правила.Вставить("ОбработчикиСобытияЗаменаЭлементовПосле", ЗначениеВСтрокуВнутр(ОбработчикиСобытияЗаменаЭлементовПосле));
Правила.Вставить("ОбработчикиСобытияЗаменаТекстаПеред", ЗначениеВСтрокуВнутр(ОбработчикиСобытияЗаменаТекстаПеред));
//Правила.Вставить("Тип", ЗначениеВСтрокуВнутр(Тип));
Возврат Правила;
КонецФункции
Функция ПолучитьПравилаПодчиненныхФайлов(Тип, ИмяОбъектаОригинальное)
ЗаменаТекста = Новый Массив;
ЗаменаТекста.Добавить(Новый Структура("Условие,Замена", Новый Структура("ИмяУзла,Значение", "v8:Type", "cfg:External" + Тип + "Object." + ИмяОбъектаОригинальное), Новый Структура("Значение", Стр("cfg:" + Тип + "Object.") + "+" + Код("ИмяОбъекта"))));
Правила = Новый Соответствие;
Правила.Вставить("ЗаменаТекста", ЗначениеВСтрокуВнутр(ЗаменаТекста));
//Правила.Вставить("Тип", ЗначениеВСтрокуВнутр(Тип));
Возврат Правила;
КонецФункции
Процедура ПересобратьФайлПоПравилам(ПолноеИмяФайла, Правила, Тип, ИмяОбъекта, ИмяОбъектаОригинальное, ЗаменыИД)
АлгоритмЗаменыПростой =
"Если Не МассивЗамен = Неопределено Тогда
| Для ИндексВарианта = 0 По МассивЗамен.ВГраница() Цикл
| Вариант = МассивЗамен[ИндексВарианта];
| Если Вычислить(КодУсловия(Вариант.Условие)) Тогда
| Выполнить(КодЗамены(Вариант.Замена));
| Если Не Вариант.Свойство(""Повторяется"") ИЛИ Не Вариант.Повторяется Тогда
| МассивЗамен.Удалить(ИндексВарианта);
| КонецЕсли;
| Прервать;
| КонецЕсли;
| КонецЦикла;
|КонецЕсли;";
АлгоритмЗаменыСложный =
"Если Не МассивЗамен = Неопределено Тогда
| Для ИндексВарианта = 0 По МассивЗамен.ВГраница() Цикл
| Вариант = МассивЗамен[ИндексВарианта];
| Ок = Истина;
| Для Каждого Условие Из Вариант.Условия Цикл
| Ок = Ок И Вычислить(Условие);
| Если Не Ок Тогда
| Прервать;
| КонецЕсли;
| КонецЦикла;
| Если Ок Тогда
| Выполнить(КодЗамены(Вариант.Замена));
| Если Не Вариант.Свойство(""Повторяется"") ИЛИ Не Вариант.Повторяется Тогда
| МассивЗамен.Удалить(ИндексВарианта);
| КонецЕсли;
| Прервать;
| КонецЕсли;
| КонецЦикла;
|КонецЕсли;";
АлгоритмОбработчикаСобытия =
"СтандартнаяОбработка = Истина;
|Если Не ОбработчикиСобытия = Неопределено Тогда
| Для Каждого УсловиеКод Из ОбработчикиСобытия Цикл
| Если Вычислить(УсловиеКод.Ключ) Тогда
| Выполнить(УсловиеКод.Значение);
| ОбработчикиСобытия.Удалить(УсловиеКод.Ключ);
| Прервать;
| КонецЕсли;
| КонецЦикла;
|КонецЕсли;";
Точка = ".";
ЗаменаЭлементов = Неопределено;
ЗаменаАтрибутов = Неопределено;
ЗаменаТекста = Неопределено;
ЗаменаТекстаИД = Неопределено;
ОбработчикиСобытияЗаменаЭлементовПосле = Неопределено;
ОбработчикиСобытияЗаменаТекстаПеред = Неопределено;
Для Каждого Правило Из Правила Цикл
Выполнить(Правило.Ключ + " = ЗначениеИзСтрокиВнутр(Правило.Значение)");
КонецЦикла;
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПолноеИмяФайла);
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Запись.ЗаписатьОбъявлениеXML();
Путь = Новый Массив;
Путь.Добавить("");
ТекущийПуть = Путь[Путь.ВГраница()];
СтандартнаяОбработка = Истина;
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Запись.ЗаписатьКонецЭлемента();
Путь.Удалить(Путь.ВГраница());
ТекущийПуть = Путь[Путь.ВГраница()];
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Имя = Чтение.Имя;
МассивЗамен = ЗаменаЭлементов;
Выполнить(АлгоритмЗаменыПростой);
ИмяУзла = Имя;
Запись.ЗаписатьНачалоЭлемента(Имя);
Путь.Добавить(ТекущийПуть + "\" + Имя);
ТекущийПуть = Путь[Путь.ВГраница()];
ОбработчикиСобытия = ОбработчикиСобытияЗаменаЭлементовПосле;
Выполнить(АлгоритмОбработчикаСобытия);
Если СтандартнаяОбработка Тогда
ЧтениеАтрибута = "Чтение.ПервыйАтрибут()";
Пока Вычислить(ЧтениеАтрибута) Цикл
Имя = Чтение.Имя;
Значение = Чтение.Значение;
Если Имя = "uuid" Тогда
Если ЗаменыИД.Получить(Значение) = Неопределено Тогда
ЗаменыИД.Вставить(Значение, Строка(Новый УникальныйИдентификатор()));
КонецЕсли;
Значение = ЗаменыИД.Получить(Значение);
Иначе
МассивЗамен = ЗаменаАтрибутов;
Выполнить(АлгоритмЗаменыСложный);
КонецЕсли;
Запись.ЗаписатьАтрибут(Имя, Значение);
ЧтениеАтрибута = "Чтение.СледующийАтрибут()";
КонецЦикла;
КонецЕсли;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
Значение = Чтение.Значение;
ОбработчикиСобытия = ОбработчикиСобытияЗаменаТекстаПеред;
Выполнить(АлгоритмОбработчикаСобытия);
Если СтандартнаяОбработка Тогда
Если ЗаменаТекстаИД = Неопределено Или ЗаменаТекстаИД.Найти(ИмяУзла) = Неопределено Тогда
МассивЗамен = ЗаменаТекста;
Выполнить(АлгоритмЗаменыПростой);
Иначе
Если ЗаменыИД.Получить(Значение) = Неопределено Тогда
ЗаменыИД.Вставить(Значение, Строка(Новый УникальныйИдентификатор()));
КонецЕсли;
Значение = ЗаменыИД.Получить(Значение);
КонецЕсли;
КонецЕсли;
Запись.ЗаписатьТекст(Значение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(Запись.Закрыть());
Текст.Записать(ПолноеИмяФайла);
КонецПроцедуры
Процедура ИзменитьПодчиненныеФайлыFormBIN(Каталог, ЗаменыИД)
Буферы = Новый Массив;
Для Каждого КлючЗначение Из ЗаменыИД Цикл
Было = Новый БуферДвоичныхДанных(36);
Стало = Новый БуферДвоичныхДанных(36);
Для Номер = 1 По 36 Цикл
Было.Установить(Номер-1, КодСимвола(КлючЗначение.Ключ, Номер));
Стало.Установить(Номер-1, КодСимвола(КлючЗначение.Значение, Номер));
КонецЦикла;
Буферы.Добавить(Новый Структура("Было,Стало", Было, Стало));
КонецЦикла;
Для Каждого Файл Из НайтиФайлы(Каталог, "Form.bin", Истина) Цикл
Чтение = Новый ЧтениеДанных(Файл.ПолноеИмя);
ТелоФайла = Чтение.ПрочитатьВБуферДвоичныхДанных();
Чтение.Закрыть();
Для Каждого БылоСтало Из Буферы Цикл
Разделитель = БылоСтало.Было;
РазделительНовый = БылоСтало.Стало;
М = ТелоФайла.Разделить(Разделитель);
Смещение = М[0].Размер;
Для ИндексМассива = 1 По М.ВГраница() Цикл
Для ИндексСимвола = 0 По РазделительНовый.Размер-1 Цикл
ТелоФайла.Установить(Смещение + ИндексСимвола, РазделительНовый[ИндексСимвола]);
КонецЦикла;
Смещение = Смещение + РазделительНовый.Размер + М[ИндексМассива].Размер;
КонецЦикла;
КонецЦикла;
Запись = Новый ЗаписьДанных(Файл.ПолноеИмя);
Запись.ЗаписатьБуферДвоичныхДанных(ТелоФайла);
Запись.Закрыть();
КонецЦикла;
КонецПроцедуры
Функция КодУсловия(Структура)
Код = "ИСТИНА";
Для Каждого КЗ Из Структура Цикл
Код = Код + " И " + КЗ.Ключ + " = """ + КЗ.Значение + """";
КонецЦикла;
Возврат Код;
КонецФункции
Функция КодЗамены(Структура)
Код = "";
Для Каждого КЗ Из Структура Цикл
Код = Код + "
|" + КЗ.Ключ + " = Вычислить(""" + КЗ.Значение + """);";
КонецЦикла;
Возврат Код;
КонецФункции
Функция Код(Код)
Возврат "Вычислить(""""""""""""""""""""+" + Код + "+"""""""""""""""""""")";
КонецФункции
Функция Стр(Стр)
Возврат """""" + Стр + """""";
КонецФункции
Функция СтрНачинаетсяС(Строка, ПодстрокаПоиска)
Возврат Найти(Строка, ПодстрокаПоиска) = 1;
КонецФункции