avgreen писал(а) 25. Ноября 2010 :: 11:38:Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:Воспользовался советом. Убрал из перехватчика эти методы, однако что-то все еще мешает позиционированию в журнале ...
Цитата:Пока не понял, почему, но перестал работать пункт действий документа "Открыть в журнале" - журнал открывается, отладка кажет нормальную работу, но позиционирования не происходит, хотя параметр доходит верный...
А где этот пункт? В меню "Действия" не нашел. Или у тебя собственное "МенюДействийДокумента"? Тогда ничем помочь не могу т.к. для этого нужно увидеть его код.
Почему-то был уверен, что этот пункт есть во всех типовых (в ПУБ в каждом документе есть кнопка Действия).
Код там простой - выпадающий список значений, содержащий для каждого документа свой набор действий, но 4 из них постоянны - это:
- Структура подчиненности
- Отчет о движениях документа
- Ввести на основании
- Открыть в журнале
Разговор о последнем. Код обработки лежит в глобальнике
Если Конт.Выбран() = 0 Тогда
Предупреждение("Документ не записан!");
Иначе
ДокументЖурнала = Конт.ТекущийДокумент();
ОткрытьФорму("Журнал.Общий#", ДокументЖурнала);
КонецЕсли;
В самом журнале (форма списка) в ПриОткрытии производится позиционирование с помощью АктивизироватьОбъект(Форма.Параметр);
Отладка показала, что вызов проходит и параметр верный, но позиционирования нет
avgreen писал(а) 25. Ноября 2010 :: 11:38:Dmitry The Wing писал(а) 25. Ноября 2010 :: 09:48:Еще проблема:
Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриОткрытии");
не отработает, если в форме у процедуры ПриОткрытии есть параметр... Как лечить? И как определить, что параметр надо передавать? и что он был передан?
А если его не вызвать - событие в форму не придет...
А где этот параметр есть? У Отчета небось? У меня для Отчетов/Обработок свой класс-перехватчик, наследник основного перехватчика. Вот комментарий в его модуле: #
А при инициализации Перехватчика (ПриСозданииКонтекста) я анализирую что мы перехватили следующим образом #
У Справочников кстати свои заморочки - с событием ПриЗаписи. Вот комментарий из класса ПерехватичикСобытийСпр
#
Надеюсь достаточно исчерпывающий ответ? Не осталось
"граблей на которые не ступала нога человека"?
К сожалению, недостаточно.
С методами ВводНового и ВводНаОсновании все просто - по типу объекта легко определить параметры, ибо они предопределены, либо отсутствуют (для отчетов).
А вот ПриОткрытии может иметь любое число параметров ... во всех отчетах по регистрам в типовой ПУБ есть как минимум 1 параметр - флаг восстановления настроек.
Проблема не в том, чтобы определить тип объекта и выбрать нужный класс перехватчик, а в разработке глобальной фабрики событий, позволяющей регистрировать более одного перехватчика на одно событие. все прекрасно работает со стандартными функциями, но ломается на ПриОткрытии (думаю, найдутся и другие).
Потому вопрос в том, как определить число параметров и их значения при перехвате, остается открытым!
Дальнейшие эксперименты показали: при отсутствии перехвата события формы
Событие_ПриИзмененииРазмераОкна позиционирование проходит на ура. При использовании перехвата - нет.
Перехват реализован
Функция Событие_ПриИзмененииРазмераОкна(ТипСобытия, Ширина, Высота) Экспорт
Сам = Сам(Контекст);
Рез = 1;
КонтОбъекта = Сам.ПолучитьКонтекстОкружения();
Если ТипЗначенияСтр(КонтОбъекта) <> "ГрупповойКонтекст" Тогда
Если ТипЗначенияСтр(КонтФормы) = "ГрупповойКонтекст" Тогда
КонтОбъекта = КонтФормы;
Иначе
Возврат Рез;
КонецЕсли;
КонецЕсли;
//Здесь будет что-то делаться
Если Рез > 0 Тогда
Перехватчик = СоздатьОбъект("Перехватчик");
Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтОбъекта, "ПриИзмененииРазмераОкна", ТипСобытия, Ширина, Высота);
КонецЕсли;
Возврат Рез;
КонецФункции // Событие_ПриИзмененииРазмераОкна