artbear писал(а) 29. Июня 2006 :: 06:14:А ты не можешь сделать выложить свои классы этого механизма?
когда я это делал, то с 1С++ еще знаком не был, поэтому это не реализовано в виде классов, хотя может быть и стоит это дело формализовать, получится интереснее, я на досуге попробую, а так я могу расписать - что это такое, хотя добавить к вышесказанному что-то сложно - все просто - можно только вырезать кусок глобальника:
Процедура ПроверкаЛичныхСообщений()
ИмяФайлаЗапроса = глКаталогЗапросов + глПользователь.Код + ".results";
Если ФС.СуществуетФайл(ИмяФайлаЗапроса) = 1 Тогда
СписокОтветов = СоздатьОбъект("Текст");
СписокОтветов.Открыть(ИмяФайлаЗапроса);
ФС.УдалитьФайл(ИмяФайлаЗапроса);
КоличествоСтрок = СписокОтветов.КоличествоСтрок();
Для СчОтветов = 1 По КоличествоСтрок Цикл
Ответ = ЗначениеИзСтроки(СписокОтветов.ПолучитьСтроку(СчОтветов));
Если ТипЗначенияСтр(Ответ) = "СписокЗначений" Тогда
Запрос = Ответ.Получить("Запрос");
ИмяФайлаОтвета = глПолучитьКонечноеИмяФайлаДляЮзера(Ответ.Получить("ИмяФайлаОтвета"));
ИмяПославшейФормы = Ответ.Получить("ИмяПославшейФормы");
Если
(НРЕГ(Запрос) = "print")
Или (Найти(НРЕГ(Запрос),"report") > 0)
Тогда
Если ФС.СуществуетФайл(ИмяФайлаОтвета) = 0 Тогда
Продолжить;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.Опции(0,0);
Таб.Открыть(ИмяФайлаОтвета);
глДобавитьДопСекциюВПечатнуюФорму(Таб,ЗаголовокОтчета);
Таб.ТолькоПросмотр(ТолькоПросмотр);
Таб.Показать(ЗаголовокОтчета);
ФС.УдалитьФайл(ИмяФайлаОтвета);
ИначеЕсли НРЕГ(Запрос) = "search" Тогда
НомерПославшейФормы = Ответ.Получить("НомерПославшейФормы");
Если ПустоеЗначение(НомерПославшейФормы) = 1 Тогда
Для Сч = 1 По 100 Цикл
Если ПустоеЗначение(глСписокНомеровОткрытыхФорм.Получить(Сч)) = 1 Тогда
НомерПославшейФормы = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПустоеЗначение(НомерПославшейФормы) = 1 Тогда
НомерПославшейФормы = 1;
КонецЕсли;
ИмяОткрываемойФормы = "Обработка.ОтветСервера#" + НомерПославшейФормы;
СписокПараметров = СоздатьОбъектСписокЗначений();
СписокПараметров.Установить("ИмяФайлаОтвета",ИмяФайлаОтвета);
СписокПараметров.Установить("НомерПославшейФормы",НомерПославшейФормы);
РазмерСписка = Ответ.РазмерСписка();
Для Сч = 1 По РазмерСписка Цикл
ИдентифЗначения = "";
Значение = Ответ.ПолучитьЗначение(Сч,ИдентифЗначения);
Если
(ИдентифЗначения = "Запрос")
Или (ИдентифЗначения = "ИмяФайлаОтвета")
Или (ИдентифЗначения = "ИмяПославшейФормы")
Или (ИдентифЗначения = "НомерПославшейФормы")
Тогда
Продолжить;
КонецЕсли;
СписокПараметров.Установить(ИдентифЗначения,Значение);
КонецЦикла;
ОткрытьФорму(ИмяОткрываемойФормы,СписокПараметров);
ИначеЕсли НРЕГ(Запрос) = "function" Тогда
ИмяФункции = Ответ.Получить("ИмяФункции");
Если ИмяФункции = "глОтветНаЗапросПоБлокирующимПользователям" Тогда
Попытка
глОтветНаЗапросПоБлокирующимПользователям(Ответ);
Исключение
глСервисныеФункции.ЗаписатьСообщение("Ошибка выполнения функции запроса (" + ИмяФункции + ") при проверке Личных сообщений - " + ОписаниеОшибки(),"!",0,1);
КонецПопытки;
ИначеЕсли ИмяФункции = "глОтветНаЗапросПоАктивнымПользователям" Тогда
Попытка
глОтветНаЗапросПоАктивнымПользователям(Ответ);
Исключение
глСервисныеФункции.ЗаписатьСообщение("Ошибка выполнения функции запроса (" + ИмяФункции + ") при проверке Личных сообщений - " + ОписаниеОшибки(),"!",0,1);
КонецПопытки;
КонецЕсли;
ИначеЕсли ПустоеЗначение(ИмяПославшейФормы) = 0 Тогда
ОткрытьФорму(ИмяПославшейФормы,ИмяФайлаОтвета);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ОбработкаОжидания("ПроверкаЛичныхСообщений",10);
КонецЕсли;
Дневник = СоздатьОбъект("Справочник.Дневник");
Дневник.ИспользоватьВладельца(глПользователь);
Если Дневник.ВыбратьЭлементыПоРеквизиту("ВывестиНаЭкран",1,1,0) = 1 Тогда
Параметр = СоздатьОбъектСписокЗначений();
СписокАнкет = СоздатьОбъектСписокЗначений();
Пока Дневник.ПолучитьЭлемент() = 1 Цикл
Если Дневник.ПометкаУдаления() = 0 Тогда
Параметр.ДобавитьЗначение(Дневник.ТекущийЭлемент());
Если ТипЗначенияСтр(Дневник.БыстрыйПереход) = "Справочник" Тогда
Если Дневник.БыстрыйПереход.Вид() = "Анкеты" Тогда
СписокАнкет.ДобавитьЗначение(Дневник.БыстрыйПереход);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Параметр.РазмерСписка() > 0 Тогда
ОткрытьФорму("Обработка.ЛичноеСообщение",Параметр);
КоличествоАнкет = СписокАнкет.РазмерСписка();
Для СчАнкет = 1 По КоличествоАнкет Цикл
Анкета = СписокАнкет.ПолучитьЗначение(СчАнкет);
Если Анкета.СостояниеАнкеты = Перечисление.СостоянияСобытия.Действует Тогда
ОткрытьФорму(Анкета,,1);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПроверкаЛичныхСообщений()
тут повырезано много, но все равно - много мусора
Среда обмена тут: файлы и справочник, подчиненный юзеру Дневник
Виды результатов:
- таблица mxl (просто открывается пользователю - готовый отчет),
- таблица значений - выводится в специальной обработке,
- функции - выполняю