-
Notifications
You must be signed in to change notification settings - Fork 1
/
СтроковыеФункции.os
1760 lines (1441 loc) · 98.9 KB
/
СтроковыеФункции.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
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
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#Область ОписаниеПеременных
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
//
// Параметры:
// Строка - Строка - текст с разделителями;
// Разделитель - Строка - разделитель строк текста, минимум 1 символ;
// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
// включаются в результат.
// Е если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
// при других разделителях результатом функции будет пустой массив.
// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
// Массив - массив строк.
//
// Примеры:
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые
// строки;
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Результат = Новый Массив;
// Для обеспечения обратной совместимости.
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Подстрока));
Иначе
Результат.Добавить(Подстрока);
КонецЕсли;
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Строка));
Иначе
Результат.Добавить(Строка);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
/// Объединяет строки из массива в строку с разделителями.
//
// Параметры:
// Массив - Массив - массив строк которые необходимо объединить в одну строку;
// Разделитель - Строка - любой набор символов, который будет использован в качестве разделителя.
//
// Возвращаемое значение:
// Строка - строка с разделителями.
//
Функция СтрокаИзМассиваПодстрок(Массив, Разделитель = ",", СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Результат = "";
Для Индекс = 0 По Массив.ВГраница() Цикл
Подстрока = Массив[Индекс];
Если СокращатьНепечатаемыеСимволы Тогда
Подстрока = СокрЛП(Подстрока);
КонецЕсли;
Если ТипЗнч(Подстрока) <> Тип("Строка") Тогда
Подстрока = Строка(Подстрока);
КонецЕсли;
Если Индекс > 0 Тогда
Результат = Результат + Разделитель;
КонецЕсли;
Результат = Результат + Подстрока;
КонецЦикла;
Возврат Результат;
КонецФункции
// Определяет, является ли символ разделителем.
//
// Параметры:
// КодСимвола - Число - код проверяемого символа;
// РазделителиСлов - Строка - символы разделителей.
//
// Возвращаемое значение:
// Булево - истина, если символ является разделителем.
//
Функция ЭтоРазделительСлов(КодСимвола, РазделителиСлов = Неопределено) Экспорт
Если РазделителиСлов <> Неопределено Тогда
Возврат Найти(РазделителиСлов, Символ(КодСимвола)) > 0;
КонецЕсли;
Диапазоны = Новый Массив;
Диапазоны.Добавить(Новый Структура("Мин,Макс", 48, 57)); // цифры
Диапазоны.Добавить(Новый Структура("Мин,Макс", 65, 90)); // латиница большие
Диапазоны.Добавить(Новый Структура("Мин,Макс", 97, 122)); // латиница маленькие
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1040, 1103)); // кириллица
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1025, 1025)); // символ "Ё"
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1105, 1105)); // символ "ё"
Диапазоны.Добавить(Новый Структура("Мин,Макс", 95, 95)); // символ "_"
Для Каждого Диапазон Из Диапазоны Цикл
Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Разбивает строку на несколько строк, используя заданный набор разделителей.
// Если параметр РазделителиСлов не задан, то разделителем слов считается любой из символов,
// не относящихся к символам латиницы, кириллицы, цифры, подчеркивания.
//
// Параметры:
// Строка - Строка - строка, которую необходимо разложить на слова.
// РазделителиСлов - Строка - строка, содержащая символы-разделители.
//
// Возвращаемое значение:
// массив значений, элементы которого - отдельные слова.
//
// Пример:
// РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один", "два2_", "три";
// РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив значений: "один-", "два2", "три".
//
Функция РазложитьСтрокуВМассивСлов(Знач Строка, РазделителиСлов = Неопределено) Экспорт
Слова = Новый Массив;
РазмерТекста = СтрДлина(Строка);
НачалоСлова = 1;
Для Позиция = 1 По РазмерТекста Цикл
КодСимвола = КодСимвола(Строка, Позиция);
Если ЭтоРазделительСлов(КодСимвола, РазделителиСлов) Тогда
Если Позиция <> НачалоСлова Тогда
Слова.Добавить(Сред(Строка, НачалоСлова, Позиция - НачалоСлова));
КонецЕсли;
НачалоСлова = Позиция + 1;
КонецЕсли;
КонецЦикла;
Если Позиция <> НачалоСлова Тогда
Слова.Добавить(Сред(Строка, НачалоСлова, Позиция - НачалоСлова));
КонецЕсли;
Возврат Слова;
КонецФункции
// Подставляет параметры в строку. Максимально возможное число параметров - 9.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
//
// Параметры:
// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%ИмяПараметра");
// Параметр<n> - Строка - подставляемый параметр.
//
// Возвращаемое значение:
// Строка - текстовая строка с подставленными параметрами.
//
// Пример:
// ПодставитьПараметрыВСтроку(НСтр("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);
КонецЕсли;
Возврат СтрокаПодстановки;
КонецФункции
// Подставляет параметры в строку. Число параметров в строке не ограничено.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров
// начинается с единицы.
//
// Параметры
// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%1");
// МассивПараметров - Массив - массив строк, которые соответствуют параметрам в строке подстановки.
//
// Возвращаемое значение:
// Строка - строка с подставленными параметрами.
//
// Пример:
// МассивПараметров = Новый Массив;
// МассивПараметров = МассивПараметров.Добавить("Вася");
// МассивПараметров = МассивПараметров.Добавить("Зоопарк");
//
// Строка = ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), МассивПараметров);
//
Функция ПодставитьПараметрыВСтрокуИзМассива(Знач СтрокаПодстановки, Знач МассивПараметров) Экспорт
СтрокаРезультата = СтрокаПодстановки;
Индекс = МассивПараметров.Количество();
Пока Индекс > 0 Цикл
Значение = МассивПараметров[Индекс - 1];
Если Не ПустаяСтрока(Значение) Тогда
СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Возврат СтрокаРезультата;
КонецФункции
// Заменяет в шаблоне строки имена параметров на их значения. Параметры в строке выделяются с двух сторон квадратными
// скобками.
//
// Параметры:
//
// ШаблонСтроки - Строка - строка, в которую необходимо вставить значения.
// ВставляемыеЗначения - Структура - структура значений, где ключ - имя параметра без спецсимволов,
// значение - вставляемое значение.
//
// Возвращаемое значение:
// Строка - строка со вставленными значениями.
//
// Пример использования:
// ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Новый Структура("Фамилия,Имя", "Пупкин", "Вася"));
// Возвращает: "Здравствуй, Вася Пупкин".
Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, ВставляемыеЗначения) Экспорт
Результат = ШаблонСтроки;
Для Каждого Параметр Из ВставляемыеЗначения Цикл
Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Параметр.Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
// Получает значения параметров из строки.
//
// Параметры:
// СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой
// фрагмент вида <Имя параметра>=<Значение>, где:
// Имя параметра - имя параметра;
// Значение - его значение.
// Фрагменты отделяются друг от друга символами ';'.
// Если значение содержит пробельные символы, то оно должно быть заключено в двойные
// кавычки (").
// Например:
// "File=""c:\InfoBases\Trade""; Usr=""Director"";"
//
// Возвращаемое значение:
// Структура - структура параметров, где ключ - имя параметра, значение - значение параметра.
//
Функция ПолучитьПараметрыИзСтроки(Знач СтрокаПараметров) Экспорт
Результат = Новый Структура;
СимволДвойныеКавычки = Символ(34); // (")
МассивПодстрок = РазложитьСтрокуВМассивПодстрок(СтрокаПараметров, ";");
Для Каждого СтрокаПараметра Из МассивПодстрок Цикл
ПозицияПервогоЗнакаРавенства = Найти(СтрокаПараметра, "=");
// Получаем имя параметра
ИмяПараметра = СокрЛП(Лев(СтрокаПараметра, ПозицияПервогоЗнакаРавенства - 1));
// Получаем значение параметра
ЗначениеПараметра = СокрЛП(Сред(СтрокаПараметра, ПозицияПервогоЗнакаРавенства + 1));
Если Лев(ЗначениеПараметра, 1) = СимволДвойныеКавычки
И Прав(ЗначениеПараметра, 1) = СимволДвойныеКавычки Тогда
ЗначениеПараметра = Сред(ЗначениеПараметра, 2, СтрДлина(ЗначениеПараметра) - 2);
КонецЕсли;
Если Не ПустаяСтрока(ИмяПараметра) Тогда
Результат.Вставить(ИмяПараметра, ЗначениеПараметра);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Проверяет, содержит ли строка только цифры.
//
// Параметры:
// СтрокаПроверки - Строка - Строка для проверки.
// УчитыватьЛидирующиеНули - Булево - Флаг учета лидирующих нулей, если Истина, то ведущие нули пропускаются.
// УчитыватьПробелы - Булево - Флаг учета пробелов, если Истина, то пробелы при проверке игнорируются.
//
// Возвращаемое значение:
// Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Если Не УчитыватьПробелы Тогда
СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
КонецЕсли;
Если ПустаяСтрока(СтрокаПроверки) Тогда
Возврат Истина;
КонецЕсли;
Если Не УчитыватьЛидирующиеНули Тогда
Позиция = 1;
// Взятие символа за границей строки возвращает пустую строку.
Пока Сред(СтрокаПроверки, Позиция, 1) = "0" Цикл
Позиция = Позиция + 1;
КонецЦикла;
СтрокаПроверки = Сред(СтрокаПроверки, Позиция);
КонецЕсли;
// Если содержит только цифры, то в результате замен должна быть получена пустая строка.
// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы.
Возврат СтрДлина(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
СтрокаПроверки, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")
) = 0;
КонецФункции
// Проверяет, содержит ли строка только символы кириллического алфавита.
//
// Параметры:
// УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
// ДопустимыеСимволы - строка для проверки.
//
// Возвращаемое значение:
// Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая;
// Ложь, если строка содержит иные символы.
//
Функция ТолькоКириллицаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
Возврат Истина;
КонецЕсли;
КодыДопустимыхСимволов = Новый Массив;
КодыДопустимыхСимволов.Добавить(1105); // "ё"
КодыДопустимыхСимволов.Добавить(1025); // "Ё"
Для а = 1 По СтрДлина(ДопустимыеСимволы) Цикл
КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, а, 1)));
КонецЦикла;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если ((КодСимвола < 1040) Или (КодСимвола > 1103))
И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено)
И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Проверяет, содержит ли строка только символы латинского алфавита.
//
// Параметры:
// УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
// ДопустимыеСимволы - строка для проверки.
//
// Возвращаемое значение:
// Булево - Истина, если строка содержит только латинские (или допустимые) символы;
// - Ложь, если строка содержит иные символы.
//
Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт
Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
Возврат Истина;
КонецЕсли;
КодыДопустимыхСимволов = Новый Массив;
Для а = 1 По СтрДлина(ДопустимыеСимволы) Цикл
КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, а, 1)));
КонецЦикла;
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если ((КодСимвола < 65) Или (КодСимвола > 90 И КодСимвола < 97) Или (КодСимвола > 122))
И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено)
И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Удаляет двойные кавычки с начала и конца строки, если они есть.
//
// Параметры:
// Строка - входная строка;
//
// Возвращаемое значение:
// Строка - строка без двойных кавычек.
//
Функция СократитьДвойныеКавычки(Знач Строка) Экспорт
Пока Лев(Строка, 1) = """" Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
Пока Прав(Строка, 1) = """" Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
Возврат Строка;
КонецФункции
// Удаляет из строки указанное количество символов справа.
//
// Параметры:
// Текст - Строка - строка, в которой необходимо удалить последние символы;
// ЧислоСимволов - Число - количество удаляемых символов.
//
Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов = 1) Экспорт
Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);
КонецПроцедуры
// Осуществляет поиск символа, начиная с конца строки.
//
// Параметры:
// Строка - Строка - строка, в которой осуществляется поиск;
// Символ - Строка - искомый символ. Допускается искать строку, содержащую более одного символа.
//
// Возвращаемое значение:
// Число - позиция символа в строке.
// Если строка не содержит указанного символа, то возвращается 0.
//
Функция НайтиСимволСКонца(Знач Строка, Знач Символ) Экспорт
Для Позиция = -СтрДлина(Строка) По - 1 Цикл
Если Сред(Строка, -Позиция, СтрДлина(Символ)) = Символ Тогда
Возврат -Позиция;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
// Проверяет, является ли строка уникальным идентификатором.
// В качестве уникального идентификатора предполагается строка вида
// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
//
// Параметры:
// ИдентификаторСтрока - Строка - проверяемая строка.
//
// Возвращаемое значение:
// Булево - Истина, если переданная строка является уникальным идентификатором.
Функция ЭтоУникальныйИдентификатор(Знач Строка) Экспорт
Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
Если СтрДлина(Шаблон) <> СтрДлина(Строка) Тогда
Возврат Ложь;
КонецЕсли;
Для Позиция = 1 По СтрДлина(Строка) Цикл
Если КодСимвола(Шаблон, Позиция) = 88 // X
И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9
И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f
И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F
Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // -
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Формирует строку повторяющихся символов заданной длины.
//
// Параметры:
// Символ - Строка - символ, из которого будет формироваться строка.
// ДлинаСтроки - Число - требуемая длина результирующей строки.
//
// Возвращаемое значение:
// Строка - строка, состоящая из повторяющихся символов.
//
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт
Результат = "";
Для Счетчик = 1 По ДлинаСтроки Цикл
Результат = Результат + Символ;
КонецЦикла;
Возврат Результат;
КонецФункции
// Дополняет строку символами слева или справа до заданной длины и возвращает ее.
// Незначащие символы слева и справа удаляются. По умолчанию функция дополняет строку символами "0" (ноль) слева.
//
// Параметры:
// Строка - Строка - исходная строка, которую необходимо дополнить символами;
// ДлинаСтроки - Число - требуемая результирующая длина строки;
// Символ - Строка - символ, которым необходимо дополнить строку;
// Режим - Строка - "Слева" или "Справа" - режим добавления символов к исходной строке.
//
// Возвращаемое значение:
// Строка - строка, дополненная символами.
//
// Пример 1:
// Строка = "1234"; ДлинаСтроки = 10; Символ = "0"; Режим = "Слева"
// Возврат: "0000001234"
//
// Пример 2:
// Строка = " 1234 "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа"
// Возврат: "1234######"
//
Функция ДополнитьСтроку(Знач Строка, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт
// Длина символа не должна превышать единицы.
Символ = Лев(Символ, 1);
// Удаляем крайние пробелы слева и справа строки.
Строка = СокрЛП(Строка);
КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Строка);
Если КоличествоСимволовНадоДобавить > 0 Тогда
СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
Если ВРег(Режим) = "СЛЕВА" Тогда
Строка = СтрокаДляДобавления + Строка;
ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
Строка = Строка + СтрокаДляДобавления;
КонецЕсли;
КонецЕсли;
Возврат Строка;
КонецФункции
// Добавляем слева к строке или ко всем подчиненным строкам многострочной строки слева строку
// например,
// При вызове СтроковыеУтилиты.ДополнитьСлеваДляМногострочнойСтроки(
// "1
// |
// |2", "--");
//будет получен результат
// "--1
// |--
// |--2");
Функция ДополнитьСлеваМногострочнуюСтроку(Знач ИсходнаяСтрока, Знач ЧтоДобавляем) Экспорт
Массив = СтрРазделить(ИсходнаяСтрока, Символы.ПС, Истина);
Если Массив.Количество() = 0 Тогда
Массив.Добавить(ИсходнаяСтрока);
КонецЕсли;
РезМассив = Новый Массив;
Для каждого Подстрока Из Массив Цикл
Подстрока = ЧтоДобавляем + Подстрока;
РезМассив.Добавить(Подстрока);
КонецЦикла;
Возврат СтрСоединить(РезМассив, Символы.ПС);
КонецФункции // ДополнитьСлеваМногострочнуюСтроку()
// Удаляет крайние повторяющиеся символы слева или справа в строке.
//
// Параметры:
// Строка - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы;
// Символ - Строка - искомый символ для удаления;
// Режим - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке.
//
// Возвращаемое значение:
// Строка - обрезанная строка.
//
Функция УдалитьПовторяющиесяСимволы(Знач Строка, Знач Символ, Знач Режим = "Слева") Экспорт
Если ВРег(Режим) = "СЛЕВА" Тогда
Пока Лев(Строка, 1) = Символ Цикл
Строка = Сред(Строка, 2);
КонецЦикла;
ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
Пока Прав(Строка, 1) = Символ Цикл
Строка = Лев(Строка, СтрДлина(Строка) - 1);
КонецЦикла;
КонецЕсли;
Возврат Строка;
КонецФункции
// Выполняет замену символов в строке.
//
// Параметры:
// ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены;
// Строка - Строка - исходная строка, в которой требуется замена символов;
// СимволыЗамены - Строка - строка символов, на каждый из которых нужно заменить символы параметра
// ЗаменяемыеСимволы.
//
// Возвращаемое значение:
// Строка - строка после замены символов.
//
// Примечание: функция предназначена для простых случаев, например, для замены латиницы на похожие кириллические
// символы.
//
Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Строка, СимволыЗамены) Экспорт
Результат = Строка;
Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл
Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола, 1));
КонецЦикла;
Возврат Результат;
КонецФункции
// Выполняет преобразование арабского числа в римское.
//
// Параметры:
// АрабскоеЧисло - число, целое, от 0 до 999;
// ИспользоватьКириллицу - булево, использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
// Строка - число в римской нотации.
//
// Пример:
// ПреобразоватьЧислоВРимскуюНотацию(17) = "ХVII".
//
Функция ПреобразоватьЧислоВРимскуюНотацию(АрабскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт
РимскоеЧисло = "";
АрабскоеЧисло = ДополнитьСтроку(АрабскоеЧисло, 3);
Если ИспользоватьКириллицу Тогда
c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 = "С"; c500 = "Д"; c1000 = "М";
Иначе
c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 = "C"; c500 = "D"; c1000 = "M";
КонецЕсли;
Единицы = Число(Сред(АрабскоеЧисло, 3, 1));
Десятки = Число(Сред(АрабскоеЧисло, 2, 1));
Сотни = Число(Сред(АрабскоеЧисло, 1, 1));
РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Сотни, c100, c500, c1000);
РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Десятки, c10, c50, c100);
РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Единицы, c1, c5, c10);
Возврат РимскоеЧисло;
КонецФункции
// Выполняет преобразование римского числа в арабское.
//
// Параметры:
// РимскоеЧисло - Строка - число, записанное римскими цифрами;
// ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
// Число.
//
// Пример:
// ПреобразоватьЧислоВАрабскуюНотацию("ХVII") = 17.
//
Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт
АрабскоеЧисло = 0;
Если ИспользоватьКириллицу Тогда
c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 = "С"; c500 = "Д"; c1000 = "М";
Иначе
c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 = "C"; c500 = "D"; c1000 = "M";
КонецЕсли;
РимскоеЧисло = СокрЛП(РимскоеЧисло);
ЧислоСимволов = СтрДлина(РимскоеЧисло);
Для Сч = 1 По ЧислоСимволов Цикл
Если Сред(РимскоеЧисло, Сч, 1) = c1000 Тогда
АрабскоеЧисло = АрабскоеЧисло + 1000;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c500 Тогда
АрабскоеЧисло = АрабскоеЧисло + 500;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c100 Тогда
Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c500) ИЛИ (Сред(РимскоеЧисло, Сч + 1, 1) = c1000)) Тогда
АрабскоеЧисло = АрабскоеЧисло - 100;
Иначе
АрабскоеЧисло = АрабскоеЧисло + 100;
КонецЕсли;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c50 Тогда
АрабскоеЧисло = АрабскоеЧисло + 50;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c10 Тогда
Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c50) ИЛИ (Сред(РимскоеЧисло, Сч + 1, 1) = c100)) Тогда
АрабскоеЧисло = АрабскоеЧисло - 10;
Иначе
АрабскоеЧисло = АрабскоеЧисло + 10;
КонецЕсли;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c5 Тогда
АрабскоеЧисло = АрабскоеЧисло + 5;
ИначеЕсли Сред(РимскоеЧисло, Сч, 1) = c1 Тогда
Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло, Сч + 1, 1) = c5) ИЛИ (Сред(РимскоеЧисло, Сч + 1, 1) = c10)) Тогда
АрабскоеЧисло = АрабскоеЧисло - 1;
Иначе
АрабскоеЧисло = АрабскоеЧисло + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат АрабскоеЧисло;
КонецФункции
// Возвращает текстовое представление числа с единицей измерения в правильном склонении и числе.
//
// Параметры:
// Число - Число - любое целое число.
// ПараметрыПредметаИсчисления - Строка - варианты написания единицы измерения в родительном падеже для одной,
// для двух и для пяти единиц, разделитель - запятая.
//
// Возвращаемое значение:
// Строка - текстовое представление количества единиц, число записывается цифрами.
//
// Примеры:
// ЧислоЦифрамиПредметИсчисленияПрописью(23, "минуту,минуты,минут") = "23 минуты";
// ЧислоЦифрамиПредметИсчисленияПрописью(15, "минуту,минуты,минут") = "15 минут".
Функция ЧислоЦифрамиПредметИсчисленияПрописью(Знач Число, Знач ПараметрыПредметаИсчисления) Экспорт
Результат = Формат(Число, "ЧН=0");
МассивПредставлений = Новый Массив;
Позиция = Найти(ПараметрыПредметаИсчисления, ",");
Пока Позиция > 0 Цикл
Значение = СокрЛП(Лев(ПараметрыПредметаИсчисления, Позиция - 1));
ПараметрыПредметаИсчисления = Сред(ПараметрыПредметаИсчисления, Позиция + 1);
МассивПредставлений.Добавить(Значение);
Позиция = Найти(ПараметрыПредметаИсчисления, ",");
КонецЦикла;
Если СтрДлина(ПараметрыПредметаИсчисления) > 0 Тогда
Значение = СокрЛП(ПараметрыПредметаИсчисления);
МассивПредставлений.Добавить(Значение);
КонецЕсли;
Если Число >= 100 Тогда
Число = Число - Цел(Число / 100) * 100;
КонецЕсли;
Если Число > 20 Тогда
Число = Число - Цел(Число / 10) * 10;
КонецЕсли;
Если Число = 1 Тогда
Результат = Результат + " " + МассивПредставлений[0];
ИначеЕсли Число > 1 И Число < 5 Тогда
Результат = Результат + " " + МассивПредставлений[1];
Иначе
Результат = Результат + " " + МассивПредставлений[2];
КонецЕсли;
Возврат Результат;
КонецФункции
// Очищает текст в формате HTML от тегов и возвращает неформатированный текст.
//
// Параметры:
// ИсходныйТекст - Строка - текст в формате HTML.
//
// Возвращаемое значение:
// Строка - текст, очищенный от тегов, скриптов и заголовков.
//
Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт
Результат = "";
Текст = НРег(ИсходныйТекст);
// отрезаем все что не body
Позиция = Найти(Текст, "<body");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 5);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5);
Позиция = Найти(Текст, ">");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
КонецЕсли;
КонецЕсли;
Позиция = Найти(Текст, "</body>");
Если Позиция > 0 Тогда
Текст = Лев(Текст, Позиция - 1);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1);
КонецЕсли;
// вырезаем скрипты
Позиция = Найти(Текст, "<script");
Пока Позиция > 0 Цикл
ПозицияЗакрывающегоТега = Найти(Текст, "</script>");
Если ПозицияЗакрывающегоТега = 0 Тогда
// Не найден закрывающий тег - вырезаем оставшийся текст.
ПозицияЗакрывающегоТега = СтрДлина(Текст);
КонецЕсли;
Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9);
Позиция = Найти(Текст, "<script");
КонецЦикла;
// вырезаем стили
Позиция = Найти(Текст, "<style");
Пока Позиция > 0 Цикл
ПозицияЗакрывающегоТега = Найти(Текст, "</style>");
Если ПозицияЗакрывающегоТега = 0 Тогда
// Не найден закрывающий тег - вырезаем оставшийся текст.
ПозицияЗакрывающегоТега = СтрДлина(Текст);
КонецЕсли;
Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8);
Позиция = Найти(Текст, "<style");
КонецЦикла;
// вырезаем все теги
Позиция = Найти(Текст, "<");
Пока Позиция > 0 Цикл
Результат = Результат + Лев(ИсходныйТекст, Позиция - 1);
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
Позиция = Найти(Текст, ">");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
КонецЕсли;
Позиция = Найти(Текст, "<");
КонецЦикла;
Результат = Результат + ИсходныйТекст;
МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина);
Возврат СокрЛП(СтрокаИзМассиваПодстрок(МассивСтрок, Символы.ПС));
КонецФункции
// Преобразует исходную строку в транслит.
Функция СтрокаЛатиницей(Знач Строка) Экспорт
Результат = "";
Соответствие = СоответствиеКириллицыИЛатиницы();
ПредыдущийСимвол = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
СимволЛатиницей = Соответствие[НРег(Символ)]; // Поиск соответствия без учета регистра.
Если СимволЛатиницей = Неопределено Тогда
// Другие символы остаются "как есть".
СимволЛатиницей = Символ;
Иначе
Если Символ = ВРег(Символ) Тогда
СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр
КонецЕсли;
КонецЕсли;
Результат = Результат + СимволЛатиницей;
ПредыдущийСимвол = СимволЛатиницей;
КонецЦикла;
Возврат Результат;
КонецФункции
// Форматирует строку в соответствии с заданным шаблоном.
// Возможные значения тегов выделения:
// <b> Строка </b> - выделяет строку жирным шрифтом
// <a href = "Ссылка"> Строка </a>
//
// Пример:
// Минимальная версия программы <b>1.1</b>. <a href = "Обновление">Обновите</a> программу.
//
// Возвращаемое значение:
// ФорматированнаяСтрока
Функция ФорматированнаяСтрока(Знач Строка) Экспорт
СтрокиСВыделением = Новый СписокЗначений;
Пока Найти(Строка, "<b>") <> 0 Цикл
НачалоВыделения = Найти(Строка, "<b>");
СтрокаДоОткрывающегоТега = Лев(Строка, НачалоВыделения - 1);
СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега);
СтрокаПослеОткрывающегоТега = Сред(Строка, НачалоВыделения + 3);
КонецВыделения = Найти(СтрокаПослеОткрывающегоТега, "</b>");
ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1);
СтрокиСВыделением.Добавить(ВыделенныйФрагмент, , Истина);
СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4);
Строка = СтрокаПослеВыделения;
КонецЦикла;
СтрокиСВыделением.Добавить(Строка);
СтрокиСоСсылками = Новый СписокЗначений;
Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл
Строка = ЧастьСтроки.Значение;
Если ЧастьСтроки.Пометка Тогда
СтрокиСоСсылками.Добавить(Строка, , Истина);
Продолжить;
КонецЕсли;
НачалоВыделения = Найти(Строка, "<a href = ");
Пока НачалоВыделения <> 0 Цикл
СтрокаДоОткрывающегоТега = Лев(Строка, НачалоВыделения - 1);
СтрокиСоСсылками.Добавить(СтрокаДоОткрывающегоТега, );
СтрокаПослеОткрывающегоТега = Сред(Строка, НачалоВыделения + 9);
ЗакрывающийТег = Найти(СтрокаПослеОткрывающегоТега, ">");
Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2));
Если Лев(Ссылка, 1) = """" Тогда
Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1);
КонецЕсли;
Если Прав(Ссылка, 1) = """" Тогда