Функции сообщают о себе Печать
Автор: А.Волос   

  При знакомстве 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);
?>

Обновлено 07.10.2015 11:04