
При знакомстве 1С часто возникает необходимость проследить и сохранить стек вызовов функций в каком-нибудь модуле. Простейший и надежный способ - это вставить в каждое определение процедуры или функции сообщение об ее вызове.
Показанная ниже программа считывает файл с определениями 1С процедур и функций, в каждое определение процедуры или функции, в первую строку, вставляет сообщение об ее вызове.
Как пользоваться этой программой:
1. Копируете текст файла или модуля 1С с определениями процедур и функций - в файл data.txt. Файл data.txt должен находиться в одном каталоге со скриптом программы.
2. Запускаете скрипт программы. Результат будет находится в файле fileOut.txt.
При помощи этой программы удобно отслеживать цепочку вызовов процедур и функций!
<?php
//-----------------------------
// откроем файл для вывода ошибок
$filename = "error.txt";
if(!($errorFile = fopen($filename, "w"))){
print("'$filename' could not be created\n");
exit;
}
//-----------------------------
// откроем файл для вывода
$filename = "fileOut.txt";
if(!($fileOut = fopen($filename, "w"))){
fputs($errorFile, "'$filename' could not be created\n" );
exit;
}
//-----------------------------
// откроем файл для чтения
$filename = "data.txt";
if(!($myFile = fopen($filename, "r"))){
fputs($errorFile, "'$filename' could not be opened\n" );
exit;
}
$flag = false;
$flagIn = 0;
$rest = "";
//-----------------------------
//считаем построчно из файла data.txt в файл fileOut.txt
while(!feof($myFile)){
//читаем строку из файла
$myLine = fgets($myFile, 1080);
$str_temp = " $myLine";
$str_len = strlen($myLine);
if($str_len < 4){//пустая строка!
fputs($fileOut, $myLine); //скопируем исходную строку
continue;
}
if($flagIn == 1){//$flagIn == 1 - эта строка находится в теле функции
$pos_per = strpos($str_temp, "Перем");
if($pos_per > 0){//это объявление локальной переменной! Вернемся к началу цикла.
fputs($fileOut, $myLine); //скопируем исходную строку
continue;
}
fputs($fileOut, " Сообщить(\"$rest \");\r\n"); //запишем в файл строку с сообщением
fputs($fileOut, $myLine); //скопируем исходную строку
$flagIn = 0;
continue;
}
$pos2 = strpos($myLine, ")");
if($flag == true){
$pos2 = strpos($myLine, ")");
}
if(strpos($str_temp, "Функция") || strpos($str_temp, "Процедура")) {//лексема найдена
//Найдем позиции символов
$pos = strpos($myLine, "("); $pos2 = strpos($myLine, ")");
if ($pos > 0) {
$rest = substr($myLine, 0, $pos); // возвращает подстроку от начала и до символа "("
if ($pos2 > 0) {//найдены открывающая и закрывающая скобки в одной строке
fputs($fileOut, $myLine); //лексема найдена, сначала скопируем исходную строку
$pos3 = strpos($rest, " ");//найти первый пробел в этой подстроке
if ($pos3 > 0) {//найден первый пробел в подстроке
$rest2 = substr($rest, 0, $pos3); // возвращает подстроку от начала и до первого пробела
$pos4 = strpos($rest2, "//");//ищет символы комментария
if ($pos4 === 0) {//эта строка - комментарий. Оставим ее без изменений.
continue;
}
$flagIn = 1; //запишем в файл строку с сообщением
}
}
else{//найдена только открывающаяся скобка!
fputs($fileOut, $myLine);//лексема найдена, сначала скопируем исходную строку
$flag = true;
}
} //end if $pos > 0
}//end if лексема найдена
elseif(($pos2 > 0) && $flag == true){//найдена закрывающая скобка после открывающей
fputs($fileOut, $myLine);
$flagIn = 1; //запишем в файл строку с сообщением
$flag = false;
}
else{//лексемы не найдены, записываем строку без изменений
fputs($fileOut, $myLine);
}
}
// закроем файлы
fclose($myFile);
fclose($fileOut);
fclose($errorFile);
?>
|