Позволю себе повторить просьбу. Потому как вся конфа построена на этом, а как только ставлю новые версии - для поддержки новых требований - всё ломается.
В версии 1.9.0.1 от 15.12.2003 - всё отлично работало. а потом - всё сломалось.
То есть - если открыть из модального окна ещё одно модальное окно и в них использовать формэкс более новой версии и обращаться к ПриОтжатииЛевойКнопки(сост,х,у) - то всё виснет насмерть. А если таких открытий много - то...
Вопрос - есть шанс - что это место будет переписано?
Ты попробуй из модального открыть модальное и сгенерить внешнее событие - оно будет ловиться только на первом модальном.
Цитата: p18 от 26 мая 2025, 18:09что это место будет переписано?
что именно "будет переписано"..? Отжатие левой кнопки?
У себя я интерфейс для ТСД построен исключительно на модальных формах. Модальную из модальной можно вызывать, но только для простх действий, типипа показать, ввести в поле.
.
так что у себя сделал что работает "диспетчер обработок" - открылась модальная, сделала что надо, закрылась, открылась следующая. А т.к. модальные обработки делают простые "атомарные" действия/шаги - просто передается от обработки к обработке структура параметров-данных, каждая отдельная модобработка обрабатывает свои данные, добавляет если надо в структуру...
Не получится у меня так (((
Это фронт для ресторана.
1. окно авторизация - потом оно закрывается и открывается следующее окно "план"
2. окно план - из него идет запрос количества клиентов (то есть ещё одно окно) и открывается "Набор счета"
3. Набор счёта - из него при необходимости открываются окна "количество" и "авторизация" или "план"
Если втыкаю новый формэкс - то либо на плане всё виснет, либо на вводе количества клиентов. Причём именно виснет - крутящееся колёсико и всё. И видимо обработчик ПриОтжатииЛевойКнопки - пытается обработать первое окно, а не активное.
По сути - получается, что формэкс не замечает, какое окно сейчас активное, и либо пытается сразу несколько окон обрабатывать, либо первое... То есть надо поправить инкапсуляцию наследованных окон и обработку событий именно в активном окне. Как-то так мне кажется.
Можно попросить накидать конфигу для тестов, чтобы я мог на ней четко воспроизвести глюк? Попробую в ближайшие две недели посмотреть.
ИМХО, это не FormEX виноват, это свойство платформы, насколько помню, это и без FormEX проявляется.
т.е. надо патчить код платформы, но приходит ли туда какие-то ид от 2й модальной формы... если что-то приходит, то можно починить, если ничего не приходит, то непонятно как это починить.
Еще можно попробовать использовать соответствующее глобальное событие. Туда должен приходить правильный контекст.
https://disk.yandex.ru/d/vKAR6-x-IxYs5w
Авторизация от 1с - "Администратор" - для настройки "официант" - для работы
Очень кастрированная версия. Для тестов.
Все необходимые библиотеки в архиве. Вместе с нужной версией формэкс.
В первом окне авторизации - либо нажать любую кнопку и потом Ок, либо завершение работы - откроется план помещения.
На одном столике висит заказ - можно открыть его, можно набрать новый. Остальные кнопки кроме столов - не работают.
В заказе работают кнопки количество - изменение количества заказанного товара (Таблица слева) и "Модификатор (опять таки должен быть выбран слева товар в заказе)
Работают кнопки "отложить" и "закрыть".
Всё остальное вырезано - как некритичное.
Цитата: Djelf от 27 мая 2025, 15:46ИМХО, это не FormEX виноват, это свойство платформы, насколько помню, это и без FormEX проявляется.
т.е. надо патчить код платформы, но приходит ли туда какие-то ид от 2й модальной формы... если что-то приходит, то можно починить, если ничего не приходит, то непонятно как это починить.
Только тогда объясните - почему со старым это работает, а с новым нет - если это свойство платформы?
ВидеоКомментарий по просьбе автора топика, как это проявляется:
https://cloud.mail.ru/public/LSCe/KJQtFCQxE
Да, действительно, на ФормЕксе 1.9.0.1, это не проявляется.
Меняю на 198 - виснет.
Проблема не в формексе а в Hide1C.dll, которая видимо с новыми версиями не дружит. Если в ПриНачалеРаботыСистемы() закомментировать код
//ЗагрузитьВнешнююКомпоненту("dll\Hide1C.dll");
//Hide1C=Создатьобъект("AddIn.Hide1C");
//Hide1C.ShowIcon();
//Hide1C.Open1CWindow(0);
//Hide1C.CloseIcon();
то ничего не виснет
Решение - избавиться от Hide1C.dll
F почему тогда "на ФормЕксе 1.9.0.1, это не проявляется."
Видимо в формексе что-то поменялось
Хотя... Подсунул версию 2.0.5.199 - вроде тоже не виснет
У меня, виснет на глухо... Правда на 198 версии.
Но, "мопед не мой, я просто разместил объяву! :-)))"
PS И киньте ссылочку плиз, на 199. А то на главной странице сайта ссылка на 198...
Цитата: MWW_Ruza от 28 мая 2025, 11:24А то на главной странице сайта ссылка на 198...
Я вот про что:
(https://content.foto.my.mail.ru/mail/m_w_w/590/h-616.jpg)
Цитата: MWW_Ruza от 28 мая 2025, 11:24PS И киньте ссылочку плиз, на 199. А то на главной странице сайта ссылка на 198...
https://forum.dorex.pro/index.php?topic=2.0
От топикстартера база со старым формексом - работает, 199 - виснет.
А виснет подразумевается сама программа или процесс в памяти остается? Сами обработки отрабатывают, а вот процесс в памяти остается. Это я про 199
Пардон это я туплю. При переборе разных вариантов незаметно загрузил формекс от ТС, вот и работало.
Т.е. при формекс от тс все работает, но остается процесс от 1с в памяти при нажатии выход. А при версии 199 висит сама программа после выхода из авторизации
Цитата: vladmenleo от 28 мая 2025, 13:48но остается процесс от 1с в памяти при нажатии выход
Да это, как он сам говорит, что-то перестарался, когда "кастрировал" свою рабочую конфу до демки. Типа в рабочей конфе процесс прибивается. Но, я сам этого не видел, с его слов, у меня такая-же демка как тут выложена. Я кстати, про это "ворчал" в видеоролике :)
Было время немного позаниматься...
Решил снакчала разобраться с зависающим процессом...
Обнаружил, что по кнопке "Выход" у него закрывается окно, но 1С продолжает работать.
Добавил после закрытия формы ЗавершитьРаботуСистемы(0);
Так, процесс прибивается, но 1С завершается не корректно (со старым Формекс).
Оставил для пробы одну форму:
ОткрытьФормуМодально("Обработка.Авторизация",Параметры);
//ОткрытьФормуМодально("Обработка.ПланПомещения"); // вторую пока, для пробы закомментировал
Так с новым формексом ничего не падает, закрывается корректно, процесс в памяти не остается.
Но, раскомментировав вторую строку, получаю висяк...
Да и как-то на мой взглял не корректно открывать два подряд модальных окна... При чем не второе из первого, а как-бы "параллельно"... Но, могу и ошибаться.
Сделал, что-бы вторая форма, где карта заведения, открывалась не при старте системы, а после авторизации и закрытия окна авторизации.
Вот так:
// Это все в форме авторизации
Форма.Закрыть(0);
ОткрытьФормуМодально("Обработка.ПланПомещения");
Все на старом формексе работает, процесс в памяти не остается, но 1С пишет ошибку...
На новом все тот-же висяк, ничего не изменилось.
С такими изменениями ведет себя так:
https://cloud.mail.ru/public/YFd7/bxL2U27BY (https://cloud.mail.ru/public/YFd7/bxL2U27BY)
Не смотря на Форма.Закрыть(0); , первая форма остается висеть как-бы спрятанная под вторую.
Это все на новом формексе.
Ошибка при команде ЗавершитьРаботуСистемы() со старым Formex такая:
(https://content.foto.my.mail.ru/mail/m_w_w/590/h-617.jpg)
Последний эксперимент...
Закомментировал загрузку Hide1C.dll, как в посте #11, ничего не изменилось, только все это безобразие теперь на фоне главного окна 1С, но висяк при открытии второго мобильного окна все тот-же, так, что Hide1C.dll похоже ни при чем.
Со старыми формексами база при закрытии регулярно давала ошибки памяти по чтению, с новыми норм
Вот в таком виде все работает
Процедура ПриНачалеРаботыСистемы()
Если ИмяПользователя() = "Администратор" Тогда
иначе
// Удалено начало
//ЗагрузитьВнешнююКомпоненту("dll\Hide1C.dll");
// Hide1C=Создатьобъект("AddIn.Hide1C");
// Hide1C.ShowIcon();
// Hide1C.Open1CWindow(0);
// Hide1C.CloseIcon();
// Удалено конец
Если ИнициализацияExtrForms() = 0 Тогда ЗавершитьРаботуСистемы(0); Возврат; КонецЕсли;
//ОткрытьФормуМодально("Обработка.Авторизация");
Параметры=СоздатьОбъект("СписокЗначений");
Параметры.УдалитьВсе();
Параметры.Установить("Справочник" , СпрПользователи);
Параметры.Установить("Процесс" , "Авторизация");
ОткрытьФормуМодально("Обработка.Авторизация",Параметры);
//ОткрытьФормуМодально("Обработка.ПланПомещения"); // Удалено
ОткрытьФорму("Обработка.ПланПомещения"); // Добавлено
КонецЕсли;
КонецПроцедуры
Если оставить Hide1C.dll, то не работает открытьформу
Цитата: vladmenleo от 29 мая 2025, 07:09Вот в таком виде все работает
***************
Если оставить Hide1C.dll, то не работает открытьформу
Не понял? Что в таком виде работает?
Главное окно 1С не прячется, да. Открытая модально форма авторизации отрабатывает, пока нормально. Открывается карта зала, не модально, пока тоже нормально. Кликаешь на столике, для ввода количества бухающих, открывается модально следующее окошко "калькулятор" ввода числа, и привет, все повисло. С новым ФормЕкс естественно.
Цитата: MWW_Ruza от 29 мая 2025, 09:49С новым ФормЕкс естественно.
Вот блин, опять я загрузил старую длл. Я делаю какие-то правки, потом вроде кажется, что работает, меняю мдшник на старый, вношу свои исправления, а путь у формекса прежний dll\ :'(
Может отказаться от модальности если совсем уж никак, можно сделать псевдомодальномть
Кастрировал криво. Да. Извините. Мне казалось основное показать путь по которому возникает ошибка.
Чтобы исправить зависший процесс 1С. Надо в Глобальнике
Строка 47. Вместо ОткрытьФормуМодально("Обработка.ПланПомещения");
Написать
Если Темп <> "Завершить" Тогда
ОткрытьФормуМодально("Обработка.ПланПомещения");
иначе
ЗавершитьРаботуСистемы(0);
Возврат;
КонецЕсли;
И если уж совсем душа праздника требует то в Модуле Обработка.ПланПомещения процедуру Закрытие() переписать на
Процедура Закрытие()
Темп = "Завершить";
ЗавершитьРаботуСистемы(0);
Форма.Закрыть(0);
КонецПроцедуры
На рабочем модуле - при закрытии плана опять идёт авторизация - а тут будет просто происходить выход из программы. Опять таки - не думаю, что это критично для теста зависания формэкс.
Попутно вспомнил, что тот формэкс, что использую начисто обрубал вшитую в 1С - ОбработкаОжидания(). Хотя может он её и заменял на свою. Хз. Документации в тот момент, когда писали эту конфу - не было. Была только библиотека. И пример конфы.
Господа, пишите не "Новая версия" и не "Старая версия", а конкретную версию FormEx, именно это и поможет отыскать проблему.
У меня всё работает на FormEx.dll версии 1.9.0.1 от 15.12.2003 время 8:40 размер файла 136 килобайт.
На любых других версиях - всё становится колом.
Использую ещё Hide1C.dll- версия 1.0.0.2 от 09.12.2002 время 23:28 размер файла 44 килобайта
Цитата: p18 от 29 мая 2025, 19:45Использую ещё Hide1C.dll- версия 1.0.0.2 от 09.12.2002
Как уже выяснили, она тут ни при чем.
Комментировал ее загрузку, поведение меняется - главное окно не прячется, но в остальном работае все точно так-же. На 1.9.0.1 работает, на версиях 198 - 199 зависает.
Так, я тоже посмотрел. Ну, у меня не виснет на 199 (и в памяти не висит, и ошибок нет), но у меня патченная wirth'ом. Просто не работают (и не транслируются в глобальник) события мыши/клавы на второй модальной форме (действия). Закрываю эту форму по esc или убираю в форме ФормаРасш.ЗапретЗакрытияФормыКнопкой(1) и без проблем её закрываю.
Потом давно известный факт — не надо открывать окна из ПриНачалеРаботыСистемы(). Если запускать из, например, ОбработкиОжидания, то и курсор мыши становится нормальным, но события не идут всё равно.
#36 Просто демо-база настолько не демо, что непонятно в каком конкретно месте надо смотреть, что не работает. Как я понял - один из вариантов проверки "неработоспособности" ткнуть во втором после авторизации окошке (план зала) на кружочке с номером стола и попробовать ввести число клиентов - тут виснет наглухо с формексом 199.
Тоже пробовал открывать все через ОбработкуОжидания, убирал из ПриОткрытии, вставлял Паузы, делал "Если Форма.МодальныйРежим()=1 Тогда ОткрытьФормуМодально", добавлял # в ОткрытьФормуМодально, убирал Hide1C, бил в бубен, но что-то так и не сработало ничего...
Давняя тема. Много седых волос добавила.
В свое время натолкнулся на такое... научился, не спрашивая разрешения - всегда выходить из обработчиков событий формекса в модальных окнах.
пример обсуждения тут:
https://www.1cpp.ru/forum/YaBB.pl?num=1392388281/5
Хотя тестовый пример - уже рабочий на последней версии (проверил).
Накидал два варианта решения:
1. Вариант 1 сделал в Обработке "ПланПомещения"
Процедура ПриОтжатииЛевойКнопки(сост,х,у,ФСО)
Фсо = 0;
Сообщить("Главное окно");
ФормаРасш = СоздатьОбъект("РасширениеФормы");
ФормаРасш.УстановитьФорму(Форма);
Атр = ФормаРасш.ПолучитьАтрибутПоКоординатам(х,у);
Если ТипЗначенияСтр(Атр) = "АтрибутФормы" Тогда
Если Атр.Идентификатор = "Выход" Тогда Закрытие(); КонецЕсли;
Если Атр.Идентификатор = "Обновить" Тогда ИнитСтолов(); КонецЕсли;
Если Атр.Идентификатор = "кнСтопЛист" Тогда СтопЛист(); КонецЕсли;
Если (Атр.Идентификатор = "кнВыплатаДенег") Тогда Выплата(); Возврат; КонецЕсли;
Если (Атр.Идентификатор = "кнВнесениеДенегВКассу") Тогда Внесение(); Возврат; КонецЕсли;
Если (Атр.Идентификатор = "вклСкидка") Тогда ИзменениеКонстанты(1); КонецЕсли;
Если (Атр.Идентификатор = "выклСкидка") Тогда ИзменениеКонстанты(0); КонецЕсли;
Если (Атр.Идентификатор = "Списание") Тогда Списание(); КонецЕсли;
Если (Атр.Идентификатор = "Сигма") Тогда Сигма(); КонецЕсли;
Если Число(Сред(Атр.Идентификатор,5)) = 0 Тогда Возврат; КонецЕсли;
//ОткрытиеСчетаСтола(Число(Сред(Атр.Идентификатор,5)));
лсСерв = СоздатьОбъект("Сервис");
лсСерв.ВнешнееСобытие("1С","ОткрытиеСчетаСтола",Сред(Атр.Идентификатор,5));
КонецЕсли;
Фсо = 1;
КонецПроцедуры
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
Если (Источник = "1С")и(Событие = "ОткрытиеСчетаСтола") тогда
Сообщить("Открыть стол");
ОткрытиеСчетаСтола(Число(Данные));
КонецЕслИ;
КонецПроцедуры
Через внешнее событие.
Но во втором модальном окне уже такое не прокатило. НЕ запускается Второе "Внешнее событие". Есть гипотеза - что это также связано с тем, что модальность окна "останавливает" дальнейшее выполнение "одинаковых" функций... Опять же имхо.
Поэтому кинул "ТекстНеУдалять" на форму.
В обработке "Счет"
....
Процедура OnLButtonUp(сост,х,у,ФСО) // извиняюсь за мой английский - проверял гипотезу "одинаковых функций"
// но такое не прокатило.
.......
Если Атр.Идентификатор = "Закрыть" Тогда
Сообщить("Закрытие?");
Если ффСтарыйРежим = 0 тогда
Сообщить("Так работает!");
Форма.Обновить(0);
ФлагВызова = "ВыборЗакрытия";
иначе
Сообщить("Так НЕ работает!");
ВыборЗакрытия();
КонецЕслИ;
Возврат;
КонецЕсли;
......
Функция ОбработчикФормы()
Сообщить("Ловим");
Сообщить("ФлагВызова");
Если ФлагВызова = "ВыборЗакрытия" тогда
ФлагВызова = "";
Сообщить("Словили");
ВыборЗакрытия();
КонецЕслИ;
Возврат "";
КонецФункции
Трейс теста.
1. Карта официанта. Мышкой - 0, ОК.
2. План зала. Мышкой, кружок 32.
3. Ввод числового значения (ввод клиентов за столом). Мышкой - 1, ОК (почему-то два раза надо кликать - надо FIX)
4. Счет. Мышкой - Бар, Коньяк :). Закрыть
5. Тестовое окно со стеком вызова. ОК. Не сохранять. Должно быть таким: https://disk.yandex.ru/i/8JiA8HEI2FyoGQ
Замечание: Это мой "условно" рабочий вариант. Потому что бывает так... и что это за странный стек такой, я не понял... https://disk.yandex.ru/i/V0XdcypHQn2eXg
6. Возврат в план зала.
7. План зала. Мышкой, кружок 32.
8. Ввод числового значения (ввод клиентов за столом). Мышкой - 1, ОК (все еще - два раза надо кликать)
9. Счет. Мышкой - Бар, Коньяк.
10. Счет. Клавиатурой CTRL+SHIFT+F2. "Переключаем на вызов модального окна из обработчика событий"
11. Закрыть.
12. Тестовое окно со стеком вызовов. НЕ Работает, функция обработчика болтается в стеке... https://disk.yandex.ru/i/uRwt8bscbQW8xQ
13. Действия. Кнопка мыши не перехватывается. ЧТД... (ESC у меня работает)
Версия formex 2.0.5.199
Тестовая база с моими похабными правками - тут.
https://disk.yandex.ru/d/qhVKmDTIBY2c0A
Аааа... А я эту конфу уже видел, присылали на попытку фикса!
Не осилил. Извините. Красиво, но работает только с очень старыми версиями formex.
(почему-то два раза надо кликать - надо FIX
ДЕМО - оно такое демо. ) Обрабатывается каждое второе нажатие. Это связано с тем - что работает это все на Посифлексах с тачскрином. И как я не бился с ними - на более или менее новых моделях - почему-то нажатие на тачскрин - обрабатывается как два нажатия. Уже и скорость кликов с свойствах мыши под виндой замедлял и с бубном прыгал - но видимо не тот бубен. Поэтому под настоящей мышью - одно нажатие тупо пропускаю. а вот по тачу - одно нажатие - одно действие.
Ну, в целом, надо делать либо "менеджер событий" куда кидать в очередь формы и пусть он открывает только по одному модальному окну, либо делать псевдомодальные окна (неразвёрнутые, следить за потерей фокуса, нажатиями вне окна и передним планом)
Цитата: Arbuz от 05 июня 2025, 17:48Ну, в целом, надо делать либо "менеджер событий" куда кидать в очередь формы и пусть он открывает только по одному модальному окну, либо делать псевдомодальные окна (неразвёрнутые, следить за потерей фокуса, нажатиями вне окна и передним планом)
А варианта - без лыж, гамака и акваланга - для 1с не бывает? ) Просто иногда хочется - хотя бы без лыж.
ну, делаешь модальную форму, ОДНУ.
а на ней на куче слоев весь функционал нужный,
переключайся и отрабатывай что надо...
;-)
.
я так пробовал на заааареее... голосаааа зовууут...
очень неудобно. перешел на диспетчер обработок, каждая модальная форма - некое "атомарное" действие. это позволяет быстро вязать процессы ы виде нужной последовательности форм и переходов между ними...
Цитата: p18 от 10 июня 2025, 13:58А варианта - без лыж, гамака и акваланга - для 1с не бывает? )
Дык, это ж 1С — либо страдать, либо расслабиться и получать удовольствие ))
Тащемто, модальность это одно из самых проблемных мест в клюшках. Я вот всё мечтаю сделать псевдомодальные окна, но никак не могу выработать концепцию — вот бы можно было сделать в окне прозрачные области (чтобы не заморачиваться с максимизированными окнами).
Епрст выкладывал демо псевдомодального окна (лежит в загашнике у меня, может на ИС тоже есть, но кажется не выкладывал он туда).
Цитата: Arbuz от 11 июня 2025, 14:57(чтобы не заморачиваться с максимизированными окнами).
это что имеется в виду?
Это имеется ввиду, когда все окна развёрнуты и можно было бы имитировать неразвёрнутое окно, сделав вокруг сцентрированных элементов прозрачную область. И так легко можно было бы блокировать нажатия 'мимо' и потерю фокуса.
Что-то я не понял... Если модальное развернуто максимизировано - куда можно тыкнуть мимо/потерять фокус?
Цитата: Злоп от 10 июня 2025, 16:10ну, делаешь модальную форму, ОДНУ.
а на ней на куче слоев весь функционал нужный,
переключайся и отрабатывай что надо...
;-)
.
я так пробовал на заааареее... голосаааа зовууут...
Ага. Есть у меня в этой базе - форма вируальной клавиатуры. Буквы и пресеты. Что-то около 60 кнопок. Очень интересно наблюдать как на старых компах эта форма проявляется. Есть в ней что-то для познания истинного Дао....
И вот думаю - если запихну туда всё в одну... Там не то что Истинное Дао можно будет познать. Думаю можно после этого ещё и пару воплощений спокойно прожить )))))
Цитата: Злоп от 11 июня 2025, 19:04Епрст выкладывал демо псевдомодального окна (лежит в загашнике у меня, может на ИС тоже есть, но кажется не выкладывал он туда).
ПруфЛинк плиз. Ёпрст таким никогда не занимался (он не использовал FormEx, все было штатными способами, а тут внезапно использовал, неувязочка...).
Вроде это моя фишка, но пофиг...
Все лайки Ёпрсту! Он это заслужил, даже если ничего не делал!
Согласен. Мог налажать я с авторством.
Пофиг на авторство...
Но мы так и не услышали мнение Начальника Транспортного цеха!
"..токмо волею пославшей мя жены..."
Перем Расш;
//*******************************************
Процедура Инициализация()
Расш.ОбработкаОжидания("",0);
Сообщить(СимволТабуляции+" - и вот хрен вам");
ОткрытьФорму("Отчет",,РасположениеФайла());
КонецПроцедуры // Инициализация()
//*******************************************
Процедура ПриДеактивацииОкна()
Сообщить(ТекущееВремя()+" попытка удрать из окна обработки");
Расш.ОбработкаОжидания("Инициализация",100);
КонецПроцедуры // ПриДеактивацииОкна()
//*******************************************
Процедура ПослеОткрытия()
Расш = СоздатьОбъект("РасширениеФормы");
КонецПроцедуры // ПослеОткрытия()