Адрес этой странички :
http://doc-prg.narod.ru/art_00103/art_00103.htm
Дата обновления : 08.08.2009
© 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 Сергей Попов