Версия для печати темы (https://pro1c.org.ua/index.php?s=becda52e235c3eb4931aabb885e76e23&showtopic=47429)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С Предприятие 8 _ Подборка функций 1С

Автор: LVSprg 25.08.18, 14:54

Работая с 1С получил много помощи по возникающим проблемам на этом форуме,
да и на других. Большое всем спасибо. Решил добавить и свои "5 копеек".
Выкладываю накопившуюся подборку функций, облегчающих жизнь при
написании кода. Комментированы скупо, но ничего сверхсложного.
Извиняюсь за использование местами англо-язычного синтаксиса
(sorry, ностальгия по FoxPro9).

P.S. Первый раз выкладываю текст. Пока не во всем разобрался.
Просто ctrl/C - ctrl/V - и в свой модуль

Код

///////////////////////////////////////////////////////////////////  
//                                                               //
//                                                               //
//         Сборник функций, упрощающих жизнь.                    //
//                                                               //
//                                                               //
//                                                               //
///////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////
//                                                               //
//              РАБОТА     СО     СТРОКАМИ                       //
//                                                               //
///////////////////////////////////////////////////////////////////

// Форматирует строку pStr в строковое поле (т.е. строку)
// фиксированной длины = pLEN (лишнее - обрезается)
// Возврат: строка СЛЕВА, пробелы справа
Функция StrFildLeft(pStr,pLEN)  экспорт
  перем ii;
  перем jj;
  перем ss;
  
  ss = СокрЛП(pStr);
  ss = ss + REPLICATE(" ",pLEN );
  ss = Лев(ss,pLEN);      
  Возврат ss;    
КонецФункции

// Форматирует строку pStr в строковое поле (т.е. строку)
// фиксированной длины = pLEN (лишнее - обрезается)
// Возврат: строка СПРАВА, пробелы слева
Функция StrFildRight(pStr,pLEN)  экспорт
  var ii;
  var jj;
  var ss;
  ss = СокрЛП(pStr);
  ss = REPLICATE(" ",pLEN )+ ss;
  ss = Right(ss,pLEN);       
  Return ss;    
КонецФункции

// Форматирует строку pStr в многострочный текст
// со строками фиксированной длины = pLEN
//
Функция StrToText(pStr,pLEN)  экспорт
  var ii;
  var jj,kk;
  var ss,s1;
  симвПС = Символы.ПС;
  ss = "";
  kk = 0;
  ii = СтрДлина(pStr);
  For jj = 1 To ii Do
     s1 = Сред(pStr, jj, 1);
     ss = ss + s1;
     kk = kk + 1;
     If kk >= pLEN Then
        ss = ss + симвПС;
        kk = 0;
     EndIf;
  EndDo;
      
  Return ss;    
КонецФункции

// Повторить строку/символ  pSS  pLEN раз
//
Функция  REPLICATE(pSS,pLEN )экспорт
  var ii;
  var ss;
  ss = "";
  For ii = 1 TO pLEN Do
     ss = ss + pSS;
  EndDo;    
  Return ss;    
КонецФункции

// Сравнить две строки. Параметры:
// ss1     - первая строка (левая)
// ss2     - вторая строка (правая)
// Сравнение: ss1 = ss2
// Priznak - как сравнивать:
//   Priznak = 0  - по правой строке (если она короче
//                  и равна началу левой строки, результат = ИСТИНА
//   Priznak = 1  - более короткая строка дополняется пробелами
//   По умолчанию Priznak = 0
Функция СтрокиРавны(ss1,ss2,Priznak=0) экспорт
   Len1 = СтрДлина(ss1);
   Len2 = СтрДлина(ss2);    
   rez  = True;  
   Если Priznak = 1 Тогда    
       Если  Len1 > Len2 Тогда
          ss2 = ss2 + REPLICATE(" ",Len1 - Len2 );
       КонецЕсли;
       Если  Len1 < Len2 Тогда
          ss1 = ss1 + REPLICATE(" ",Len2 - Len1 );
       КонецЕсли;
   КонецЕсли;
   Len1 = СтрДлина(ss1);
   Len2 = СтрДлина(ss2);  
   ii = 0;
   str1 = ВРег(ss1);
   str2 = ВРег(ss2);
   For ii = 1 To Len2 DO              
      If КодСимвола(str1,ii)  КодСимвола(str2,ii)  Then
        rez  = False;    
        Break;  
      EndIf;      
   EndDo;
       
   Return rez;     
КонецФункции

// Преобразовывает целое pInt в строковый код  вида "0007"
// (с ведущими нулями). Длина кода = pLEN
Функция IntToKod(pInt,pLEN)  экспорт
  var ss,s1,s2;
  ss = Строка(pInt);
  ss = СокрЛП(ss);
  If СтрДлина(ss) > pLEN Then
        s1 = REPLICATE("*",pLEN + 10);
        s2 = s1;
     else
     s1 = REPLICATE("0",10);    
     s2 = s1 + ss;
  EndIf;
  //сообщить("IntToKod s2 =" + s2);
  s2 = Прав(s2,pLEN);
       
  Return s2;    
КонецФункции

// Вх. параметр - код (строка вида "0007").
// Преобразует в (код + 1)
// Разрядность кода берется по вх параметру.
// Если во входном коде есть буквы (а должны быть только цифры )
//   - возврат входного значения
Функция Next_Kod(strKod)  экспорт
   var LenKod;    
   var ii,jj;
   var ss;
  
   jj = СтрДлина(strKod);
   if  ЭтоЦелое(strKod) then
        ii = Число(strKod) + 1;
        ss = IntToKod(ii,jj);
    else
    ss = strKod;    
   endif;      
  
   Возврат ss;  

КонецФункции


//   ----  Разбор строк по разделителю  ----

// Подсчет количества "слов" в строке между
// разделителями razd (м.б. любое кол-во символов).
// Применение: часто для разбора пути файла
//             razd = ""
Функция StrWordCount(str,razd) Export
   перем ii;
   перем jj;  
   перем lenStr;
   перем ss;
  
   jj     = 0;
   rez    = 0;
   lenStr = StrLen(str);
   For ii = 1 To lenStr Do
      ss = Mid(str,ii,1);
      If ss = razd Then
        jj = jj + 1;  
      Endif;        
   EndDo;
   jj = jj + 1;  
   Return jj;
      
КонецФункции      

// Получить "слово" номер WrdNum (нумерация с 1)
// (см. описание ф-ции StrWordCount()  )
Функция StrGetWordNum(str,WrdNum,razd) Export
   перем ii;
   перем jj;  
   перем kk;
   перем lenStr;
   перем ss;
   перем s1;
  
   jj     = 0;
   rez    = 0;
   ss     = "";
   s1     = "";
   kk     = WrdNum - 1;
   lenStr = StrLen(str);
   For ii = 1 To lenStr Do
      ss = Mid(str,ii,1);
      If ss = razd Then
        jj = jj + 1;  
        Continue;
      Endif;
      If jj = kk then
        s1 = s1 + ss;
      EndIF;      
   EndDo;
   s1 = СокрЛП(s1);    
   Return s1;
      
КонецФункции

// Получить подстроку из "слов " с номера 1 по номер WrdNum (нумерация с 1)
// (см. описание ф-ции StrWordCount()  )
Функция StrGetTxt_1toNum(str,WrdNum,razd) Export
   ii    = 0;    
   jj    = 0;
   ss    = "";        
   ssrzd = razd;
  
   jj    = StrWordCount(str,razd);
   if  WrdNum > jj  then
      WrdNum = jj;  
   endif;  
   For ii = 1 To WrdNum Do
      if ii = WrdNum then
        ssrzd = "";  
      endif;
      ss =  ss + StrGetWordNum(str,ii,razd) + ssrzd;           
   EndDo;    
  
   Return ss;

КонецФункции    

// Получить подстроку из WrdNum "слов " от конца строки
// (см. описание ф-ции StrWordCount()  )    
Функция StrGetWordNumПрав(str,WrdNum,razd) Export
   ii    = 0;    
   jj    = 0;
   kk    = 0;
   ss    = "";        
   ssrzd = razd;
  
   jj    = StrWordCount(str,razd);
   kk    = jj - WrdNum + 1;
   if kk = 5 Then
         Break;
       EndIF;
   EndDo;
   //ОчиститьСообщения();
  
   Возврат RetRez;
КонецФункции

// RootOnly Выбор только папок в стартовой папке и ниже
// p1Путь   должен быть без завершающего слеша
// Для 8.2 и более -  &НаКлиенте
Функция RootOnlyВыбратьПапку(p1Путь,p2Маска = "*.*") Экспорт
   RetRez     = "";
   ss         = "";
   s1         = "";
   ii         = 0;
   CiklDO     = True;
   RootDir    = ВРег(p1Путь);
   LenRootDir = СтрДлина(RootDir);
   SelectDir  = "";
   While CiklDO Do    //[Break;]  [Continue;]
       SelectDir = ВыбратьПапку(p1Путь);
       s1        = ВРег(SelectDir);
       SubStr    = Лев(s1,LenRootDir);
       IF ПустаяСтрока(SelectDir) Then
          Break;
       EndIf;
       If SubStr = RootDir Then
             // стартовый путь содержится в выбранном -
             // значит все ОК
             CiklDO  = False;              
             RetRez  = SelectDir;
          else
          // ошибка: вышли выше стартового пути
          ss = "Ошибка: выход за пределы начального пути!";
          Предупреждение(ss, 0, p1Путь);            
       EndIf;
       ii = ii + 1;
       If ii >= 5 Then
         Break;
       EndIF;
   EndDo;
   //ОчиститьСообщения();
  
   Возврат RetRez;
КонецФункции

// Возвращает путь из полного имени файла (путь + имя)
// Путь возвращается без обратного слэша ("").
// (Проще потом добавить слэш, чем выяснять его наличие и удалять)
Функция ВыделитьПуть(parПуть) Экспорт
   str1     = parПуть;
    razd     = "";
    ss       = "";
    jj       = 0;
    s1       = razd;
   ii       = StrWordCount(str1,razd);    
    if ii > 1 Then
        ss = StrGetTxt_1toNum(str1,ii - 1,razd);
    endif;
        
   Return ss;    
КонецФункции

// функция для для удобочитаемости алгоритма
// Параметр - полный путь папки
Функция ВыделитьИмяПапкиИзПути(ПолнПуть) экспорт

   стр1 = StrGetWordNumПрав(ПолнПуть,1,"");
    
    Возврат стр1;
КонецФункции    
    
// По сути ф-ция для удобочитаемости алгоритма
Функция ВыделитьИМЯф(parПолнПуть) Экспорт
   str1     = parПолнПуть;
    razd     = "";
    ss       = "";
    jj       = 0;
    s1       = razd;
   ii       = StrWordCount(str1,razd);    
    
   ss       = StrGetWordNum(str1,ii,razd);
        
   Return ss;    
КонецФункции

// Примечательно, что применима и для просто пути
// (без завершающего слеша ("")   )
Функция СуществуетФайл(пИмяФ) Export
    rez  = False;
    
    Файл = Новый Файл(пИмяФ);
    if Файл.Существует() then
      rez  = True;
    EndIf;

    Return rez;
КонецФункции




///////////////////////////////////////////////////////////////////
//                                                               //
//              РАБОТА     С      Ч И С Л А М И                  //
//                                                               //
///////////////////////////////////////////////////////////////////


// Анализ первого символа переданной строки
Функция ЭтоЦифра(пар1) Экспорт
   ss       = "";    
    ii       = 0;
    varBool  = True;
    str      = "0123456789";
   ss       = СокрЛП(пар1);
    ss       = Лев(ss,1);
    ii       = Найти(str,ss);
    if ii = 0 then
        varBool  =  False;
    endif;      
    
   Return varBool;    
    
КонецФункции    

// анализ переданной строки, что описано целое число
Функция ЭтоЦелое(пар1) Экспорт
   ss       = "";
    s1       = "";
    ii       = 0;
    jj       = 0;
    varBool  = True;    
   ss       = СокрЛП(пар1);
    jj       = СтрДлина(ss);
    for ii = 1 to jj do
       s1 = Сред(ss, ii, 1);
       if not ЭтоЦифра(s1) then
         varBool  = False;  
         Break;  
       endif;          
    enddo;    
    
   Return varBool;                                                
КонецФункции    

// Получить короткую дату (ф-ция для удобочитаемости алгоритма)
Функция GetStrDateShort(пар1Date) Экспорт
   var ss,s1,s2,s3,s4;
   var razdel;
  
   razdel = "-";
   ss   = Строка(пар1Date);
   ss   = StrGetWordNum(ss,1," ");
   s1   = StrGetWordNum(ss,1,".");
   s2   = StrGetWordNum(ss,2,".");
   s3   = StrGetWordNum(ss,3,".");
   s3   = Прав(s3,2);
  
   Return s1 + razdel + s2 + razdel + s3;    

КонецФункции

// Получить модуль от деления p1/p2
FUNCTION Mod(p1,p2)Экспорт
  rez = 0;
  tmp = 0;
  
  tmp = p1 / p2;
  tmp = int(tmp);
  rez = p1 - tmp;
  
  RETURN rez ;
  
ENDFUNCTION




///////////////////////////////////////////////////////////////////
//                                                               //
//              Д  И  А  Л  О  Г  И                              //
//                                                               //
///////////////////////////////////////////////////////////////////

// диалог: вопрос - ответ ДА/НЕТ
// Ф-ция для упрощения работы
Функция ОтветНаВопросДА(пВопрос = "Да или Нет?") Export
    Результ = Ложь;

    Режим  = РежимДиалогаВопрос.ДаНет;     
    Текст  = пВопрос;
    Ответ  = Вопрос(Текст, Режим, 0);
    
    Если Ответ = КодВозвратаДиалога.Да Тогда
       Результ = Истина;
    КонецЕсли;

    Возврат  Результ;
КонецФункции

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua