<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=2496</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=2496&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoHotkey: автоматизация Конфигуратора 1С v8.x».]]></description>
		<lastBuildDate>Wed, 16 Sep 2009 10:24:51 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=28246#p28246</link>
			<description><![CDATA[<p>Исправил ошибки в наборе, выложил файл выше.<br />Например, были возможны ошибки при работе &quot;Процедуры/функции модуля&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (artbear)]]></author>
			<pubDate>Wed, 16 Sep 2009 10:24:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=28246#p28246</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=28174#p28174</link>
			<description><![CDATA[<p><em>Если кому-то не нравится отсутствие сортировки по названию процедуры/функции в скрипте &quot;Процедуры/функции модуля&quot;,</em><br />то для правки сортировки нужно исправить скрипт scripts.js<br />вместо строки №145<br /></p><div class="codebox"><pre><code>    lListProcFunc += &quot;(&quot; + j + &quot;) &quot;+delFP(FuncName) + &quot;\r\n&quot;;</code></pre></div><p>нужно написать<br />по-другому.<br />См.выложенный файл.</p>]]></description>
			<author><![CDATA[null@example.com (artbear)]]></author>
			<pubDate>Mon, 14 Sep 2009 13:55:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=28174#p28174</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=28159#p28159</link>
			<description><![CDATA[<p><strong>Ссылка на первоисточник идеи на форуме 1cpp.ru</strong> <a href="http://www.1cpp.ru/forum/YaBB.pl?num=1227553473/0">http://www.1cpp.ru/forum/YaBB.pl?num=1227553473/0</a></p><p>По данной тематике в указанной ветке автором Phoenix добавлены следующие скрипты, портированные из 77:<br />1. Мощнейший и удобный скрипт &quot;Процедуры и функции модуля&quot; : ctrl +1<br />Практически полный аналог скрипта из телепата для 77.<br /><strong>Всем рекомендую его юзать</strong>.</p><p>2. Поиск с рег.выражениями : Alt+f</p><p>3. Скрипт Авторские комментарии.</p><p>Описание скриптов есть в статье автора <br /><a href="http://itpath.ru/index.php?option=com_content&amp;view=article&amp;id=45:1cv8cfgext&amp;catid=28:1-8&amp;Itemid=56">http://itpath.ru/index.php?option=com_c … ;Itemid=56</a></p><p>Прикладываю файл полной сборки от Phoenix.<br />1. необходимо зарегистрировать все файла из каталога System<br />svcsvc.dll<br />CommonServices.wsc<br />VbsFunction.wsc<br />2. запускаем скрипт test.ahk и continueRow.ahk (уже описан выше).</p><p>ЗЫ <strong>Если при нажатии Ctrl+1</strong> в окне Конфигуратора v8 выдается ошибка <br />&quot;Невозможно добавить ссылку {578f85c8-89eb-4cda-ac7e-8f3bb34e8b54}&quot; <br />это значит, что у вас не установлен/не зарегистрирован Опенконф для 77&nbsp; <br />Например, у вас тупо нету 77. </p><p><strong>Для исправления</strong> можно в файле System\CommonServices.wsc <br />закомментировать или удалить строку 97, в которой написано <br />&lt;reference guid=&quot;{578f85c8-89eb-4cda-ac7e-8f3bb34e8b54}&quot; /&gt;</p>]]></description>
			<author><![CDATA[null@example.com (artbear)]]></author>
			<pubDate>Mon, 14 Sep 2009 09:13:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=28159#p28159</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16332#p16332</link>
			<description><![CDATA[<p>Скрипт для форматирования текста текущего модуля.<br />При нажатии F6 текст текущего модуля копируется в буфер обмена и помещается в файл во временном каталоге пользователя Windows, затем вызывается code_beautifier.pl (см. ниже) для обработки этого файла. После этого текст обработанного файла считывается и вставляется через буфер обмена в текущий модуль с заменой существующего там текста.<br /></p><div class="codebox"><pre><code>#include Clipboard_rus_subs.ahk

#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; форматирование текста модуля
F6::
code_beautifier_pl = code_beautifier.pl
module = %temp%\module.1s
ClipSaved := ClipboardAll ; сохранение содержимого буфера
text =

Clipboard =
Send ^{sc01E} ; Ctrl+A
Send, ^{Ins} ; Ctrl+Ins
FileDelete %module%
FileAppend, %Clipboard%, %module% ; помещение текста в файл
RunWait, perl %code_beautifier_pl% -f %module% ; вызов perl-скрипта
FileRead, text, %module%
;Clipboard := text
ClipPutText(text) ; помещение текста в буфер
ClipWait
Send +{Ins} ; Shift+Ins
Clipboard := ClipSaved ; восстановление содержимого буфера
ClipSaved = ; освобождение переменных (памяти)
text =
Return</code></pre></div><p>Используется дополнительный perl-скрипт code_beautifier.pl, который предоставляет некоторые преимущества по сравнению со стандартной командой Alt+Shift+F. Например, убирает лишние пустые строки, форматирует с отступом строки, если был перенос, делает первую букву служебных слов заглавной. Скрипт должен находиться в том же каталоге, что и ahk-скрипт, использующий его. Для работы потребуется установить <a href="http://activestate.com/Products/activeperl/index.mhtml">интерпретатор perl</a> (распространяется бесплатно).</p><p><strong>code_beautifier.pl</strong>:<br /></p><div class="codebox"><pre><code>#$ENGINE PerlScript
#$NAME CodeBeautifier
#для использования скрипта в OpenConf раскомментируйте две предыдущие строчки


#Автор - Диркс Алексей mailto:adirks@ngs.ru
#
#Эта программа является свободным программным обеспечением. Вы можете
#распространять и (или) модифицировать ее на условиях GNU Generic Public License.
#
#Данная программа распространяется с надеждой оказаться полезной, но
#БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, в том числе без гарантий пригодности для продажи или
#каких-либо других практических целей.
#
#С полным текстом лицензии на английском языке можно ознакомитсья по адресу
#http://www.gnu.org/licenses/gpl.txt или в файле
#gnugpl.eng.txt
#
#С русским переводом лицензии можно ознакомиться по адресу
#http://gnu.org.ru/gpl.html или в файле
#gnugpl.rus.txt
#
#Вы должны получить копию GNU Generic Public License вместе с копией этой программы.
#Если это не так - сообщите об этом авторам (mailto:adirks@ngs.ru , mailto:fe@alterplast.ru) или напишите
#Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA

use vars qw/ $InOpenConf /;
$InOpenConf = 1 if( defined $Configurator);

use strict &quot;vars&quot;; #Запретим использовать необъявленные переменные
use locale;
use POSIX qw(locale_h);
use Getopt::Long;
use File::Find; #package для рекурсивного обхода каталогов

#Объявим глобальные переменные
use vars qw/ $tab_size
    $blank_after_proc $blank_before_endproc $blank_after_endproc $procname_after_endproc
    $blank_after_if $blank_before_elseif $blank_before_endif
    $blank_after_while $blank_before_wend
    $space_around_ops /;
use vars qw/ $pat_comment $pat_proc $pat_endproc /;
use vars qw/ $file_name $root_dir $keep_old_files /;
use vars qw/ $line $line_number $trimmed_line $state @states $level /;
use vars qw/ $proc_name $proc_start /;
use vars qw/ $in_string $skip_blanks $blank_lines $unended_operator/;
use vars qw/ $FormattedText /;

############################################################################
##       Настройки форматирования кода      ################################
$tab_size = 4;
$blank_after_proc = 0;      #Пустая строка в начале процедуры/функции
$blank_before_endproc = 0;  #Пустая строка в конце процедуры/функции
$blank_after_endproc = 1;   #Пустая строка после процедуры/функции
$procname_after_endproc = 30;#Имя метода в комментариях после завершения  (например  КонецПроцедуры //ПриОткрытии)
                            #Значение этой переменной - это количество строк, после которого метод считается 
                            #&quot;большим&quot;, и нужно вставлять комментарий. Если размер метода меньше указанного, то 
                            #комментарий убирается
                            #Отрицательное значение - комментарии останутся как есть
$blank_after_if = 0;        #Пустая строка в начале блока &#039;Если&#039;
$blank_before_elseif = 0;   #Пустая строка перед &#039;Иначе&#039;, &#039;ИначеЕсли&#039;
$blank_before_endif = 0;    #Пустая строка перед &#039;КонецЕсли&#039;
$blank_after_while = 0;     #Пустая строка в начале циклов &#039;Пока&#039; и &#039;Для&#039;
$blank_before_wend = 0;     #Пустая строка в конце циклов &#039;Пока&#039; и &#039;Для&#039;
$space_around_ops = 1;      #Пробелы около операторов и после запятых
############################################################################

$pat_comment = &quot;\/\/.*&quot;; #EOL comment pattern
$pat_proc = &quot;Функция|Function|Процедура|Procedure&quot;;
$pat_endproc = &quot;КонецФункции|EndFunction|КонецПроцедуры|EndProcedure&quot;;

my $usage = &lt;&lt;EOF
Использование:
   perl code_beautifier.pl [параметры]
Параметры могут быть:
   -h|--help  - этот текст
   -d|--dir &lt;dir&gt;  - каталог, откуда начнётся поиск программных модулей для форматирования (*.1S).
       По умолчанию поиск начинается с текущего каталога.
   -f|--file &lt;file&gt;  - имя файла, который нужно отформатировать. Если задан и каталог и имя файла,
       то отформатирован будет только файл.
   -k|--keep  - сохраняет исходные модули нетрнутыми, изменения записываются в файлы *.new.1S
EOF
;

$root_dir = &#039;.&#039;;

#################################################################################
#################################################################################
main();  #для использования как OpenConf скрипт эту строчку надо закомментировать
#################################################################################
#################################################################################


sub main
{
    return if( $InOpenConf );
    
    die wintodos($usage) unless GetOptions(&quot;dir|d=s&quot; =&gt; \$root_dir, &quot;file|f=s&quot; =&gt; \$file_name, &quot;keep|k&quot; =&gt; \$keep_old_files);

    if( $file_name )
    {
        $File::Find::name = $file_name;
        $_ = $file_name;
        BeautifyModule();
    }
    else
    {
        find(\&amp;BeautifyModule, $root_dir);
    }
}

sub Beautify_OpenConf
{
    my $Text = shift;
    my @Lines = split(/\r\n/, $Text, -1);
    _BeautifyModule(@Lines);
    #Message(&quot;&#039;$FormattedText&#039;&quot;);
    $FormattedText =~ s/\n/\r\n/g;
    return $FormattedText;
}

sub perror
{
    if( $InOpenConf )
    {
        Message(shift, 1);
    }
    else
    {
        print STDERR wintodos(shift), &quot;\n&quot;;
    }
}


sub _BeautifyModule
{
    my @Lines = @_;
    $line_number = 0;
    my $NLines = @_;

    $FormattedText = &quot;&quot;;
    $state = &quot;module&quot;;
    $level = 0;
    pop @states while (scalar @states) &gt; 0;
    $skip_blanks = 0;
    $blank_lines = 0;
    $in_string = 0;
    $unended_operator = 0;
    my $module_head = 1;

    foreach $line (@Lines)
    {
        $line_number++;
        $line =~ s/[\r\n]//g; #уберём завершающие \n и \r, если они там есть
        $trimmed_line = $line;
        $trimmed_line =~ s/^\s*(.*?)\s*$/$1/;
        #print &quot;$state, $level, $skip_blanks (blanks = $blank_lines), unended = $unended_operator : &#039;$trimmed_line&#039;\n&quot;;

        if( not $trimmed_line )
        {
            $blank_lines++ if not $skip_blanks;
            next;
        }

        if( $InOpenConf ) { Status(&quot;$line_number / $NLines&quot;); }    

        my $keyword_match = 0;
        
        if( $state eq &quot;module&quot; )
        {
            $keyword_match = 1 if check_proc_begin() or check_if() or check_cycle() or check_try();
            if( $keyword_match and $module_head )
            {
                $FormattedText .= &quot;\n&quot; if $blank_lines;
                $module_head = 0;
            }    
        }
        elsif( $state eq &quot;proc&quot; )
        {
            $keyword_match = 1 if check_end_proc() or check_if() or check_cycle() or check_try() or check_proc_begin();
        }
        elsif( $state eq &quot;if_multiline&quot; )
        {
            check_multiline_if();
            $keyword_match = 1;
        }
        elsif( $state eq &quot;if&quot; )
        {
            $keyword_match = 1 if check_if() or check_cycle() or check_elsif() or check_endif() or check_try() or check_proc_begin();
        }
        elsif( $state eq &quot;try&quot; )
        {
            $keyword_match = 1 if check_try() or check_if() or check_cycle();
        }
        elsif( $state eq &quot;cycle&quot; )
        {
            $keyword_match = 1 if check_cycle() or check_endcycle() or check_if() or check_try() or check_proc_begin();
        }

        if( $keyword_match )
        {
            #$blank_lines = 0;
            $unended_operator = 0;
            next;
        }

        $unended_operator = 0 if $in_string and $unended_operator == 0;

        #Message(&quot;$line: $state  $skip_blanks  $blank_lines&quot;);
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        $blank_lines = 0;
        if( $unended_operator )
            { print_line( offset(1), format_expr($trimmed_line) ); }
        else
            { print_line( format_expr($trimmed_line) ); }
        $skip_blanks = 0;

        if( not $in_string )
        {
            if( $trimmed_line =~ m/^.*;(\s*$pat_comment)*$/ )
                {$unended_operator = 0;}
            elsif( $trimmed_line =~ m/^$pat_comment$/ )
                {$unended_operator = 0;}
            else
                {$unended_operator++;}
        }
    }

    if( $InOpenConf ) { Status(&quot;&quot;); }    
    return $FormattedText;
}

sub BeautifyModule
{
    my $FName = $_; #File::Find складывает в $_ имя текущего файла
    if( $file_name )
    {
        $FName = $file_name;
    }
    else
    {
        return unless $FName =~ m/^(.*)(\.1S)$/i; #нам нужны только файлы с расширением 1S
        return if $FName =~ m/^(.*)(\.new\.1S)$/i; #нам не нужны файлы с расширением new.1S
    }
    $FName =~ m/^(.*)(\.\S*)$/i;
    my $newFName = &quot;$1.new$2&quot;;

    perror($File::Find::name);
    open IN, &quot;&lt; $FName&quot;;
    open OUT, &quot;&gt; $newFName&quot;;

    print OUT _BeautifyModule((&lt;IN&gt;));

    close OUT;
    close IN;
    if( not $keep_old_files )
    {
        if( !rename($newFName, $FName) )
        {
            print wintodos(&quot;Can&#039;t move $newFName to $FName: $!\n&quot;);
        }
    }
}

sub format_op_spaces
{
    my $lspace = shift;
    my $op = shift;
    my $rspace = shift;

    return (&quot;&quot;, &quot;&quot;) if not $space_around_ops;
    $lspace = &quot; &quot; if not $lspace and $op ne &quot;,&quot;;
    $rspace = &quot; &quot; if not $rspace;
    return ($lspace, $rspace);
}

sub format_expr
{
    my $expr = shift;
    my $formatted = &quot;&quot;;
    my $lspace = &quot;&quot;;
    my $rspace = &quot;&quot;;
    my $op = &quot;&quot;;

    if( $expr =~ m/^(\s+)(.*)$/ )
    {
        $formatted = $1;
        $expr = $2;
    }
    #$expr =~ s/^((.*?)(&quot;[^&quot;]*&quot;)*)(\s*$pat_comment)*$/$1/;
    #my $eol_comment = $2;
    my $eol_comment = &#039;&#039;;

    while( length($expr) &gt; 0 )
    {
        if( $in_string )
        {
            my $c = substr($expr, 0, 1);
            if( $c eq &#039;&quot;&#039; )
            {
                if( substr($expr, 1, 1) eq &#039;&quot;&#039; )
                {
                    $formatted .= &#039;&quot;&#039;;
                    $expr = substr($expr, 1);
                }
                else
                {
                    $in_string = 0;
                }
            }
            $formatted .= $c;
            $expr = substr($expr, 1);
        }
        elsif( substr($expr, 0, 1) eq &#039;&quot;&#039; )
        {
            $formatted .= $lspace . &#039;&quot;&#039;;
            $expr = substr($expr, 1);
            $in_string = 1;
        }
        elsif( substr($expr, 0, 1) eq &#039;/&#039; and substr($expr, 1, 1) eq &#039;/&#039;) #EOL comment
        {
            $eol_comment = $expr;
            $expr = &#039;&#039;;
        }
        elsif( $expr =~ m/^\s*;(.*)$/i ) #ending  &#039;;&#039;
        {
            $expr = $1;
            $formatted .= &quot;;&quot;;
            ($lspace, $rspace) = (&quot;&quot;, &quot;&quot;);
        }    
        elsif( $expr =~ m/^(=|\(|\+|Return|Возврат)(\s*)-\s*(.*)$/i ) #unary minus
        {
            $op = $1;
            $rspace = $2;
            $expr = $3;
            ($lspace, $rspace) = format_op_spaces($lspace, $op, $rspace);
            #Message(&quot;&#039;$lspace&#039;  &#039;$op&#039;  &#039;$rspace&#039;     &#039;$expr&#039;&quot;);
            $formatted .= $lspace . $op . $rspace . &quot;-&quot;;

            ($lspace, $rspace) = (&quot;&quot;, &quot;&quot;);
        }    
        elsif( $expr =~ m/^(&lt;&gt;|&lt;=|&gt;=|,|=|\+|-|\*|\/|%|&lt;|&gt;)(\s*)(.*)$/i )
        {
            $op = $1;
            $rspace = $2;
            $expr = $3;

            ($lspace, $rspace) = format_op_spaces($lspace, $op, $rspace);
            $rspace = &quot;&quot; if $op eq &quot;,&quot; and substr($expr, 0, 1) eq &quot;,&quot;; #2 запятые подряд - без пробела

            $formatted .= $lspace . $op . $rspace;

            ($lspace, $rspace) = (&quot;&quot;, &quot;&quot;);
        }
        elsif( $expr =~ m/^(\)\s*)(И|AND|ИЛИ|OR)(\s*\()(.*)$/i )
        {
            $op = uc($2);
            $lspace = substr($1, 1);
            $rspace = substr($3, 0, length($3) - 1);
            ($lspace, $rspace) = format_op_spaces($lspace , $op, $rspace);

            $formatted .= &quot;)&quot; . $lspace . $op . $rspace . &quot;(&quot;;
            $expr = $4;

            $lspace = &quot;&quot;;
            $rspace = &quot;&quot;;
        }
        elsif( not $formatted and $expr =~ m/^(И|AND|ИЛИ|OR)(\s*\()(.*)$/i )
        {
            $op = uc($1);
            $rspace = substr($2, 0, length($2) - 1);
            ($lspace, $rspace) = format_op_spaces($lspace , $op, $rspace);

            $formatted .= $op . $rspace . &quot;(&quot;;
            $expr = $3;

            $lspace = &quot;&quot;;
            $rspace = &quot;&quot;;
        }
        elsif( $expr =~ m/^(\)\s*)(И|AND|ИЛИ|OR)$/i )
        {
            $op = uc($2);
            $lspace = substr($1, 1);
            $rspace = &quot;&quot;;
            ($lspace, $rspace) = format_op_spaces($lspace , $op, $rspace);

            $formatted .= &quot;)&quot; . $lspace . $op;
            $expr = &quot;&quot;;

            $lspace = &quot;&quot;;
            $rspace = &quot;&quot;;
        }
        elsif( $expr =~ m/^(\s+)(.*)$/ )
        {
            $rspace = $1;
            $expr = $2;
        }
        else
        {
            $formatted .= $lspace;
            $formatted .= substr($expr, 0, 1);
            $expr = substr($expr, 1);
            $rspace = &quot;&quot;;
        }

        $lspace = $rspace;
    }
    $formatted .= $rspace;
    $formatted .= $eol_comment;

    return $formatted;
}

sub check_proc_begin
{
    if( $trimmed_line =~ m/^($pat_proc)(\s+(\S+)\(.*\)\s*)(Экспорт|Export)*(.*)($pat_endproc)(\s*)($pat_comment)*$/i )
    {
        perror(&quot;    Синтаксические ошибки в процедуре &#039;$proc_name&#039;&quot;) if $level &gt; 0;
        $proc_name = &quot;&quot;;
        $proc_start = 0;
        print_line(ucfirst($1), format_expr($2), ucfirst($4), $5, ucfirst($6), $7, $8);
        $level = 0;
        $unended_operator = 0;
        return 1;
    }
    elsif( $trimmed_line =~ m/^($pat_proc)(\s+)(\S+)(\s*\(.*\))((\s+(Экспорт|Export|Далее|Forward))*)(;*)(\s*$pat_comment)*$/i )
    {
        perror(&quot;    Синтаксические ошибки в процедуре &#039;$proc_name&#039;&quot;) if $level &gt; 0;
        $proc_name = $3;
        $proc_start = $line_number;
        $level = 0;
        print_line(ucfirst($1), $2, $3, format_expr($4), ucfirst($5), $8, $9);
        if( not $5 =~ m/Далее|Forward/i )
        {
            push @states, $state;
            $state = &quot;proc&quot;;
            $level = 1;
            $FormattedText .= &quot;\n&quot; if $blank_after_proc;
        }
        else
        {
            $FormattedText .= &quot;\n&quot; if $blank_after_endproc;
        }
        $skip_blanks = 1;
        $blank_lines = 0;
        $unended_operator = 0;
        return 1;
    }
    return 0;
}

sub check_end_proc
{
    if( $trimmed_line =~ m/^($pat_endproc)([^\/\s]*)((?:\s*$pat_comment)*)$/i )
    {
        $FormattedText .= &quot;\n&quot; if $blank_before_endproc;


        perror(&quot;    Синтаксические ошибки в процедуре &#039;$proc_name&#039;&quot;) if $level != 1;
        $level = 0;
        my ($endproc, $text_after, $comment) = ($1, $2, $3);
        
        if( $procname_after_endproc &gt;= 0 )
        {
            my $proc_lines = $line_number - $proc_start + 1;
            my $need_comment = $proc_lines &gt;= $procname_after_endproc;
            if( !$need_comment and !$text_after and ($comment =~ m/^\s*\/\/\s*($proc_name)?\s*\(?\s*\)?\s*$/i) )
            {
                print_line(ucfirst($endproc));
            }
            elsif( $need_comment and !$text_after and ($comment =~ m/^\s*$/) )
            {
                print_line(ucfirst($endproc), &quot; //$proc_name()&quot;);
            }
            else
            {
                print_line(ucfirst($endproc), format_expr($text_after), $comment);
            }
        }
        else
        {
            print_line(ucfirst($endproc), format_expr($text_after), $comment);
        }
        
        $state = pop @states;
        $proc_name = &quot;&quot;;
        $proc_start = 0;
        $FormattedText .= &quot;\n&quot; if $blank_after_endproc;
        $skip_blanks = 1;
        $blank_lines = 0;
        return 1;
        $unended_operator = 0;
    }
    return 0;
}

sub check_if
{
    if( $trimmed_line =~ m/^(Если|If)([(\s].*[)\s])(Тогда|Then)(\s.*)(КонецЕсли|EndIf)(;*.*?)(\s*$pat_comment)*$/i ) #весь if в одну строчку
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), format_expr($2), ucfirst($3), format_expr($4), ucfirst($5), format_expr($6), $7);
    }
    elsif( $trimmed_line =~ m/^(Если|If)([(\s].*[)\s])(Тогда|Then)(\s*[\s;].*?){0,1}(\s*$pat_comment)*$/i )
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), format_expr($2), ucfirst($3), format_expr($4), $5);
        push @states, $state;
        $state = &quot;if&quot;;
        $level++;
        $skip_blanks = 1;
        $blank_lines = 0;
        $FormattedText .= &quot;\n&quot; if $blank_after_if;
    }
    elsif( $trimmed_line =~ m/^(Если|If)([(\s].*)$/i ) #then на другой строке
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), format_expr($2));
        push @states, $state;
        push @states, &quot;if&quot;;
        $state = &quot;if_multiline&quot;;
        $skip_blanks = 1;
        $blank_lines = 0;
    }
    else
    {
        return 0;
    }

    $unended_operator = 0;
    return 1;
}

sub check_multiline_if
{
    if( $trimmed_line =~ m/^$pat_comment$/i )
    {
        $FormattedText .= offset($level + 1) . &quot; &quot; . $trimmed_line . &quot;\n&quot;;
    }
    elsif( $trimmed_line =~ m/^(.*[)\s])(Тогда|Then)(\s*$pat_comment)*$/i )
    {
        $state = pop @states;
        $FormattedText .= offset($level + 1) . &quot; &quot; . format_expr($1) . &quot;\n&quot; if $1;
        $FormattedText .= offset($level) . ucfirst($2) . &quot;\n&quot; if $2;
        $level++;
    }
    elsif( $trimmed_line =~ m/^(Тогда|Then)(\s*$pat_comment)*$/i )
    {
        $state = pop @states;
        $FormattedText .= offset($level) . ucfirst($1) . $2 . &quot;\n&quot;;
        $level++;
    }
    else
    {
        $FormattedText .= offset($level + 1) . &quot; &quot; . format_expr($trimmed_line) . &quot;\n&quot;;
    }
    $skip_blanks = 1;
}

sub check_elsif
{
    if( $trimmed_line =~ m/^(Иначе|Else)(\s.*?){0,1}(\s*$pat_comment)*$/i )
    {
        $level--;
        $FormattedText .= &quot;\n&quot; if $blank_before_elseif;
        print_line(ucfirst($1), format_expr($2), $3);
    }
    elsif( $trimmed_line =~ m/^(ИначеЕсли|ElsIf)([(\s].*[)\s])(Тогда|Then)(\s.*?){0,1}(\s*$pat_comment)*$/i )
    {
        $level--;
        $FormattedText .= &quot;\n&quot; if $blank_before_elseif;
        print_line(ucfirst($1), format_expr($2), ucfirst($3), format_expr($4), ucfirst($5), $6, $7);
    }
    elsif( $trimmed_line =~ m/^(ИначеЕсли|ElsIf)([(\s].*)$/i ) #then на другой строке
    {
        $level--;
        $FormattedText .= &quot;\n&quot; if $blank_before_elseif;
        print_line(ucfirst($1), format_expr($2));
        
        push @states, $state;
        $level--;
        $state = &quot;if_multiline&quot;;
    }
    else
    {
        return 0;
    }

    $level++;
    $skip_blanks = 1;
    $blank_lines = 0;

    return 1;
}


sub check_endif
{
    if( $trimmed_line =~ m/^(КонецЕсли|EndIf)(;*.*?)($pat_comment)*$/i )
    {
        $level--;
        $FormattedText .= &quot;\n&quot; if $blank_before_endif;
        print_line(ucfirst($1), format_expr($2), $3);
        $state = pop @states;
        $skip_blanks = 0;
        $blank_lines = 0;
        return 1;
    }
    return 0;
}

sub check_cycle
{
    if( $trimmed_line =~ m/^(Для|For)(\s.*\s)(По|To)(\s.*\s)(Цикл|Do)(\s*$pat_comment)*$/i )
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), format_expr($2), ucfirst($3), format_expr($4), ucfirst($5), $6);
    }
    elsif( $trimmed_line =~ m/^(Пока|While)([\s(&quot;&#039;]*.*?[\s)&quot;&#039;])(Цикл|Do)(\s*$pat_comment)*$/i )
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), format_expr($2), ucfirst($3), $4);
    }
    else
    {
        return 0;
    }

    $level++;
    push @states, $state;
    $state = &quot;cycle&quot;;
    $skip_blanks = 1;
    $blank_lines = 0;
    $FormattedText .= &quot;\n&quot; if $blank_after_while;
    return 1;
}

sub check_endcycle
{
    if( $trimmed_line =~ m/^(КонецЦикла|EndDo)(;*.*?)(\s*$pat_comment)*$/i )
    {
        $state = pop @states;
        $level--;
        $FormattedText .= &quot;\n&quot; if $blank_before_wend;
        print_line(ucfirst($1), format_expr($2), $3);
        $blank_lines = 0;
        return 1;
    }
    return 0;
}


sub    check_try
{
    if( $trimmed_line =~ m/^(Попытка|Try)(\s*$pat_comment)*$/i )
    {
        $FormattedText .= &quot;\n&quot; if $blank_lines;
        print_line(ucfirst($1), $2);
        $level++;
        push @states, $state;
        $state = &quot;try&quot;;
        $skip_blanks = 1;
        $blank_lines = 0;
        return 1;
    }
    elsif( $trimmed_line =~ m/^(Исключение|Except)(\s*$pat_comment)*$/i )
    {
        $level--;
        print_line(ucfirst($1), $2);
        $level++;
        $skip_blanks = 1;
        $blank_lines = 0;
        return 1;
    }
    elsif( $trimmed_line =~ m/^(КонецПопытки|EndTry)(;*.*?)(\s*$pat_comment)*$/i )
    {
        $state = pop @states;
        $level--;
        print_line(ucfirst($1), format_expr($2), $3);
        $blank_lines = 0;
        $skip_blanks = 0;
        return 1;
    }
    elsif( $trimmed_line =~ m/^(Исключение|Except)\s+(КонецПопытки|EndTry)(;*.*?)(\s*$pat_comment)*$/i )
    {
        $state = pop @states;
        $level--;
        print_line(ucfirst($1), &quot; &quot;, ucfirst($2), format_expr($3), $4);
        $blank_lines = 0;
        $skip_blanks = 0;
        return 1;
    }
    return 0;
}

##################################################################
sub offset
{
    my $i = shift;
    my $offset = &quot;&quot;;
    $offset .= &quot;\t&quot; while $i-- &gt; 0;
    return $offset;
}

sub print_line
{
    $FormattedText .= offset($level);
    foreach (@_)
    {
        $FormattedText .= $_;
    }    
    $FormattedText .= &quot;\n&quot;;
}

 sub wintodos {
    my $win_chars = &quot;\xA8\xB8\xB9\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF&quot;;
    my $dos_chars = &quot;\xF0\xF1\xFC\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF&quot;;
    $_ = shift;
    return $_ if $^O eq &quot;cygwin&quot;;
    eval(&quot;tr/$win_chars/$dos_chars/&quot;);
    return $_;
}</code></pre></div><p>Автор скрипта code_beautifier.pl - <strong>ADirks</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 27 Nov 2008 11:47:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16332#p16332</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16331#p16331</link>
			<description><![CDATA[<p>Для работы некоторых скриптов будет использоваться следующий скрипт, который содержит функции для &quot;безопасной&quot; работы с буфером обмена (для решения проблемы &quot;кракозябров&quot;, которая возникает в ряде случаев). Этот скрипт может подключаться директивой <strong>#include</strong> в других скриптах. Скрипт должен находиться в том же каталоге, что и скрипт, использующий его, и иметь имя <strong>Clipboard_rus_subs.ahk</strong>.<br /></p><div class="codebox"><pre><code>;From http://forum.script-coding.com  (http://forum.script-coding.com/viewtopic.php?id=1073)

ClipPutText(Text, LocaleID=0x419)
{
  CF_TEXT:=1, CF_LOCALE:=16, GMEM_MOVEABLE:=2
  TextLen   :=StrLen(Text)
  HmemText  :=DllCall(&quot;GlobalAlloc&quot;, UInt, GMEM_MOVEABLE, UInt, TextLen+1)  ; Запрос перемещаемой
  HmemLocale:=DllCall(&quot;GlobalAlloc&quot;, UInt, GMEM_MOVEABLE, UInt, 4)  ; памяти, возвращаются хэндлы.
  If(!HmemText || !HmemLocale)
    Return
  PtrText   :=DllCall(&quot;GlobalLock&quot;,  UInt, HmemText)   ; Фиксация памяти, хэндлы конвертируются
  PtrLocale :=DllCall(&quot;GlobalLock&quot;,  UInt, HmemLocale) ; в указатели (адреса).
  DllCall(&quot;msvcrt\memcpy&quot;, UInt, PtrText, Str, Text, UInt, TextLen+1) ; Копирование текста.
  NumPut(LocaleID, PtrLocale+0)             ; Запись идентификатора локали.
  DllCall(&quot;GlobalUnlock&quot;,     UInt, HmemText)   ; Расфиксация памяти.
  DllCall(&quot;GlobalUnlock&quot;,     UInt, HmemLocale)
  If not DllCall(&quot;OpenClipboard&quot;, UInt, 0)    ; Открытие буфера обмена.
  {
    DllCall(&quot;GlobalFree&quot;, UInt, HmemText)    ; Освобождение памяти,
    DllCall(&quot;GlobalFree&quot;, UInt, HmemLocale)  ; если открыть не удалось.
    Return
  }
  DllCall(&quot;EmptyClipboard&quot;)               ; Очистка.
  DllCall(&quot;SetClipboardData&quot;, UInt, CF_TEXT,   UInt, HmemText)   ; Помещение данных.
  DllCall(&quot;SetClipboardData&quot;, UInt, CF_LOCALE, UInt, HmemLocale)
  DllCall(&quot;CloseClipboard&quot;)                          ; Закрытие.
}



ClipGetText(CodePage=1251)
{
  CF_TEXT:=1, CF_UNICODETEXT:=13, Format:=0
  If not DllCall(&quot;OpenClipboard&quot;, UInt, 0)             ; Открытие буфера обмена.
    Return
  Loop
  {
    Format:=DllCall(&quot;EnumClipboardFormats&quot;, UInt, Format)  ; Перебор форматов.
    If(Format=0 || Format=CF_TEXT || Format=CF_UNICODETEXT)
    Break
  }
  If(Format=0)      ; Текста не найдено.
    Return
  If(Format=CF_TEXT)
  {
    HmemText:=DllCall(&quot;GetClipboardData&quot;, UInt, CF_TEXT)  ; Получение хэндла данных.
    PtrText :=DllCall(&quot;GlobalLock&quot;,     UInt, HmemText) ; Конвертация хэндла в указатель.
    TextLen :=DllCall(&quot;msvcrt\strlen&quot;,    UInt, PtrText)  ; Измерение длины найденного текста.
    VarSetCapacity(Text, TextLen+1)  ; Переменная под этот текст.
    DllCall(&quot;msvcrt\memcpy&quot;, Str, Text, UInt, PtrText, UInt, TextLen+1) ; Текст в переменную.
    DllCall(&quot;GlobalUnlock&quot;, UInt, HmemText)  ; Расфиксация памяти.
  }
  Else If(Format=CF_UNICODETEXT)
  {
    HmemTextW:=DllCall(&quot;GetClipboardData&quot;, UInt, CF_UNICODETEXT)
    PtrTextW :=DllCall(&quot;GlobalLock&quot;,     UInt, HmemTextW)
    TextLen  :=DllCall(&quot;msvcrt\wcslen&quot;,    UInt, PtrTextW)
    VarSetCapacity(Text, TextLen+1)
    DllCall(&quot;WideCharToMultiByte&quot;, UInt, CodePage, UInt, 0, UInt, PtrTextW
                       , Int, TextLen+1, Str, Text, Int, TextLen+1
                       , UInt, 0, Int, 0)  ; Конвертация из Unicode в ANSI.
    DllCall(&quot;GlobalUnlock&quot;, UInt, HmemTextW)
  }
  DllCall(&quot;CloseClipboard&quot;)  ; Закрытие.
  Return Text
}</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?id=1073">Подробнее об этом скрипте</a>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 27 Nov 2008 11:20:42 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16331#p16331</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16325#p16325</link>
			<description><![CDATA[<p>Развитие предыдущего скрипта.<br />Добавлена автоматическая печать символов комментария &quot;//&quot; после перевода строки по Shift+Enter, если текущая строка также является комментарием.<br />Сделано включение/отключение всей автоматизации нажатием Ctrl+Shift+|.<br /></p><div class="codebox"><pre><code>IsContinueRowMode := false ; Включен/отключен &quot;закирпичиватель&quot;

#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; Автоматическая печать символа &quot;|&quot; после перевода строки, при необходимости - Enter.
; Автоматическая печать символов комментария &quot;//&quot; после перевода строки по Shift+Enter, если текущая.строка также является комментарием.
$SC01C:: ; Enter
    If IsContinueRowMode
        continueRow(&quot;|&quot;, &quot;&quot;&quot;&quot;, 1)
    Else
        Send {SC01C}
Return

$SC11C:: ; Enter на &quot;цифровой&quot; клавиатуре
    If IsContinueRowMode
        continueRow(&quot;|&quot;, &quot;&quot;&quot;&quot;, 1)
    Else
        Send {SC11C}
Return

+$SC01C:: ; Shift+Enter
+$SC11C:: ; Shift+Enter на &quot;цифровой&quot; клавиатуре
    continueRow(&quot;//&quot;,&quot;//&quot;,2)
Return

;Ctrl + Shift + |
;Включить/выключить автоматическую печать символов
^+SC02B:: IsContinueRowMode := Not IsContinueRowMode

continueRow(prmStr,prmStrParent,prmNum)  
{
    ClipSaved := ClipboardAll
    clipboard =
    Send +{Home}^{ins}{Right}

    FirstChar := SubStr(clipboard, 1, prmNum)
    if FirstChar = %prmStr%
        fStr := 0
    Else
        fStr := 1

    Loop, parse, clipboard, %prmStrParent%
    {
        fStr := 1 - fStr
    }

    if fStr = 1
    {
        Send {SC01C}%prmStr%
    }
    else
    {
        Send {SC01C}
    }

    Clipboard := ClipSaved
    ClipSaved =
}</code></pre></div><p>Автор скрипта - <strong>sadovnikov</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Thu, 27 Nov 2008 09:15:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16325#p16325</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16320#p16320</link>
			<description><![CDATA[<p>Автоматическая печать символа &quot;|&quot; после перевода строки, при необходимости.<br />Скрипт проверяет часть текущей строки, расположенную перед курсором: если количество найденных символов двойных кавычек нечётно, при переводе строки печатается символ &quot;|&quot; (продолжение строковой константы), если чётно - не печатается. Если сама строка начинается с символа &quot;|&quot;, проверка на чётность делается с точностью до наоборот.<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

$sc11C:: ; Enter на &quot;цифровой&quot; клавиатуре
$sc01C:: ; Enter
    Enter()
Return

Enter()
{
    ClipSaved := ClipboardAll
    clipboard =
    Send +{Home}^{Ins}{Right}

    FirstChar := SubStr(clipboard, 1, 1)
    if FirstChar = |
        fStr := 0
    Else
        fStr := 1

    Loop, parse, clipboard, `&quot;
    {
        fStr := 1 - fStr
    }

    if fStr = 1
    {
        Send {sc01C}|
    }
    else
    {
        Send {sc01C}
    }

    Clipboard := ClipSaved
    ClipSaved =
}</code></pre></div><p>Автор скрипта - <strong>sadovnikov</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 23:12:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16320#p16320</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16317#p16317</link>
			<description><![CDATA[<p>Печать символа &quot;|&quot; после перевода строки при нажатом Shift.<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; печать символа &quot;|&quot; после перевода строки при нажатом Shift
$+sc11C:: ; Shift+Enter на &quot;цифровой&quot; клавиатуре
$+sc01C:: ; Shift+Enter
Send, {Enter}|
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 22:24:43 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16317#p16317</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16295#p16295</link>
			<description><![CDATA[<p>Печать символов &quot;&lt;&quot; и &quot;&gt;&quot; в любой раскладке с использованием Ctrl.<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; печать символа &quot;&lt;&quot; по Ctrl+&lt; в любой раскладке
^sc033::
Send, &lt;
Return

; печать символа &quot;&gt;&quot; по Ctrl+&gt; в любой раскладке
^sc034::
Send, &gt;
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 11:35:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16295#p16295</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16294#p16294</link>
			<description><![CDATA[<p>Автоматическое форматирование выделенного фрагмента текста по Ctrl+Shift+F (внимание: перекроет &quot;Глобальный поиск&quot; по этой комбинации клавиш).<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; форматирование текста по Ctrl+Shift+F
^+sc021::
Send, !+{sc021} ; Alt+Shift+F
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 11:29:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16294#p16294</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16293#p16293</link>
			<description><![CDATA[<p>Печать символа &quot;|&quot; по Ctrl+\ в любой раскладке.<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; символ &quot;|&quot; по Ctrl+\ в любой раскладке
^\::
Send, |
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 11:16:33 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16293#p16293</guid>
		</item>
		<item>
			<title><![CDATA[Re: AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16290#p16290</link>
			<description><![CDATA[<p>Вызов окна списка процедур по нажатию Сtrl+1.<br /></p><div class="codebox"><pre><code>#IfWinActive Конфигуратор ahk_class V8TopLevelFrame

; вызов окна списка процедур: Сtrl+1
^1::
Send, ^!{sc019} ; Ctrl+Alt+P
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 10:11:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16290#p16290</guid>
		</item>
		<item>
			<title><![CDATA[AutoHotkey: автоматизация Конфигуратора 1С v8.x]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=16289#p16289</link>
			<description><![CDATA[<p>Здесь будут публиковаться скрипты для автоматизации Конфигуратора 1С v8.x, под девизом &quot;1С v8.x + AutoHotkey = mini <a href="http://www.script-coding.com/OpenConf.html">OpenConf</a>&quot; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p><p>Для пользователей, впервые услышавших об AutoHotkey.</p><p>Скачать инсталлятор программы можно <a href="http://www.autohotkey.com/download/">здесь</a> (программа распространяется свободно).</p><p>Русский перевод документации по программе - <a href="http://www.script-coding.com/AutoHotkeyTranslation.html">здесь</a> (перевод не закончен, вы можете <a href="http://forum.script-coding.com/viewtopic.php?id=316">присоединиться к переводу</a> в любое время).<br />Использование скриптов: сохранить код в текстовом файле с расширением <strong>ahk</strong>, запускать двойным щелчком (в трее появится значок скрипта). Любой скрипт можно поставить в Автозагрузку в Windows.</p><p>Директива &quot;#IfWinActive Конфигуратор ahk_class V8TopLevelFrame&quot; действует с момента объявления до конца скрипта или явного её отключения (она обеспечивает работу скрипта <strong>только</strong> в окне 1С), поэтому при &quot;склейке&quot; нескольких скриптов в один (а это можно сделать просто копированием кода) эта директива нужна только один раз в начале скрипта. Не склеивайте все скрипты в один, не глядя: некоторые скрипты будут дублировать горячие клавиши, что приведёт к путанице (читайте комментарии и выбирайте только те скрипты, которые вам реально нужны).</p><p>Для пользователей Punto Switcher: режим автоматического переключения раскладки в нём может приводить к ложным срабатываниям и &quot;глюкам&quot; в скриптах AutoHotkey.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Wed, 26 Nov 2008 10:10:22 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=16289#p16289</guid>
		</item>
	</channel>
</rss>
