Адрес этой странички : http://doc-prg.narod.ru/art_00103/art_00103.htm 
Дата обновления : 08.08.2009
 

(c) Sergey Popov, Usinsk, Komi, 2007

© 08.08.2009 Сергей Попов

1Cv7.
Некоторые полезные алгоритмы.
Трассировка.

Статью в виде файла (6.4 кб) можно скачать здесь: art_00103.zip

 

1. Получить имя трассировки для данного типа документов
// Функция возвращает имя трассировки, как это принято в 1C-предприятие версии 7.7

Функция сп_ПолучитьИмяНашейТрассировки()
    Res = СокрЛП("Проведение документа "+Вид()+" № "+НомерДок +" от "+ДатаДок);
    Возврат Res;//возвращаемое значение - строка
КонецФункции //сп_ПолучитьИмяНашейТрассировки()

2. Проверить, существует ли какая-нибудь трассировка в настоящий момент
//Функция проверяет, существует ли какая-нибудь трассировка в настоящий момент
//Возвращает :
//    -1 - нет трассировки
//    >=0 - количество значений в трассировке.

Функция сп_ПроверитьЕстьЛиВообщеТрассировкаСейчас()
//Возвращает: -1-нет трассировки, >=0 - размер списка
    Перем Res; //целое(возвращаемое значение)
    Res=-1;
    Если ТипЗначенияСтр(глСообщенияТрассировки) = "СписокЗначений" Тогда
        Res=глСообщенияТрассировки.РазмерСписка();
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_ПроверитьЕстьЛиВообщеТрассировкаСейчас

3. Проверить, существует ли "чужая"  трассировка в настоящий момент
//Функция проверяет, существует ли "чужая" трассировка в настоящий момент
//Т.е.,  существует ли "сейчас" трассировка, "порожденная" НЕ "нами"
//Возвращает :
//    0 - "чужой" трассировки нет
//    1  - в настоящий момент существует "чужая" трассировка

Функция сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас()
//Сделаем контроль трассировки (свой/чужой)
//Возвращает: 0-нет чужой трассировки, 1-есть
    Перем Res; //целое(возвращаемое значение)
    Res=0;
    Если ТипЗначенияСтр(глСообщенияТрассировки) = "СписокЗначений" Тогда
        //Трассировка (чья-то) существует
        ИмяСуществующейТрассировки = СокрЛП(глСообщенияТрассировки.ПолучитьЗначение(3));
        ИмяНашейТрассировки = сп_ПолучитьИмяНашейТрассировки();
        Если ИмяНашейТрассировки<>ИмяСуществующейТрассировки Тогда
            Res=1;
        КонецЕсли;
    КонецЕсли;
    Возврат Res;
КонецФункции //сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас

4. Удалить "чужую" трассировку, если она сейчас есть
//Возвращает  1- если "чужая" трассировка была

Функция сп_УдалитьТрассировкуЕслиСейчасЧужая()
    Перем Res; //целое(возвращаемое значение)
    Res=0; 
    Если сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас()>0 Тогда
        глСообщенияТрассировки = 0; 
        Res=1;
    КонецЕсли;
    Возврат Res;
КонецФункции // сп_УдалитьТрассировкуЕслиСейчасЧужая

5. Удалить "нашу" трассировку, если она сейчас есть
//Возвращает  1- если "наша" трассировка была

Функция сп_УдалитьТрассировкуЕслиСейчасНаша()
   
Перем Res; //целое(возвращаемое значение)
    Res=0; 
    Если сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас()<=0 Тогда
        глСообщенияТрассировки = 0; 
        Res=1;
    КонецЕсли;
    Возврат Res;
КонецФункции // сп_УдалитьТрассировкуЕслиСейчасНаша

 

6. Записать сообщение в трассировку
//В зависимости от ситуации и от передаваемых функции параметров - сообщение 
//помещается в трассировку или в окно сообщений

