Группа: Пользователи
Сообщений: 1
Спасибо сказали: 3 раз
Рейтинг: 0
Работая с 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;
// Получить модуль от деления 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.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!