1С ВРег, 1С НРег, 1С ТРег – изменение «регистра» символов

Функции 1С ВРег(Строка) и 1С НРег(Строка) приводит все символы в строке к верхнему (АБВГД) или нижнему (абвгд) регистру.

Функция 1С ТРег(Строка) приводит все символы в строке к нижнему (абвгд) регистру, а первую букву в каждом слове к верхнему (АБВГД).


Например:

  • Выполняем 1С ВРег(«ПРИвет»)
  • 1С возвращает «ПРИВЕТ»
  • Выполняем 1С НРег(«приВЕТ»)
  • 1С возвращает «привет»
  • Выполняем 1С ТРег(«СЕРГЕЕВ-лопатин андрей с»)
  • 1С возвращает «Сергеев-Лопатин Андрей С»

Функция 1С ТРег() используется при обработке полей, где пользователь должен ввести ФИО. Например в обработчике ПриИзменении у текстового поля на форме, с именем реквизита формы ФиоКонтактногоЛица:
ФиоКонтактногоЛица = ТРег(СокрЛП(ФиоКонтактногоЛица));

Функции 1С ВРег() и 1С НРег() используются чаще всего в условиях (сравнении) данных, введенных пользователем с шаблоном. Например – во многих типовых конфигурациях есть справочник стран мира, а в нем элемент «РОССИЯ». При работе документа нам известно, что если выбрана «РОССИЯ», то поле ГТД «не видно».

Если мы напишем:
Если СтранаСсылка.Наименование = "Россия" Тогда

То эта строка может не сработать. Программируя, мы не знаем как точно будет называться элемент — «Россия», «россия» или «РОССИЯ». При сравнении же учитывается регистр букв.

Поэтому при сравнении лучше использовать 1С ВРег:
Если ВРЕГ(СокрЛП(СтранаСсылка.Наименование)) = "РОССИЯ" Тогда

Тогда мы точно будем уверены, что как бы не ввел пользователь – сравнение сработает.

На примере нашего анализатор текста сделаем с помощью 1С ВРег, 1С НРег и 1С ТРег – «нормализации» ФИО – первая буква в фамилии, имени и отчестве с большой, а остальные с маленькой, а к сокращениям добавим точку (про анализатор текста см. выше «Функции работы со строками 1С»). Примерно также работает 1С ТРег(), кроме добавления точки к сокращениям.

Допустим:

  • что нам на «входе» подается строка, содержащая ФИО в «неизвестном нам виде, как ввел пользователь»
  • ФИО может быть как полная фамилия, а имя и отчество в сокращенном, так и полностью
  • регистр букв неизвестен

[VIP_CONTENT]

//Делает каждое слово ФИО с большой буквы, а остальные - маленькие; к сокращениям добавляет точку
Функция НормализацияФИО(ФИО)
     
     //проверим - не пустой ли параметр, а то и "нормализовывать" нечего...
     Если ПустаяСтрока(ФИО) Тогда
          Возврат ФИО; //если пустой - вернем тот же параметр, который нам передали
     КонецЕсли;
     
     Сообщить("ФИО было: " + ФИО);
     
     //перечислим символы, которые мы разрешаем использовать в ФИО
     //считаем, что всеми остальными символами производится разделение слов
     РазрешенныеСимволы = "абвгдеёжзийклмнопрстуфхцчшщьыъэюя";
     Результат = ""; //сюда будем копировать результат (по букве)
     
     //поработаем над строкой в целом
     //уберем пробелы слева и справа, если такие есть
     //уберем точки (заменим на "ничего") - чтобы не путаться, когда нужно добавить точку - вдруг в одном месте поставили, а в другом нет
     //приведем к нижнему регистру всю строку, чтобы только некоторые буквы осталось сделать большими, также это позволит сравнивать с разрешенными символами
     НормализированныйТекст = НРЕГ(СтрЗаменить(СокрЛП(ФИО), ".", ""));
     Результат = ВРЕГ(ЛЕВ(НормализированныйТекст, 1)); //первую букву сразу скопируем в результат, сделав большой
     НормализированныйТекст = Прав(НормализированныйТекст, СтрДлина(НормализированныйТекст) - 1); //это весь текст, кроме первой буквы
     
     //вдруг весь текст состоял из одной буквы?
     Если СтрДлина(НормализированныйТекст) = 1 Тогда
          Возврат Результат; //тогда у нас все готово
     КонецЕсли;
     
     ДлинаСлова = 0; //чтобы добавлять в конце сокращений точку - нам нужно считать длину слова
     ЗапрещенныйСимвол = Ложь; //как определить начало слова? будем определять этим флагом
     
     Сч = 2; //счетчик буквы в тексте, так как первая уже скопирована - начинаем со второй
     Длина = СтрДлина(НормализированныйТекст); //общая длина текста, для использования в цикле
     Пока Сч <= Длина Цикл //итак, цикл по буквам - со второй до последней           Буква = Лев(НормализированныйТекст, 1); //берем первую букву           НормализированныйТекст = Прав(НормализированныйТекст, СтрДлина(НормализированныйТекст) - 1); //удаляем ее из текста                      РазрешенныйСимвол = Найти(РазрешенныеСимволы, Буква); //проверяем - это буква слова (разрешенная) или "пробел"           Если не РазрешенныйСимвол Тогда //функция Найти() возвращает позицию буквы в слове, а если не найдено - 0, булево в 1С может быть выражено в числах 0 - это ИСТИНА, а больше нуля - это ЛОЖЬ, пользуемся этим                ЗапрещенныйСимвол = Истина; //раз это "пробел", то взводим флаг - мы между словами                Если ДлинаСлова = 1 Тогда //ПЕРЕД пробелом было слово и мы считали его длину - если длина слова 1, а потом "пробел", то нужно добавить точку                     Результат = Результат + "."; //добавляем точку                     ДлинаСлова = 0; //обнуляем длину слова, ведь сейчас идут "пробелы", а не слово                КонецЕсли;           Иначе //если это буква слова, а не "пробел"                Если ЗапрещенныйСимвол Тогда //если это первая буква слова (то есть ПЕРЕД ней были "пробелы")                     Буква = ВРЕГ(Буква); //делаем ее большой                     ЗапрещенныйСимвол = Ложь; //сбрасываем флаг - теперь идет слово, а не пробелы                     ДлинаСлова = 1; //устанавливаем длину в 1 (ведь сейчас первая буква слова, значит пока что длина = 1)                Иначе //если это НЕ первая буква слова                     ДлинаСлова = ДлинаСлова + 1; //увеличиваем длину                КонецЕсли;           КонецЕсли;                      Результат = Результат + Буква; //копируем букву           Сч = Сч + 1; //переходим к следующей букве (увеличиваем счетчик букв в тексте)      КонецЦикла;            //осталась последняя буква текста      Если не ПустаяСтрока(НормализированныйТекст) Тогда           //если флаг "пробелов" "взведен" - значит перед буквой был пробел           //если счетчик длины слова еще обнулен, значит это первая буква в слове           Результат = Результат + ?(ЗапрещенныйСимвол, ВРЕГ(НормализированныйТекст), НормализированныйТекст) + ?(ДлинаСлова = 0, ".", "");      КонецЕсли;            Сообщить("ФИО стало: " + Результат);            Возврат Результат;       КонецФункции

[/VIP_CONTENT]

Пример использования созданных нами функций:
НормализацияФИО("ПЕТРОВ-немерович сергей александрович");
НормализацияФИО("бегемотов с а");

Сообщения от 1С в результате выполнения этого кода:
ФИО было: ПЕТРОВ-немерович сергей александрович
ФИО стало: Петров-Немерович Сергей Александрович
ФИО было: бегемотов с а
ФИО стало: Бегемотов С. А.

Обратите внимание на следующие использованные конструкции.
Момент 1:
НормализированныйТекст = НРЕГ(СтрЗаменить(СокрЛП(ФИО), ".", ""));

Мы могли написать это так:
НормализированныйТекст = СокрЛП(ФИО);
НормализированныйТекст = СтрЗаменить(НормализированныйТекст, ".", "");
НормализированныйТекст = НРЕГ(НормализированныйТекст);

Но вызов функции можно «вкладывать» друг в друга, для экономии текста программы.

Момент 2:
РазрешенныйСимвол = Найти(РазрешенныеСимволы, Буква);
Если не РазрешенныйСимвол Тогда

Мы могли написать это так:
Позиция = Найти(РазрешенныеСимволы, Буква);
Если Позиция = 0 Тогда

Но значения «булево» (истина, ложь) можно выразить в числах (ложь – 0, истина – остальное), и наоборот. Чем мы и воспользовались, получив более читаемый текст.
Момент 3:
Результат = Результат + ?(ЗапрещенныйСимвол, ВРЕГ(НормализированныйТекст), НормализированныйТекст) + ?(ДлинаСлова = 0, ".", "");

Мы могли написать это так:
Если ЗапрещенныйСимвол Тогда
     Результат = Результат + ВРЕГ(НормализованныйТекст);
Иначе
     Результат = Результат + НормализованныйТекст;
КонецЕсли;
Если ДлинаСлова = 0 Тогда
     Результат = Результат + ".";
КонецЕсли;

Но оператор ?(условие, что делать если да, что делать если нет) позволяет прописывать условные действия в более компактном виде.