Функция сп_ПоложитьСообщениеВТрассировку(Сообщение,КонтрольЧтоЭтоНаша=1,ЧтоДелатьЕслиЕстьЧужая=1)
//Сообщение - наше текстовое сообщение (строка)
//КонтрольЧтоЭтоНаша >0 контролируем наличие ЧУЖОЙ трассировки
//ЧтоДелатьЕслиЕстьЧужая :
//     0 - НИЧЕГО не делать
//     1 - Кинуть сообщение в окно сообщений
//     2 - Положить сообщение в трассировку 
//Возвращает: 0-сообщение НЕ выводилось, 1-в окно сообщений, 2-в трассировку
    Перем Res; //целое(возвращаемое значение)
    Res=0; //Ничего не сделано 
    ЕстьЧужая = 0;
    YesNext=1;
    Если КонтрольЧтоЭтоНаша>0 Тогда
        //Сделаем контроль трассировки (свой/чужой)
        Если сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас()>0 Тогда
            //Идет чужая трассировка
            YesNext=0;
            Если ЧтоДелатьЕслиЕстьЧужая<=0 Тогда
                //Ничего не делать вообще
            Иначе 
                Если ЧтоДелатьЕслиЕстьЧужая=1 Тогда
                    //Кинуть сообщение в окно сообщений
                    YesNext = 1;//продолжим
                    ЕстьЧужая = 1;
                Иначе 
                    Если ЧтоДелатьЕслиЕстьЧужая>=2 Тогда
                        //Кинуть сообщение силком в ТРАССИРОВКУ
                        YesNext = 1;//продолжить
                        ЕстьЧужая = 0;//обманем сами себя
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Если YesNext>0 Тогда 
        //Продолжим формировать наше сообщение в трассировку
        Если ЕстьЧужая >0 Тогда
            //Существует чужая трассировка, выводим сообщение в окно сообщений
            Сообщить(Сообщение);
            //глСообщениеПроведения(Сообщение, ТекущийДокумент(), 1,,0);
            Res=1; //Вывели в окно сообщений
        Иначе
            //Идет или наша трассировка или нам все равно
            глСообщениеПроведения(Сообщение, ТекущийДокумент(), 1,,1);
            Res=2; //Вывели в трассировку
        КонецЕсли; 
    КонецЕсли; 
    Возврат Res;
КонецФункции // сп_ПоложитьСообщениеВТрассировку

7. Показать трассировку (выдать на экран соотв.форму)
//В зависимости от ситуации и от передаваемых функции параметров - на экран
//выдается соотв.форма и трассировка очищается
//Функция возвращает 1, если форма была показана

Функция сп_ПоказатьТрассировку(ПоказатьТолькоЕслиНаша=0,ОбнулитьТрассировку=1,ПроверитьПередОбнулениемНашаЛиОна=1)
//Вызывать из формы документа
    Перем Res; //целое, возвращаеомое значение
    Res=0;
    ЕстьТрассировка=0;
    ЭтоНаша = 0;
    Если сп_ПроверитьЕстьЛиВообщеТрассировкаСейчас()>=0 Тогда // >= именно больше или равно !
        ЕстьТрассировка=1;
        Если сп_ПроверитьЕстьЛиЧужаяТрассировкаСейчас()<=0 Тогда
            ЭтоНаша = 1;
        КонецЕсли;
    КонецЕсли;
    Если ЕстьТрассировка>0 Тогда
        Если ПоказатьТолькоЕслиНаша>0 Тогда
            Если ЭтоНаша >0 Тогда
                глПоказатьТрассировку(глСообщенияТрассировки); 
                Res=1;
            КонецЕсли;
        Иначе 
            глПоказатьТрассировку(глСообщенияТрассировки); 
            Res=1;
        КонецЕсли;
        Если ПроверитьПередОбнулениемНашаЛиОна<=0 Тогда
            //Не проверять перед обнулением
            Если ОбнулитьТрассировку>0 Тогда
                глСообщенияТрассировки = 0; 
            КонецЕсли;
        Иначе 
            //Проверить перед обнулением
            Если ЭтоНаша >0 Тогда
                //Это наша
                Если ОбнулитьТрассировку>0 Тогда
                    глСообщенияТрассировки = 0; 
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Возврат Res;
КонецФункции // сп_ПоказатьТрассировку

 

 

© 08.08.2009 Сергей Попов

 


Hosted by uCoz
-->