Работая с 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