Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Войти | Зарегистрироваться )




>  Подборка функций 1С
LVSprg
Отправлено: 25.08.18, 14:54


Молчаливый
*

Группа: Пользователи
Сообщений: 1
Регистрация: 24.08.18
Пользователь №: 62004


Работая с 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С Предприятие 8 · Просмотр сообщения: #144747 · Ответов: 0 · Просмотров: 1731
 


Новые сообщения  Открытая тема (есть новые ответы)
Опрос  Опрос (есть новые голоса)
Нет новых сообщений  Открытая тема (нет новых ответов)
Нет новых голосов  Опрос (нет новых голосов)
Популярная тема  Горячая тема (есть новые ответы)
Закрыта  Закрытая тема
Нет новых  Горячая тема (нет новых ответов) Перемещена  Тема перемещена
 

RSS Текстовая версия Сейчас: 26.04.24, 8:10
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!