[ФУНКЦИЯ] Замена обычных кавычек на кавычки-ёлочки «» для 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 к ним не относится.

9 Comments

  1. cool.vlad4

    а упоротые случаи имхо и не сделать нормально из-за неоднозначностей «Торговый дом «ООО Мокрохрен». « ООО Мокрохрен » Торговый дом ».

    Reply
  2. Поручик

    (1) Не сделать, потому и не пытался. Обсуждение http://forum.dklab.ru/viewtopic.php?t=10653

    Reply
  3. Intervent

    MS Word, например, обособленную кавычку или после открывающей скобки делает открывающей ёлочкой. Думаю имеет смысл задействовать такую же логику и в этой функции. Это в некотором роде обратная логика: всё, что не закрываем, — открываем.

    Пример: [обособленная: » или после откр. скобки: (» — надо «открывающие»].

    А заодно хорошо бы предоставить пользователю экранировать кавычку: » → «.

    Хотя, если шрифт печатной формы не моноширный, то можно две одинарных ставить. )

    Reply
  4. shoy

    Нет, уважаемые кроты, при анализе не лучше ли вначале посчитать количество кавычек и обычных и ёлочек?

    Reply
  5. natala_g

    Спасибо, очень выручили!

    Reply
  6. KillHunter

    (2)

    А вы уверены что это будет прокатывать в 1ске ?

    //**

    // функция замены обычных кавычек » на русские елочки

    function rus_quote($s) {

    $s = preg_replace (www.php.net/preg_replace)(

    array (www.php.net/array)(

    «/(#k8SjZc9Dxk|s+|(|<|{[|)»/ms»,

    «/»(s+|.|,|!|?|)|>|}|]|||$)/ms»,

    ),

    array (www.php.net/array)(

    «\1«»,

    «»\1»,

    ),

    $s

    );

    return $s;

    }

    Reply
  7. kozanostra-pajero

    Большое спасибо!

    Reply
  8. dialogsoft

    // СтрокаСКавычками = «Alena» «Egorova»

    СтрокаБезКавычки = СтрЗаменить(СтрокаСКавычками,»»»»,»»);

    Сообщить(СтрокаБезКавычки); // Alena Egorova

    https://helpf.pro/faq/view/560.html

    Reply
  9. bocr

    Пользуемся ALT и клавиатурой NumLock

    ALT+0171 — «

    ALT+0187 — »

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *