IE2017

[ФУНКЦИЯ] Замена обычных кавычек на кавычки-ёлочки «» для 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
.epf 10,00Kb
21.04.13
8
.epf 10,00Kb 8 Скачать

См. также

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

А заодно хорошо бы предоставить пользователю экранировать кавычку: \" → ".
Хотя, если шрифт печатной формы не моноширный, то можно две одинарных ставить. )
4. Андрей SAI (shoy) 19 22.08.14 15:39 Сейчас в теме
Нет, уважаемые кроты, при анализе не лучше ли вначале посчитать количество кавычек и обычных и ёлочек?
5. Наташа Губина (natala_g) 4 12.12.16 08:32 Сейчас в теме
Спасибо, очень выручили!
6. Vladimir Zemenkov (KillHunter) 6 12.12.16 08:34 Сейчас в теме
(2)
А вы уверены что это будет прокатывать в 1ске ?
//**
// функция замены обычных кавычек " на русские елочки
function rus_quote($s) {
$s = preg_replace (www.php.net/preg_replace)(
array (www.php.net/array)(
"/(^|\s+|\(|\<|\{\[\|)\"/ms",
"/\"(\s+|\.|\,|\!|\?|\)|\>|\}|\]|\||$)/ms",
),
array (www.php.net/array)(
"\\1«",
"»\\1",
),
$s
);
return $s;
}
Оставьте свое сообщение