Модальный диалог в 1с как закрыть
сама платформа умеет это делать, но это недокументированный эффект.
P.S. эффект получен на 10 местном пробном сервере 2000.
Вспомнил еще тему от Гения1С, про код, заваливающий платформу. Восьмера вылетала без предупреждения, а вот на семерке не экспериментировал.
когда закрываешь модальное окно, тогда закрывается и 1С (срабатывает "ЗавершитьРаботуСистемы(0)")
штатно и с помощью формекса, если открыто модальное окно - туфта.
(10) это не наработка, это обнаруженный факт.
На дисках МСДН в свое время был сервер Вин2000, типа тестовый, полностью работоспособный, но ТОЛЬКО 10 ПОДКЛЮЧЕНИЙ. т.е. ДЛЯ ПОПРОБОВАТЬ.
если было активно 10 подключений и кто то пытался ломануться 11-м, то сервер проделывал очень интересную штуку - выбрасывал по своему выбору одного юзера, и пускал нового.
При этом в результате экспериментов было выяснено
- 1С закрывалась, даже если светилось окно ввода пароля
- закрытие осуществлялось явно не через килл процесс, а штатно - потом не требовалась переиндесация.
Значит, в исполняющей системе платформы 1С есть недокументированный вызов от мягких, который обеспечивает штатное завершение задачи и она при этом корректно закрывает открытые файлы.
Второй нюанс - если программа отказывалась закрываться, то штатно винды прекращают действие. Здесь же задача закрывалась автоматически - система плевала на ее ответ.
И самое главное (с этого, пожалуй надо было начать. ) посмотри у Ромикса - у него есть просто обббалденная убивалка.
Синтаксис: ОбработкаОжидания(Имя, Интервал)
Параметры:
• Имя - тип: Строка. Имя глобальной процедуры для периодического вызова (если в качестве параметра передается пустая строка, то ранее запущенный процесс прекращается);
• Интервал - тип: Число. Интервал вызова процедуры в миллисекундах (если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается).
Описание: Вызывает глобальную процедуру с заданным интервалом в милисекундах. В отличии от штатной обработки ожидания, вызывается при открытых модальных формах.
объект Сервис: новый метод СписокВсехОткрытыхОкон() возвращает список значений со всеми открытыми формами.
объект РасширениеФормы: новый метод Закрыть(), который немедленно закрывает форму (в отличие от стандартного метода Форма.Закрыть() который ожидает завершения выполнения текущего кода)
Тогда дай объяснение тому, как можно кильнуть 1С с открытым модальным окном так, чтобы потом не требовалась переиндексация.
Не ответив на запрос, появившийся в подобном окне, невозможно дальше продолжать работать во всей программе. Она полностью блокирует интерфейс, и в результате работа других окон также перекрывается. Более того, исполнение программных кодов аналогичным образом будет остановлено как раз в той точке, где имел место вызов диалога. И такая нештатная ситуация продолжится вплоть до завершения действия с окном, программа будет находиться в режиме ожидания этого.
Устранение ошибки «Использование в данном режиме модальных окон запрещено» в системе 1С
Эта разновидность ошибки стала возникать после того, как 1С была полностью переведена на новый интерфейс, относящийся к платформе 1С 8.3 – «Такси». Связано это с тем, что разработчиками в ней была включена возможность работы с окнами, однако, она была реализована без режима модальности.
После того, как в режиме «Конфигуратор» открывается информационная база системы, нажимаем правую кнопку мышки, а затем выбираем команду «Свойства». Это позволяет увидеть все свойства конфигурации установленной на компьютере системы. После прокрутки линейки вниз, перед пользователем появляется раздел «Совместимость», в пределах поля которого и расположен тот параметр режима, что его в первую очередь интересует. Кроме того, там перечисляются и возможные варианты в плане выбора: их в общей сложности три, и это может быть «Использовать», «Использовать с предупреждением», либо же «Не использовать».
Затем, в обязательном порядке потребуется сохранить произведенные в конфигурации изменения, после чего и обновить их. Та ошибка, о которой шла речь ранее, возникает, если установлена отметка о недопустимости использования режима модальности. Эта возможность возникла, начиная с платформы версии 8.3.3.721, релиз которой состоялся еще в сентябре 2013-го года. Другими словами, те пользователи системы, которые до настоящего момента по каким-либо причинам все еще продолжают работать с более старыми версиями платформы, могут не отказываться от использования модальности. Что же касается других версий, что бы устранить всякую возможность появления окна с ошибкой, допускается простая установка посредством использования вкладки «Использовать».
Модальность и отказ от ее использования
Оказывая поддержку нынешним общемировым тенденциям и четко следуя им, разработчики программы 1С стремятся сделать ее пользовательский интерфейс максимально приближенным к веб-образцам с последующим приведением к единому стандарту. Благодаря этому, пользователи уже в не слишком далеком будущем получат возможность работать с привычным им внешним интерфейсом лишь в одном окне.
Другими словами, данное новшество совершенно освобождает пользователей от неприятной и довольно утомительной необходимости настраивать браузер дополнительно. Кроме этого, оно стабилизирует работу интернет-клиента, одновременно достаточно существенно повышая его производительность. И наконец, поскольку сейчас отсутствует какая-либо необходимость открытия всплывающих окон, возможно использование на любом устройстве соответственно и любой конфигурации, в которую ранее были внесены такого рода изменения.
Клиентские приложения все чаще используются при помощи веб-клиента, что предъявляет определенные требования к коду. В этой статье я постараюсь рассказать о модальности в 1С — когда и почему следует от нее отказаться и как это сделать.
Общая информация
В начале рассмотрим общие вопросы связанные с модальными окнами в 1С.
Что не так с модальными окнами?
С модальными окнами все в порядке. Они широко используются в 1С в тех случаях, когда от пользователя требуется ввод информации без которой невозможно дальнейшее выполнение программы. Остальной интерфейс при этом блокируется, а выполнение кода приостанавливается до тех пор, пока модальное окно не будет закрыто.
Когда следует отказаться от модальности?
Разумеется отказ от модальности необходим далеко не всегда.
Во-первых, режим работы интерфейса без использования модальности появился в версии технологической платформы 8.3.3.721 (от 06.09.2013) — следовательно, при использовании предыдущих версий технологической платформы, не нужно задумываться об отказе от модальности.
Режим использования модальности
Во-вторых, не все прикладные решения обязаны использовать этот режим. Отказ от модальности является критичным для приложений которые будут использоваться:
Нужно отметить, что во всех типовых конфигурациях (речь о новых или не слишком старых версиях) основной режим работы интерфейса — режим без использования модальности. Об этом нужно помнить при внесении изменений в эти конфигурации.
Отказ от модальности в любой серьезной конфигурации (существующей и использующей модальные окна) — дело непростое. В значительном количестве случаев будет недостаточно заменить один метод на другой — может потребоваться изменение значительной части интерфейса прикладного решения.
Каждый раз, перед тем как начать переделывать модальный диалог, стоит очень серьезно подумать — не проще ли будет избавиться от этого диалога совсем.
Помимо изменения самих диалогов (создание вызываемых процедур, изменение кода вызовов и тд.), отказ от модальности — это еще и существенный шаг в сторону асинхронной модели работы клиентского приложения, со всеми вытекающими отсюда последствиями. Подробнее об асинхронной модели клиентского приложения в отдельной статье.
Непосредственно при отказе от модальности очень поможет механизм рефакторинга о котором подробно написано в отдельной статье.
Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.
Практические примеры
В качестве практических примеров рассмотрим основные приемы работы с блокирующими окнами.
Войдите как ученик, чтобы получить доступ к материалам школы
Внутренний язык программирования 1С 8.3 для начинающих программистов: использование диалогов в 1С
Автор уроков и преподаватель школы: Владимир Милькин
Давайте определимся, что же такое диалог? Вызов команды Сообщить является диалогом? А вызов команды ВвестиЧисло? А вызов ОткрытьЗначение?
Итак, диалог - это прежде всего элемент графического интерфейса , окно . А следовательно вызов Сообщить - диалогом не является, так как у него нет своего отдельного окна.
Диалог - это не просто окно. Это окно, которое открывается пользователю с целью вывода информации и (или) получения ответа.
Для того чтобы показать какой-либо диалог необходимо вызвать команду соответствующую этому диалогу и передать ей необходимые параметры. Команда - это обычная процедура или функция, только написанная не нами, а программистами фирмы 1С. Мы не можем менять эти команды, мы можем их только вызывать.
Предупреждение
Отличным примером диалога является вывод предупреждения пользователю:
Что мы видим? Вызов команды Предупреждение, в которую в качестве параметра передаётся строка "Осторожно".
Когда компьютер дойдёт до строчки, в которой вызывается эта команда, пользователю отобразится диалог предупреждения. И до тех пор, пока пользователь не закроет этот диалог, компьютер будет ожидать на этой же строчке. Только после закрытия диалога - выполнение программы продолжится и начнётся выполнение строки, следующей за вызовом диалога.
К примеру, пусть у нас есть такой код:
Как он будет выполняться?
В начале компьютер дойдёт до строчки №1 и выполнит команду Предупреждение с параметром "1". В этот момент пользователю покажется диалоговое окно с текстом "1", а компьютер замрёт на этой строчке и будет ожидать, пока пользователь закроет диалог. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
После закрытия диалога компьютер перейдёт к выполнению строчки №2 и выполнит команду Предупреждение уже с другим параметром "2". Пользователю снова покажется диалоговое окно, но уже с текстом "2", а компьютер замрёт уже на второй строчке и будет ожидать, пока пользователь закроет диалог.
Затем компьютер перейдёт к третьей строчке. Ну и так далее.
У команды Предупреждение параметр, отвечающий за текст, который выводится - не единственный. Есть ещё два дополнительных параметра:
Таймаут - означает количество секунд, через которое диалог закроется сам, если этого не сделает пользователь.
Заголовок - подменяет стандартный заголовок "1С:Предприятие" на строку пользователя.
К примеру, такой код:
покажет диалог с текстом "Осторожно." и заголовком "Внимание!", а также закроется через 5 секунд, если пользователь не сделает этого раньше:
А что если мы хотим задать только текст и заголовок окна, а таймаут не задавать?
Во-первых, мы можем передать в качестве таймаута ноль:
А во-вторых, мы можем просто оставить пустое место вместо параметра и система сама поймёт, что нужно оставить его значение по умолчанию:
Для того, чтобы узнавать обо всех возможных параметрах встроенных команд 1С - пользуйтесь синтакс-помощником так, как это описано в одном из предыдущих уроков (ссылка).
Ввод числа
Некоторые диалоги не только выводят какую-то информацию от нас пользователю, но и наоборот возвращают некий результат взаимодействия с пользователем. Примером такого диалога является ввод числа.
К примеру, напишем:
Зачем мы передаём в команду параметр Число? Во-первых, для того, чтобы отобразить начальное значение ввода в диалоге. А, во-вторых, чтобы вернуть в эту переменную значение, которое ввёл пользователь. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Но что если пользователь отказался от ввода и нажал кнопку "Отмена"? Как об этом узнать? Оказывается, функция ВвестиЧисло не только показывает диалог ввода числа, но ещё и возвращает нам Истина в том случае, если пользователь нажал кнопку "ОК" и Ложь, если он отменил ввод, нажав кнопку "Отмена".
Таким образом, более правильным будет такой код:
В переменную Результат (имя могло быть любым) возвращается Истина или Ложь в зависимости от того какую кнопку нажал пользователь ("ОК" или "Отмена").
В переменную Число возвращается число введенное пользователем.
Вопрос
Заключительным диалогом, который мы рассмотрим, будет является диалог вопроса пользователю.
Имя команды, которая вызывает этот диалог нам известна - Вопрос.
Теперь давайте посмотрим в синтакс-помощнике какие параметры принимает эта команда:
ТекстВопроса - это сам вопрос в текстовом виде, который увидит пользователь.
Кнопки - это одно из предопределенных значений, которые также можно посмотреть в синтакс-помощнике. Например, если передать в этот параметр:
- РежимДиалогаВопрос.ДаНет - в диалоге будет всего две кнопки Да и Нет.
- РежимДиалогаВопрос.ДаНетОтмена - три кнопки Да, Нет и Отмена.
- РежимДиалогаВопрос.ОкОтмена - две кнопки Ок и Отмена.
- И другие варианты кнопок.
- КодВозвратаДиалога.Нет
- КодВозвратаДиалога.Да
- КодВозвратаДиалога.Отмена
- И другие кнопки.
Таймаут - этот параметр нам уже знаком.
КнопкаПоУмолчанию - это кнопка, на которой будет фокус при показе окна. Её значения могут быть такими:
Заголовок - этот параметр нам уже знаком.
КнопкаТаймаута - если задать значение этой кнопки и параметр Таймаут, то именно на ней будет отображаться количество оставшихся секунд до закрытия диалога. У неё могут быть такие же значения как и у параметра КнопкаПоУмолчанию.
Уфф. Как видите, параметров много. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но необязательно использовать их все. Как следует из синтакс-помощника обязательными к заполнению являются только первые два:
Вопрос-то мы задали. Хорошо бы теперь получить ответ - выспался пользователь или нет Из того же синтакс-помощника мы узнаём, что кнопка которая была нажата возвращается в качестве результата вызова команды Вопрос:
Модальность
Все примеры диалогов, которые мы рассмотрели - являются модальными, потому что компьютер, показывая диалог, замирает на той же строчке и не идёт дальше, пока диалог не закроется.
Ещё можно сказать, что когда мы показываем модальный диалог - пользователь может работать только с этим диалогом. Работа со всей остальной частью системы блокируется, пока не закроется диалог.
Таким недостатком не обладают немодальные версии диалогов, но к ним переходить нам ещё рано.
сама платформа умеет это делать, но это недокументированный эффект.
P.S. эффект получен на 10 местном пробном сервере 2000.
Вспомнил еще тему от Гения1С, про код, заваливающий платформу. Восьмера вылетала без предупреждения, а вот на семерке не экспериментировал.
когда закрываешь модальное окно, тогда закрывается и 1С (срабатывает "ЗавершитьРаботуСистемы(0)")
штатно и с помощью формекса, если открыто модальное окно - туфта.
(10) это не наработка, это обнаруженный факт.
На дисках МСДН в свое время был сервер Вин2000, типа тестовый, полностью работоспособный, но ТОЛЬКО 10 ПОДКЛЮЧЕНИЙ. т.е. ДЛЯ ПОПРОБОВАТЬ.
если было активно 10 подключений и кто то пытался ломануться 11-м, то сервер проделывал очень интересную штуку - выбрасывал по своему выбору одного юзера, и пускал нового.
При этом в результате экспериментов было выяснено
- 1С закрывалась, даже если светилось окно ввода пароля
- закрытие осуществлялось явно не через килл процесс, а штатно - потом не требовалась переиндесация.
Значит, в исполняющей системе платформы 1С есть недокументированный вызов от мягких, который обеспечивает штатное завершение задачи и она при этом корректно закрывает открытые файлы.
Второй нюанс - если программа отказывалась закрываться, то штатно винды прекращают действие. Здесь же задача закрывалась автоматически - система плевала на ее ответ.
И самое главное (с этого, пожалуй надо было начать. ) посмотри у Ромикса - у него есть просто обббалденная убивалка.
Синтаксис: ОбработкаОжидания(Имя, Интервал)
Параметры:
• Имя - тип: Строка. Имя глобальной процедуры для периодического вызова (если в качестве параметра передается пустая строка, то ранее запущенный процесс прекращается);
• Интервал - тип: Число. Интервал вызова процедуры в миллисекундах (если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается).
Описание: Вызывает глобальную процедуру с заданным интервалом в милисекундах. В отличии от штатной обработки ожидания, вызывается при открытых модальных формах.
объект Сервис: новый метод СписокВсехОткрытыхОкон() возвращает список значений со всеми открытыми формами.
объект РасширениеФормы: новый метод Закрыть(), который немедленно закрывает форму (в отличие от стандартного метода Форма.Закрыть() который ожидает завершения выполнения текущего кода)
Тогда дай объяснение тому, как можно кильнуть 1С с открытым модальным окном так, чтобы потом не требовалась переиндексация.
Читайте также: