Просьба строго не судить за описанный в этой статье код. Код, возможно, будет интересен начинающим программистам 1С или VBA и совсем не интересен профессионалам.
Начну сразу с постановки задачи:
Пусть у Вас имеется текст достаточно большого объёма, который необходимо очистить от мусорных знаков. Делается это с помощью обычной текстовой замены. Ниже таблица какой текст нам необходимо заменить:
Изначально ищем такой текст |
Делаем замену на этот текст |
Два или более переноса новой строки |
Один перенос строки |
Пробел + Знак препинания |
Знак препинания |
Буква + Знак препинания + Буква |
Буква + Знак препинания + Пробел + Буква |
Несколько пробелов подряд |
Один пробел |
Пробел + Служебный знак |
Служебный знак |
Пробел + Закрывающаяся скобка |
Закрывающаяся скобка |
Где знаки препинания это - !?;:,.
Закрывающаяся скобка - )]>}
Служебный знак это - +-=
Если сложить все возможные вариации знаков для поиска, их получается очень много и делать такие замены вручную, то это буквально "Мартышкин труд".
Я обычно тестирую на текстовых файлах пять - семь мегабайт, - поверьте это достаточно большие объёмы текста. После такой "чистки" вставляю в программы проверки синтаксических ошибок (например, "ОРФО") и далее выкладывается на сайты, или конвертируется в другие файлы - FB Reader, Microsoft Word. Обычный Microsoft Word очень часто отключает проверку ошибок на больших текстах, из-за их громадного количества, поэтому прежде чем вставлять Ваш текст в любую другую программу, нужно очистить обязательный мусор.
Вообще ранее у меня был написан код на VBA для MS Word, но я сильно удивился, что код написанный на 1С при обработке одного и того же текста отрабатывал на домашнем компьютере быстрее. Может, конечно код рознится, но в целом смысл тот же, далее по тексту я приведу и код на VBA.
Собственно реализация алгоритма на 1С сводится к созданию массива из знаков подстановки с дальнейшей заменой каждого из этих знаков на более подходящий. Создадим внешнюю обработку, с одним единственным реквизитом "Текст", строка неограниченной длинны. Затем создадим форму и выведем этот реквизит на форму.
Откроем форму в конфигураторе реквизиту "Текст" проставим свойство вид - Поле ввода. Далее добавим реквизит формы "РасставлятьЗН" тип Булево, свойство Заголовок - Расставлять правильно пробелы между знаками препинания. Так же создадим команду "Чистка текста", на клиенте.
Затем перейдём на вкладку Модуль, для редактирования модуля формы. И отредактируем текст процедуры ЧисткаТекста():
&НаКлиенте
Процедура ЧисткаТекста(Команда)
Если ЭтаФорма.РасставлятьЗН = Истина Тогда
ЗаменаЗнака = Новый Массив;
ЗаменаЗнака.Добавить(".");
ЗаменаЗнака.Добавить(",");
ЗаменаЗнака.Добавить("!");
ЗаменаЗнака.Добавить("?");
ЗаменаЗнака.Добавить(":");
ЗаменаЗнака.Добавить(";");
ЗаменаЗнака.Добавить("-");
ЗаменаЗнака.Добавить("+");
ЗаменаЗнака.Добавить("=");
Для Каждого СтрокаПоискаЗН Из ЗаменаЗнака Цикл
ТекстЗаменыЗН = " " + СтрокаПоискаЗН + " ";
Объект.Текст = СтрЗаменить(Объект.Текст, СтрокаПоискаЗН, ТекстЗаменыЗН);
КонецЦикла;
ЗаменаЗнака.Очистить();
КонецЕсли;
Замена = Новый Массив;
Замена.Добавить(Символы.ПС+Символы.ПС+Символы.ПС+Символы.ПС);
Замена.Добавить(Символы.ПС+Символы.ПС+Символы.ПС);
Замена.Добавить(Символы.ПС+Символы.ПС);
Замена.Добавить(" ");
Замена.Добавить(" ");
Замена.Добавить(" ");
Замена.Добавить(" .");
Замена.Добавить(" ,");
Замена.Добавить(" !");
Замена.Добавить(" ?");
Замена.Добавить(" )");
Замена.Добавить(" ]");
Замена.Добавить(" }");
Замена.Добавить(" >");
Замена.Добавить(" ;");
Замена.Добавить(" :");
Для Каждого СтрокаПоиска Из Замена Цикл
ТекстЗамены = Прав(СтрокаПоиска, 1);
Объект.Текст = СтрЗаменить(Объект.Текст, СтрокаПоиска, ТекстЗамены);
КонецЦикла;
Замена.Очистить();
КонецПроцедуры
Далее просто заходим в 1С: Предприятие любой конфигурации на управляемых формах. Открываем обработку из Меню -> Файл открыть.
Принцип работы обработки простой - вставляете не отформатированный текст в поле "Текст" и нажимаете на кнопку "Очистка текста". После того как поле "Текст" станет доступно (у меня на компьютере это пара секунд) из этого же поля можно скопировать готовый обработанный текст.
Используйте обработку 1С для работы с обычным текстом простых кодировок, а вот если исходный тест "набит" под завязку спец символами (рожицы, крышечки, смесь символов Unicode), то лучше использовать макрос VBA для Word.
Как видите всё работает достаточно примитивно. Создаем массив элементов поиска для замены, потом из каждого элемента получаем строку замены и подставляем в типовую функцию СтрЗаменить.
Поскольку используются функции языка 1С прекрасно работающие &НаКлиенте, мы можем обойтись без серверного вызова.
Если вы планируете использовать обработку 1С постоянно и в типовых конфигурациях. То в модуль объекта добавьте код для регистрации этой обработки.
Далее речь пойдет о макросе написанном на Visual Basic Application.
Для проекта VBA в Microsoft Office 2007 Pro я создал форму с кнопкой CommandButton1, чекбоксами Check1, Check2, Check3, Check4, Check5, Check6, Check7 и комбобокс ComboBox1 для выбора. Работает помедленнее, зато ещё умеет выравнивать шрифт, поля документа, выравнивает абзацы и меж строчный интервал. Естественно для работы нужно разрешить работу макросов Word.
Исходный код формы:
Private Sub CommandButton1_Click()
With ActiveDocument.Styles(wdStyleNormal).Font
If .NameFarEast = .NameAscii Then
.NameAscii = ""
End If
.NameFarEast = ""
End With
With ActiveDocument.PageSetup
.LineNumbering.Active = False
.Orientation = wdOrientPortrait
.TopMargin = CentimetersToPoints(1)
.BottomMargin = CentimetersToPoints(1)
.LeftMargin = CentimetersToPoints(1)
.RightMargin = CentimetersToPoints(1)
.Gutter = CentimetersToPoints(0)
.HeaderDistance = CentimetersToPoints(1.25)
.FooterDistance = CentimetersToPoints(1.25)
.PageWidth = CentimetersToPoints(21)
.PageHeight = CentimetersToPoints(29.7)
.FirstPageTray = wdPrinterDefaultBin
.OtherPagesTray = wdPrinterDefaultBin
.SectionStart = wdSectionNewPage
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.VerticalAlignment = wdAlignVerticalTop
.SuppressEndnotes = False
.MirrorMargins = False
.TwoPagesOnOne = False
.BookFoldPrinting = False
.BookFoldRevPrinting = False
.BookFoldPrintingSheets = 1
.GutterPos = wdGutterPosLeft
End With
Selection.EndKey Unit:=wdStory, Extend:=wdExtend
If ComboBox1.ListIndex = 0 Then
Selection.Font.Name = "Times New Roman"
Selection.Font.Size = 12
Selection.Font.Color = wdColorBlack
ElseIf ComboBox1.ListIndex = 1 Then
Selection.Font.Name = "Courier New"
Selection.Font.Size = 12
Selection.Font.Color = wdColorBlack
ElseIf ComboBox1.ListIndex = 2 Then
Selection.Font.Name = "Arial"
Selection.Font.Size = 12
Selection.Font.Color = wdColorBlack
Else
End If
With Selection.ParagraphFormat
.LeftIndent = CentimetersToPoints(0)
.RightIndent = CentimetersToPoints(0)
.SpaceBefore = 0
.SpaceBeforeAuto = False
.SpaceAfter = 0
.SpaceAfterAuto = False
.LineSpacingRule = wdLineSpaceMultiple
.LineSpacing = LinesToPoints(1)
.Alignment = wdAlignParagraphLeft
.WidowControl = True
.KeepWithNext = False
.KeepTogether = False
.PageBreakBefore = False
.NoLineNumber = False
.Hyphenation = True
.FirstLineIndent = CentimetersToPoints(0)
.OutlineLevel = wdOutlineLevelBodyText
.CharacterUnitLeftIndent = 0
.CharacterUnitRightIndent = 0
.CharacterUnitFirstLineIndent = 0
.LineUnitBefore = 0
.LineUnitAfter = 0
.MirrorIndents = False
.TextboxTightWrap = wdTightNone
End With
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
If FormReplaser.Check1.Value = True Then
.Text = " "
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check2.Value = True Then
.Text = " ."
.Replacement.Text = "."
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check3.Value = True Then
.Text = " ,"
.Replacement.Text = ","
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check4.Value = True Then
.Text = " !"
.Replacement.Text = "!"
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check5.Value = True Then
.Text = " ?"
.Replacement.Text = "?"
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check6.Value = True Then
.Text = " )"
.Replacement.Text = ")"
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
If FormReplaser.Check7.Value = True Then
.Text = " ]"
.Replacement.Text = "]"
.Forward = True
.Wrap = wdFindContinue
Selection.Find.Execute Replace:=wdReplaceAll
End If
End With
End Sub
Private Sub UserForm_Initialize()
FormReplaser.Check1.Value = True
FormReplaser.Check2.Value = True
FormReplaser.Check3.Value = True
FormReplaser.Check4.Value = True
FormReplaser.Check5.Value = True
FormReplaser.Check6.Value = True
FormReplaser.Check7.Value = True
ComboBox1.AddItem "Исправить шрифт на Times New Roman, 12, черный"
ComboBox1.AddItem "Исправить шрифт на Courier New, 12, черный"
ComboBox1.AddItem "Исправить шрифт на Arial, 12, черный"
ComboBox1.AddItem "Оставить исходный шрифт"
ComboBox1.ListIndex = 0
End Sub