forked from otymko/acc-export
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdatecr.os
154 lines (108 loc) · 6.21 KB
/
updatecr.os
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
// Нужно отрефакторить, сделано на скорую руку
Перем КаталогИсходных;
Перем СписокПроблемныхМодулей;
Перем СписокВременныхФайлов;
Процедура ЗапуститьОбработку()
СписокМодулей = НайтиФайлы(ОбъединитьПути(КаталогИсходных, ""), "*.bsl", Истина);
КоличествоМодулей = СписокМодулей.Количество();
НомерМодуля = 1;
Для Каждого Модуль Из СписокМодулей Цикл
Если Модуль.Расшение = "bsltmp" Тогда
Продолжить;
КонецЕсли;
Сообщить(СтрШаблон("Обработка %1 из %2", НомерМодуля, КоличествоМодулей));
ИмяФайла = Модуль.ПолноеИмя;
Если ЕстьОдиночныеCR(ИмяФайла) Тогда
СписокПроблемныхМодулей.Добавить(ИмяФайла);
КонецЕсли;
НомерМодуля = НомерМодуля + 1;
КонецЦикла;
Сообщить("Найден модулей: " + СписокПроблемныхМодулей.Количество());
Для Каждого Модуль Из СписокПроблемныхМодулей Цикл
Сообщить("Исправление: " + Модуль);
ЗаменитьОдиночныеCR(Модуль);
КонецЦикла;
КонецПроцедуры
Функция ЗаменитьОдиночныеCR(ИмяФайла)
ДвоичныеДанныеТело = Новый ДвоичныеДанные(ИмяФайла);
Размер = ДвоичныеДанныеТело.Размер();
ДвоичныеДанныеТело = Неопределено;
ВременныйФайл = ПолучитьИмяВременногоФайла("bsl");
ФайловыйПоток = ФайловыеПотоки.ОткрытьДляЧтения(ИмяФайла);
ЧтениеДанных = Новый ЧтениеДанных(ФайловыйПоток, КодировкаТекста.UTF8);
Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(Размер);
МойБуфер = Новый Массив;
Для Каждого Байт Из Буфер Цикл
Если Байт = 10 Тогда
Продолжить;
КонецЕсли;
МойБуфер.Добавить(Байт);
КонецЦикла;
ФайловыйПоток.Закрыть();
Запись = Новый ЗаписьДанных(ВременныйФайл, КодировкаТекста.UTF8);
Пропустить = 1;
Для Каждого Байт Из МойБуфер Цикл
Если Пропустить > 3 Тогда
Запись.ЗаписатьБайт(Байт);
Если Байт = 13 Тогда
Запись.ЗаписатьБайт(10);
КонецЕсли;
КонецЕсли;
Пропустить = Пропустить + 1;
КонецЦикла;
Запись.Закрыть();
ВременныйФайлИсходника = ИмяФайла + "tmp";
КопироватьФайл(ИмяФайла, ВременныйФайлИсходника);
СписокВременныхФайлов.Добавить(ВременныйФайл);
СписокВременныхФайлов.Добавить(ВременныйФайлИсходника);
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
Сообщить("Не удалось обработать файл: " + ИмяФайла);
КонецПопытки;
ПереместитьФайл(ВременныйФайл, ИмяФайла);
ОчиститьВременныеФайлы();
КонецФункции
Процедура ОчиститьВременныеФайлы()
Для Каждого ВременныйФайл Из СписокВременныхФайлов Цикл
Попытка
УдалитьФайлы(ВременныйФайл);
Исключение
Сообщить("Не удалось удаить файл: " + ВременныйФайл);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьТекстМодуля(ИмяФайла)
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
Текст = ТекстовыйДокумент.ПолучитьТекст();
ТекстовыйДокумент = Неопределено;
Возврат Текст;
КонецФункции
Функция ЕстьОдиночныеCR(ИмяФайла)
ДвоичныеДанныеТело = Новый ДвоичныеДанные(ИмяФайла);
Размер = ДвоичныеДанныеТело.Размер();
ДвоичныеДанныеТело = Неопределено;
ФайловыйПоток = ФайловыеПотоки.ОткрытьДляЧтения(ИмяФайла);
ЧтениеДанных = Новый ЧтениеДанных(ФайловыйПоток, КодировкаТекста.UTF8);
Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(Размер);
Позиция = 0;
Для Каждого ТекБайт Из Буфер Цикл
Если ТекБайт = 13 Тогда
Попытка
СледующийБайт = Буфер[Позиция + 1];
Исключение
Возврат Ложь;
КонецПопытки;
Если СледующийБайт <> 10 Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Позиция = Позиция + 1;
КонецЦикла;
Возврат Ложь;
КонецФункции
СписокПроблемныхМодулей = Новый Массив;
СписокВременныхФайлов = Новый Массив;
КаталогИсходных = ОбъединитьПути(ТекущийСценарий().Каталог, "src");
ЗапуститьОбработку();