-
Notifications
You must be signed in to change notification settings - Fork 7
/
Module.bsl
320 lines (265 loc) · 17.9 KB
/
Module.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
// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// URL: https://github.com/firstBitSportivnaya/PSSL/
//
////////////////////////////////////////////////////////////////////////////////
// Работа со строками (клиент, сервер): Модуль содержит методы работы со строками.
#Область ПрограммныйИнтерфейс
// Разбирает строку с разделителями и упаковывает значения в массив.
//
// Параметры:
// ИсходнаяСтрока - Строка
// Разделитель - Строка
// ПоНарастающей - Булево (По умолчанию = Ложь) .
//
// ВозвращаемоеЗначение:
// Массив
//
Функция РазобратьСтрокуСРазделителями(ИсходнаяСтрока, Разделитель, ПоНарастающей = Ложь) Экспорт
Результат = Новый Массив;
Список = пбп_ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСРазделителями(ИсходнаяСтрока, Разделитель);
Если ПоНарастающей Тогда
НарастающаяСтрока = "";
Для Каждого СтрокаСписка Из Список Цикл
НарастающаяСтрока = ?(ПустаяСтрока(НарастающаяСтрока),
СтрокаСписка, СтрШаблон("%1.%2", НарастающаяСтрока, СтрокаСписка));
Результат.Добавить(НарастающаяСтрока);
КонецЦикла;
Иначе
Результат = Список;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает текст с добавлением/удаление разделителя "|".
//
// Параметры:
// Текст - Строка - Обрабатываемый текст.
// Добавить - Булево - Признак добавления/удаления вертикальной черты.
//
// Возвращаемое значение:
// Строка - Результат обработки строки.
//
Функция УбратьДобавитьВертикальнуюЧерту(Текст, Добавить = Ложь) Экспорт
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(Текст);
КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
Если Добавить Тогда
Для Сч = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Сч);
Если Сч = 1 Тогда
ТекущаяСтрока = """" + ТекущаяСтрока;
Иначе
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """", """""");
ТекущаяСтрока = СтрШаблон("|%1", ТекущаяСтрока);
Если Сч = КоличествоСтрок Тогда
ТекущаяСтрока = СтрШаблон("%1%2", ТекущаяСтрока, """");
КонецЕсли;
КонецЕсли;
ТекстовыйДокумент.ЗаменитьСтроку(Сч, ТекущаяСтрока);
КонецЦикла;
Иначе
Для Сч = 1 По КоличествоСтрок Цикл
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Сч);
Если Сч = 1 Тогда
ТекущаяСтрока = Сред(ТекущаяСтрока, 2);
ИначеЕсли Сч = КоличествоСтрок Тогда
ТекущаяСтрока = Сред(ТекущаяСтрока, 1, СтрДлина(ТекущаяСтрока) - 1);
КонецЕсли;
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """""", """");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "|", "");
ТекстовыйДокумент.ЗаменитьСтроку(Сч, ТекущаяСтрока);
КонецЦикла;
КонецЕсли;
Результат = ТекстовыйДокумент.ПолучитьТекст();
Результат = Сред(Результат, 1, СтрДлина(Результат) - 1);
Возврат Результат;
КонецФункции
#Область МетодыАналогиБСП
// Аналог метода БСП. Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину.
// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
// рекомендуется использовать функцию платформы СтрРазделить.
//
// Параметры:
// Значение - Строка - текст с разделителями.
// Разделитель - Строка - разделитель строк текста, минимум 1 символ.
// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
// > для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
// включаются в результат;
// > если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
// при других разделителях результатом функции будет пустой массив.
// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
// Массив из Строка
//
// Пример:
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")
// - возвратит массив из 5 элементов, три из которых - пустые: "", "один", "", "два", "";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
// - возвратит массив из двух элементов: "один", "два";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один два ", " ")
// - возвратит массив из двух элементов: "один", "два";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
// - возвратит пустой массив;
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
// - возвратит массив с одним элементом: ""(пустая строка);
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
// - возвратит массив с одним элементом: "" (пустая строка).
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено,
СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Если СтрДлина(Разделитель) = 1
И ПропускатьПустыеСтроки = Неопределено
И СокращатьНепечатаемыеСимволы Тогда
Результат = СтрРазделить(Значение, Разделитель, Ложь);
Для Индекс = 0 По Результат.ВГраница() Цикл
Результат[Индекс] = СокрЛП(Результат[Индекс])
КонецЦикла;
Возврат Результат;
КонецЕсли;
Результат = Новый Массив;
// Для обеспечения обратной совместимости.
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Значение) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = СтрНайти(Значение, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Значение, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Подстрока));
Иначе
Результат.Добавить(Подстрока);
КонецЕсли;
КонецЕсли;
Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
Позиция = СтрНайти(Значение, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Значение));
Иначе
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Аналог метода БСП. Подставляет параметры в строку. Максимально возможное число параметров - 9.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
//
// Параметры:
// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>",
// например "%1 пошел в %2");
// Параметр1 - Строка - значение подставляемого параметра.
// Параметр2 - Строка
// Параметр3 - Строка
// Параметр4 - Строка
// Параметр5 - Строка
// Параметр6 - Строка
// Параметр7 - Строка
// Параметр8 - Строка
// Параметр9 - Строка
//
// Возвращаемое значение:
// Строка - текстовая строка с подставленными параметрами.
//
// Пример:
// СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел
// в Зоопарк".
//
Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки,
Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%")
Или СтрНайти(Параметр2, "%")
Или СтрНайти(Параметр3, "%")
Или СтрНайти(Параметр4, "%")
Или СтрНайти(Параметр5, "%")
Или СтрНайти(Параметр6, "%")
Или СтрНайти(Параметр7, "%")
Или СтрНайти(Параметр8, "%")
Или СтрНайти(Параметр9, "%");
Если ЕстьПараметрыСПроцентом Тогда
//Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1,
// Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
КонецЕсли;
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9);
Возврат ШаблонСтроки;
КонецФункции
#КонецОбласти
// Превращает строку camelCase в синоним
//
// Параметры:
// ИсходнаяСтрока - Строка - Строка типа ИдентификаторНастройки
//
// Возвращаемое значение:
// Строка - Синоним
//
Функция СинонимСтроки(ИсходнаяСтрока) Экспорт
Результат = пбп_СтроковыеФункцииСлужебныйКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходнаяСтрока);
Если Результат.Количество() > 1 Тогда
Возврат "";
КонецЕсли;
ДлинаСтроки = СтрДлина(ИсходнаяСтрока) + 1;
Старт = 1;
Конец = 0;
Части = Новый Массив;
Для Конец = 2 По ДлинаСтроки Цикл
КодСимвола = КодСимвола(Сред(ИсходнаяСтрока, Конец, 1));
Если СимволВерхнегоРегистра(КодСимвола) Или Конец = ДлинаСтроки Тогда
КолСимволов = Конец - Старт;
Части.Добавить(Сред(ИсходнаяСтрока, Старт, ?(КолСимволов = 0, ДлинаСтроки - Старт, КолСимволов)));
Старт = Конец;
КонецЕсли;
КонецЦикла;
Синоним = НРег(СтрСоединить(Части, " "));
Синоним = ВРег(Лев(Синоним, 1)) + Сред(Синоним,2);
Возврат Синоним;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция СимволВерхнегоРегистра(КодСимвола)
минКирилица = 1040;
максКирилица = 1070;
минЛатиница = 65;
максЛатиница = 90;
Если (КодСимвола >= минКирилица И КодСимвола <= максКирилица)
Или (КодСимвола >= минЛатиница И КодСимвола <= максЛатиница) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти