Версия для печати темы (https://pro1c.org.ua/index.php?s=cefc53dc048b09ea9fdfaa558163b7be&showtopic=67793)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Формэкс. Процедура ПослеОткрытия() не срабатывает при модальном открытии

Автор: igmig65 17.03.25, 9:51

День добрый. Есть обработка подключения к постерминалу, нужно сделать чтобы она открывалась модально, на ней выводится лог выполнения: Подключение к терминалу, ожидаем карту, автоизация с банком и тд. Но не могу ее запустить процедуры из ПослеОткрытия(), в модальном режиме не срабатывает, а если вставляю процедуры в ПриОткрытии(), то все срабатывает но форма не открывается, вернее открывается уже после выполнения процедур, соответственно лог не видно. Формэкс скачал вроде последний, 198. Кто нибудь подскажет, может как по другому можно сделать, чтобы форма открывалась посередине, отцентрованно и в момент, когда форма уже открыта запустить нужные процедуры.

Автор: Vofka 17.03.25, 9:59

В 8 есть метод ПодключитьОбработчикОжидания() или что-то типа этого. Там, кажется, указывается процедура которую надо вызвать, интервал через когда вызвать, и еще что-то. Короче точно не помню, но суть должна быть понятна. В 7.7 я вообще ничего уже не помню, но быстренько загуглил, вроде как там тоже есть метод ОбработкаОжидания(). Я бы смотрел в эту сторону. Т.е. открыть форму, а в ПриОткрытии вконце добавить обработчик ожидания, который выведет лог.

Автор: andrew76 17.03.25, 12:11

Vofka @ Сегодня, 12:59 * ,

Это описание ОбработкиОжидания от FormEx:
РасширениеФормы->ОбработкаОжидания

ОбработкаОжидания(<?>,)
Синтаксис:
ОбработкаОжидания(Имя, Интервал)
Назначение:
Вызывает процедуру модуля формы с заданным интервалом в миллисекундах. В отличии от штатной обработки ожидания, вызывается при открытых модальных формах. Для одной формы может быть установлено сколько угодно обработок ожидания путем создания нужного количества объектов РасширениеФормы. При уничтожении объекта, для которого вызывался данный метод, соответствующая процедура обработки ожидания останавливается. Метод работает только после физического открытия окна формы.
Параметры:
<Имя> - (Строка Имя процедуры модуля текущей формы для периодического вызова (если в качестве параметра передается пустая строка, то ранее запущенный процесс прекращается))
<Интервал> - (Число Интервал вызова процедуры в миллисекундах (если в качестве параметра передается 0 (ноль)) , то ранее запущенный процесс прекращается)
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
(Строка) Имя процедуры, которая была установлена ранее в качестве процедуры обработки ожидания.

Есть еще ,тоже от FormEx
Сервис->ОстальныеМетоды


ОбработкаОжидания(<?>,)
Синтаксис:
ОбработкаОжидания(<Имя>,<Интервал>)
Назначение:
Вызывает глобальную процедуру с заданным интервалом в миллисекундах.
ПРИМЕР:
Сервис = СоздатьОбъект("Сервис");
Сервис.ОбработкаОжидания("глПолучитьНовыеЗаявки",100);

Цитата(igmig65 @ 17.03.25, 12:51) *
не могу ее запустить процедуры из ПослеОткрытия(), в модальном режиме не срабатывает, а если вставляю процедуры в ПриОткрытии(), то все срабатывает но форма не открывается, вернее открывается уже после выполнения процедур, соответственно лог не видно.


Есть еще процедура ПослеСозданияФормы от FormEx

Процедура ПослеСозданияФормы(<?>)КонецПроцедуры
Синтаксис:
Процедура ПослеСозданияФормы(<Контекст>)КонецПроцедуры
Назначение:
Предопределенная процедура вызывается после физического создания окна формы в системе, когда окно формы создано, но еще не полностью проинициализировано и не отображено на экране.
Параметры:
<Контекст> - контекст открытой формы
ЗАМЕЧАНИЕ:
В этой процедуре (и во всех процедурах, вызываемых после нее) можно вызывать методы, которые помечены как "работает только после физического открытия окна формы".


andrew76 @ Сегодня, 14:07 * ,

Не работает ПослеОткрытия() в модальном режиме:
правда,ветка на том форуме древняя:
https://pro1c.org.ua/redirect.php?https://www.1cpp.ru/forum/YaBB.pl?num=1499687314/0

ещё такое есть:
v7: ОбработкаОжидания в Formex
https://pro1c.org.ua/redirect.php?https://www.mista.ru/topic/719183

Цитата(igmig65 @ 17.03.25, 12:51) *
когда форма уже открыта запустить нужные процедуры.


А может посадить процедуры на кнопку (кнопка на форме).
Сделать кнопку невидимой.Потом сэмулировать нажатие этой кнопки ?
Должно сработать в принципе и без formex.

Автор: andrew76 17.03.25, 15:56

Цитата(igmig65 @ 17.03.25, 12:51) *
Кто нибудь подскажет, может как по другому можно сделать, чтобы форма открывалась посередине, отцентрованно


Для вывода окна по центру в форме обработки пропишите следующую процедуру :
(если используете компоненту FormEx)

Процедура ПослеОткрытия()
   Окно = СоздатьОбъект("Окна");
   Окно.ЦентрироватьОкно(Форма);
   Форма.Обновить();
КонецПроцедуры


У меня этот код отработал отлично.Каждый раз при запуске обработки,окно строго по центру экрана.

andrew76 @ Сегодня, 17:48 * ,

Можно там же поэкспериментировать со стилем окна:

Процедура ПослеОткрытия()
   Окно = СоздатьОбъект("Окна");
   Окно.ЦентрироватьОкно(Форма);
   Окно.СтильОкна(Форма,2); //стиль от 0 до 2, 1 и 2 -без заголовка окна,2 - по моему модальный режим
   Форма.Обновить();
КонецПроцедуры


Что-нибудь получилось ? Дальше мне искать ? Чи не трэба ?

Цитата(igmig65 @ 17.03.25, 12:51) *
Кто нибудь подскажет


Так этот вопрос ещё актуален ? Истина уже близко !

Автор: igmig65 17.03.25, 16:05

andrew76 @ Сегодня, 15:56 * ,
Сегодня ночью буду пробовать, отпишусь..

Автор: andrew76 17.03.25, 16:34

igmig65 @ Сегодня, 19:05 * ,

Не спешите ! Все решится гораздо раньше !
Есть в FormEx нужный функционал - почти как в 1с 8-ке !
Прописываете вызовы ваших процедур в процедуру (я ее назвал- "ВашаПроцедура"-назовите её как хотите) и вызываете её методом - ВыполнитьПроцедуру !

Должно работать !

Процедура ПослеОткрытия()
  
    Окно = СоздатьОбъект("Окна");
    Окно.ЦентрироватьОкно(Форма);
    //Окно.СтильОкна(Форма,2);
    Форма.Обновить();
    Сервис = СоздатьОбъект("Сервис");
    Сервис.ВыполнитьПроцедуру(Контекст, "ВашаПроцедура"); // да,да,вот она !

КонецПроцедуры


ВыполнитьПроцедуру(<?>,,)
Синтаксис:
ВыполнитьПроцедуру(<Контекст>,<ИмяПроцедуры>,<СписокАргументов>)
Назначение:
Метод предназначен для выполнения процедуры в заданном контексте.
Возвращает 1 в случае успеха, 0 - в противном случае.
ПРИМЕР:
Перем Конт;
Сервис = СоздатьОбъект("Сервис");
ОткрытьФорму("Обработка.Демо", Конт);
Список = СоздатьОбъект("СписокЗначений");
Список.ДобавитьЗначение("Первый параметр");
Список.ДобавитьЗначение("Второй параметр");
Список.ДобавитьЗначение("Третий параметр");
Сервис.ВыполнитьПроцедуру(Конт, "Выполнить", Список);

Только все эти фишки (фичи) - от FormEx !

Автор: igmig65 17.03.25, 18:01

При открытии создаю расширение формы:
//==============================

Процедура ПослеОткрытия()
    Сформировать();
КонецПроцедуры
Процедура ЗагрузитьФормэкс()
    Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
        Предупреждение("Неудачная попытка загрузить FormEx.dll");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    //ФормаРасш.Maximize = 1;
КонецПроцедуры
Процедура ПриОткрытии()
    ЗагрузитьФормэкс();
        ФормаРасш = СоздатьОбъект("РасширениеФормы");
    ФормаРасш.ОбработкаОжидания("ПослеОткрытия",10);
    ФормаРасш.ОбработкаОжидания("",0);
КонецПроцедуры

//============================
вот так все норм отработало, всем спс..

Автор: andrew76 17.03.25, 18:08

igmig65 @ Сегодня, 21:01 * ,


ну тогда палец,который на форме форума.

Автор: igmig65 17.03.25, 18:15

andrew76 @ Сегодня, 18:08 * ,
Да, пардон, думал всем поставил, кстати форму открываю модально, поэтому центровать не пришлось.
Тему можно закрыть, еще раз всем спс..

Автор: tibank 02.04.25, 14:37

andrew76 @ 17.03.25, 17:34 * ,
Если форма открывается не модально, можно проще

Перем Конт;

ОткрытьФорму("Обработка.Демо", Конт);
Конт.ВашаПроц(Парам1, Парам2,....);


Но formex должен быть загружен

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua