Книга знаний

1С:Предприятие / v8 / Приемы программирования

v8: Функция получения представления идентификатора из самого идентификатора

В конфигураторе во многих местах после ввода имени объекта некоторые другие его свойства, связанные с представлением, заполняются автоматически, преобразую имя в строку естественного языка. Это очень удобно, но программно такая функция платформы, к сожалению, недоступна. Так давайте напишем свою.Автор статьи: TormozIT | Редакторы: Buran
Последняя редакция №5 от 28.01.07 | История
URL: http://kb.mista.ru/article.php?id=457

Ключевые слова: Синоним, Представление, Идентификатор


Подразумевается, что вы придерживаетесь стандартов и идентификаторы строите по правилу преобразования фразы естественного языка путем замены регистра первой буквы каждого слова в верхний и удаления всех пробелов и знаков препинания. Хотя символ "_" не рекомендуется использовать в идентификаторах, я включил его поддержку в функцию.

// Получает представление из идентификатора по правилу 
// "Дебиторка_По_контрагентамСИнтерваламиСНГДля__Руководства" => "Дебиторка По контрагентам с интервалами СНГ для  Руководства".
// После символа "_" регистр не меняется, а сам символ заменяется на " ".
//
// Параметры:
//  ИсходнаяСтрока – Строка – идентификатор.
//
// Возвращаемое значение:
//               – Строка – представление.
//
Функция ЛксПолучитьПредставлениеИзИдентификатора(ИсходнаяСтрока) Экспорт

    СтрокаВозврата = Сред(ИсходнаяСтрока, 1, 1);
    Для Сч = 2 По СтрДлина(ИсходнаяСтрока) Цикл
        ПредыдущийСимвол = Сред(ИсходнаяСтрока, Сч - 1, 1);
        ТекущийСимвол = Сред(ИсходнаяСтрока, Сч, 1);
        СледующийСимвол = Сред(ИсходнаяСтрока, Сч + 1, 1);
        ПослеследующийСимвол = Сред(ИсходнаяСтрока, Сч + 2, 1);
        Если ТекущийСимвол = "_" Тогда 
            СтрокаВозврата = СтрокаВозврата + " ";
            Продолжить;
        ИначеЕсли ВРЕГ(ТекущийСимвол) = ТекущийСимвол Тогда 
            Если Ложь
                ИЛИ ВРЕГ(ПредыдущийСимвол) <> ПредыдущийСимвол
                ИЛИ (Истина 
                    И ПредыдущийСимвол <> "_"
                    И ВРЕГ(ПредыдущийСимвол) = ПредыдущийСимвол
                    И ВРЕГ(СледующийСимвол) <> СледующийСимвол)
            Тогда 
                СтрокаВозврата = СтрокаВозврата + " ";
                Если Ложь
                    ИЛИ ВРЕГ(СледующийСимвол) <> СледующийСимвол
                    ИЛИ ВРЕГ(ПослеследующийСимвол) <> ПослеследующийСимвол
                Тогда
                    ТекущийСимвол = НРЕГ(ТекущийСимвол);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        СтрокаВозврата = СтрокаВозврата + ТекущийСимвол;
    КонецЦикла;
    Возврат СтрокаВозврата;

КонецФункции // ЛксПолучитьПредставлениеИзИдентификатора()


Buran:
самым эффективным инструментом работы со строками считаются Регулярные Выражения (RegExp).

Вот пример кода с использованием регулярных выражений, аналогичный предыдущему:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "([а-я](?=[А-Я]))|([А-Я](?![А-Я]))|_";
Результат = RegExp.Replace("Дебиторка_По_контрагентамСИнтерваламиСНГДля__Руководства"," $1 $2"));

Комментарии к шаблону:
Первая скобка - поиск начала новых слов.
Вторая - чтобы не заменять аббревиатуры.
Ну, и подчерк заменяется просто пробелом.
Ввиду того, что на VBScript Perl'овые регекспы реализованы не полностью, результат выдает пробел в начале слова, да и шаблон на так изящен. Однако, код работает, проверено.

Подробнее о регулярных выражения можно почитать здесь: http://ru.wikipedia.org/wiki/Регулярные_выражения_выражения

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика