gifts2017

[ФУНКЦИЯ] Замена обычных кавычек на кавычки-ёлочки «» для 1С: Предприятие 8.X

Опубликовал Сергей Ожерельев (Поручик) в раздел Программирование - Практика программирования

Предназначена в основном для удовлетворения требований заказчиков к оформлению печатных форм.

Основано на Замена кавычек на «ёлочки» в C# и PHP

Быстродействие на больших объёмах текста не проверял, так как замена кавычек требуется в основном в наименованиях контрагентов или номенклатуры, а они в 99% явно меньше 255 символов. Также не рассматривал упоротые случаи вида Общество с ограниченной ответственностью "Торговый дом "ООО Мокрохрен"".

// Функция заменяет в строке двойные кавычки " на кавычки-елочки «»
// Ported from http://aione.ru/zamena-kavyichek-yolochkami-v-csharp_i_php/
// Coded by Sergey aka Porutchik, 2013, http://forum.aeroion.ru/cat1.html
//
// Параметры
//  ИсходныйТекст  - Строка - входная строка
//
// Возвращаемое значение:
//  Строка  - строка с заменёнными кавычками
//
Функция ЗаменитьКавычкиНаЕлочки(Знач ИсходныйТекст) Экспорт

    Если Не
ЗначениеЗаполнено(ИсходныйТекст) Тогда
        Возврат
ИсходныйТекст;
    КонецЕсли;

   
ДвойнаяКавычка = """";
   
КоличествоКавычек = СтрЧислоВхождений(ИсходныйТекст, ДвойнаяКавычка);

   
// Если количество кавычек меньше двух, ничего не делаем, так как нет смысла закрывать/открывать
   
Если КоличествоКавычек < 2 Тогда
        Возврат
ИсходныйТекст;
    КонецЕсли;

   
ЛеваяКавычка = "«";
   
ПраваяКавычка = "»";
   
БуквыИЦифры = "0123456789ABCDEFGHIKLMNJOPQRSTUVWXYZ";
   
БуквыИЦифры = БуквыИЦифры + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

   
Результат = "";
   
ПозицияКавычки = Найти(ИсходныйТекст, ДвойнаяКавычка);
    Пока
ПозицияКавычки > 0 Цикл
        Если
ПозицияКавычки = СтрДлина(ИсходныйТекст) Тогда
           
// Если конец строки заканчивается кавычкой
           
ИсходныйТекст = Лев(ИсходныйТекст, ПозицияКавычки - 1) + ПраваяКавычка; //
       
Иначе
           
// Если впереди кавычки идут буквы и цифры, - ставим открывающую "«"
            // Если любые другие символы, - ставим закрывающую "»"
           
СледующийСимвол = ВРег(Сред(ИсходныйТекст, ПозицияКавычки + 1, 1));
           
СтрокаЗамены = ?((Найти(БуквыИЦифры, СледующийСимвол) > 0) Или (ПозицияКавычки = 1), ЛеваяКавычка, ПраваяКавычка); //
           
ИсходныйТекст = Лев(ИсходныйТекст, ПозицияКавычки - 1) + СтрокаЗамены + Сред(ИсходныйТекст, ПозицияКавычки + 1); //
       
КонецЕсли;
       
// Если количество кавычек после последней замены осталось меньше двух, ничего не делаем, так как нет смысла закрывать/открывать
       
КоличествоКавычек = СтрЧислоВхождений(ИсходныйТекст, ДвойнаяКавычка);
        Если
СтрокаЗамены = ПраваяКавычка И КоличествоКавычек < 2 Тогда
           
ПозицияКавычки = 0;
        Иначе
           
ПозицияКавычки = Найти(ИсходныйТекст, ДвойнаяКавычка);
        КонецЕсли;
    КонецЦикла;

    Возврат
ИсходныйТекст;

КонецФункции
// ЗаменитьКавычкиНаЕлочки()

В очередной раз пожалел, что в 1С: Предприятии нет штатных возможностей регулярных выражений для замены текста. Использование COMОбъект VBScript.RegExp к ним не относится.

Скачать файлы

Наименование Файл Версия Размер
Типограф1С.epf 8
.epf 10,00Kb
21.04.13
8
.epf 10,00Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ийон Тихий (cool.vlad4) 22.04.13 11:29
а упоротые случаи имхо и не сделать нормально из-за неоднозначностей «Торговый дом «ООО Мокрохрен». « ООО Мокрохрен » Торговый дом ».
2. Сергей Ожерельев (Поручик) 22.04.13 11:44
(1) Не сделать, потому и не пытался. Обсуждение http://forum.dklab.ru/viewtopic.php?t=10653
3. Сергей Гуняков (Intervent) 22.04.13 14:16
MS Word, например, обособленную кавычку или после открывающей скобки делает открывающей ёлочкой. Думаю имеет смысл задействовать такую же логику и в этой функции. Это в некотором роде обратная логика: всё, что не закрываем, - открываем.
Пример: [обособленная: " или после откр. скобки: (" - надо "открывающие"].

А заодно хорошо бы предоставить пользователю экранировать кавычку: \" → ".
Хотя, если шрифт печатной формы не моноширный, то можно две одинарных ставить. )
4. shoy Андрей ais (shoy) 22.08.14 15:39
Нет, уважаемые кроты, при анализе не лучше ли вначале посчитать количество кавычек и обычных и ёлочек?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа