Функции 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 Тогда
Результат = Результат + ".";
КонецЕсли;
Но оператор ?(условие, что делать если да, что делать если нет) позволяет прописывать условные действия в более компактном виде.