Архив метки: 1С 7.7

1C Выделене подстрок с помощью регулярного выражения

Пример тестировался на 1С 7.7, в 1С 8.х нужно только вместо «СоздатьОбъект» писать «Новый», ну и учитывать тот факт, что в восьмерке есть булев тип данных.

К примеру, перед нами задача, получить номер документа для вывода на печать налоговой накладной. Но в базе документы имеют примерно такие номера «FGT-00072», «AR-00120» и т.д. Если бы до тире было фиксированное число символов, можно было бы брать подстроку по знак «-«, затем брать из строки ту часть, которая стоит за минусом и применять чункцию Число(). В результате получим то, что нужно, то есть «FGT-00072» превратится в 72, а если вместо фиксированной части поиском найти позицию «-«, то и второй номер можно легко преобразовать. Но случаи бывают разные, я предлагаю создать универсальную функцию, с помощью которой вы можете находить любые подстроки, используя регулярное выражение.

Название функции возможно каламбурное, но не будем на это обращать внимание. Она получает текст, регулярное выражение применяемое к этому тексту и номер позиции, которую нужно возвратить.

Пример:

НомДокБН = регВырИгнорРегистр(Строка(«FGT-00072″),»([a-zA-Z]*)-?(0*?)([^0]\d*)»,2); //вернет «72»
ПостфиксБН = регВырИгнорРегистр(Строка(«03″),»(0*?)([^0]\d*)»,1);//Вернет «3» (универсальный убиратель ведущих нулей)

Мне такой подход понравился из-за универсальности, не нужно писать новые циклы и поиски с проверками под разные ситуации. Используем регулярное выражение и всё.

Собственно сама функция

//Выполняет поиск в строке по регулярному выражению
//номер позиции с нуля
//
функция регВырИгнорРегистр (текст, выражение, номерПозиции)
Если (ПустоеЗначение(текст)=1) ИЛИ (ПустоеЗначение(выражение) =1) ИЛИ (ПустоеЗначение(номерПозиции)=1) Тогда
возврат текст;
КонецЕсли;
Истина=-1;
Ложь=0;
RegExp = CreateObject(«VBScript.RegExp»);

RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим

RegExp.Pattern = выражение; //Ищем вхождение
Matches=RegExp.Execute(текст);
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Match = Matches.Item(0);
SubMatches = Match.SubMatches;
SubMatch=SubMatches.Item(номерПозиции);
возврат (SubMatch);
Иначе
возврат «»;
КонецЕсли;
Возврат «»;
КонецФункции

1С 7.7 функция распознавания типа значения

Гениальное просто
Гениальное просто

Эта функция использует регулярные выражения vbscript и может делить любое переданное значение на: целое число, число вообще, дату и строку. Изначально нужно передавать строковой параметр, к примету «12,5», функция вернет «Число», а если передать «12», тогда вернет «ЧислоЦелое»

Возвращает: Определяемый тип, возвращаемый тип — строка. Возможные варианты: «Число», «ЧислоЦелое», «Строка», «Дата».

Обратите внимание, что если передать в качестве параметра строку «12.0», будет возвращен параметр «Число», а не «ЧислоЦелое».

Применение: Я использую для определения типа при чтении данных из различных файлов типа excel, csv или ADO таблиц.

Текст функции:

Функция глОпределитьТипЯчейкиADO(Значение)
//Разделяет типы на строку, число и дату
 Если ПустоеЗначение(Значение)=1 тогда
  возврат 0;
 конецЕсли;
Значение=Строка(Значение);
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");

RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
//есть ли буквы
RegExp.Pattern = "^[-\+]?\d+$";
 Если RegExp.Test(Значение)=Истина Тогда
 Возврат "ЧислоЦелое";
КонецЕсли;
RegExp.Pattern = "^[-\+]?\d*[.,]?[\d]{0,}$"; //число вообще (и целое и со знаками после точки или запятой)
Если RegExp.Test(Значение)=Истина Тогда
 Возврат "Число";
иначе
 RegExp.Pattern = "^\d{1,2}[\.\/-]([0]?\d|1[12])[\.\/-]\d{2,4}$"; //Дата
 //датой считает форматы вида 2.12.2014 , 01.12.14, 3.08.2014, 30-10-2014, 15/12/14 и т.д. первая цифра может быть
 //    одна или две. Цифр года 2, 3 или 4
 если RegExp.Test(Значение) = Истина Тогда
  Возврат "Дата";
 Иначе
  Возврат "Строка";
 КонецЕсли;
КонецЕсли;
КонецФункции