Вывод окон сообщений, запросов, предупреждений


Содержание

Модальное окно подтверждения JavaScript

Уважаемые пользователи! Мы благодарим Вас за то, что Вам интересен нашен контент, поэтому с каждым днем хотим становиться все лучше и лучше!

Большое спасибо за вашу помощь и внимательность к нам!

Встречаются случаи, когда нужно подтверждать удаление какого-либо объекта. То есть мы выбираем какие-либо объекты и нажимаем ссылку удалить, перед нами отображается модальное окно с двумя кнопками ок и отмена, если выбираем ок, то появляется еще одно модальное окно, которое уже будет последним и подтверждающим в плане события действий и если мы в нем тоже нажимаем кнопку ок, то объект(ы) удаляются. Данный скрипт с наибольшей вероятностью поможет избежать не плановое удаление объектов и обезопасить Вас от не правильных действий.

Модальное окно подтверждения JavaScript поможет в большинстве видов случаев, так как его использовании помогает нам выбирать дальнейшее действие и затем уже при необходимости делать правильный выбор. Ну к примеру, есть похожая тематика, только со всплывающим окном на JQuery при первом заходе на сайт, где можно выбрать конкретное действие. Я подготовил небольшое видео для Вас, которое поможет понять принцип строения данного скрипта и уже в деталях разберемся, что к чему.

Для начала создадим скрипт, который будет выводить всплывающие окна в браузере при нажатии ссылки. Создадим любую произвольную функцию, ну например function del() с пустыми параметрами, в ней пропишем условие в котором функция confirm будет выводить всплывающее окно в браузере с принятием нужного решения ок и отмена, в ней пропишем последнее подтверждающее решение с помощью той же функции confirm.

Ход действий при нажатии следующий:

Код скрипта:

Ну, а теперь осталось вывести саму ссылку и присвоить ей событие, которое будет работать с функцией function del().

Вот такой получился у нас с Вами простой скрипт, но достаточно полезный в применении. Удачи Вам в реализации! Большое спасибо за внимание!

Вывод в окно сообщения Delphi

Как осуществляется вывод в окно сообщения Delphi? Окно сообщений применяется для того, чтобы привлечь внимание пользователей. Используя окно сообщений, программа может оповестить программиста об ошибке первичных данных или сделать запрос о подтверждении выполнения некоторой необратимой операции (удалить файл, очистить содержимое и др.).

В Delphi для вывода на экран окна сообщения зарезервирована процедура ShowMessage (либо выполняющая те же операции функция MessageDlg Delphi). Остановимся подробнее на них.

Процедура ShowMessage Delphi:

Применение процедуры ShowMessage позволяет вывести на экран окно с необходимым текстом и кнопкой подтверждения OK. Процедура ShowMessage Delphi организована следующим образом:

откуда Сообщение представляет собой текст, впоследствии выведенный в диалоговом окне.

Пример 1. Представим иллюстрацию окна сообщения, которое получено вследствие выполнения следующей инструкции:

Заметка. Заголовок окна сообщения, которое выводится при помощи процедуры ShowMessage, содержит название приложения, задающееся на специальной вкладке Application в окне Project Options. В случае, когда названия приложения не указано, заголовок будет включать в себя имя исполняемого файла.

Функция MessageDlg Delphi:

При помощи более универсальной процедуры MessageDlg возможно размещение в окне сообщения одного из стандартных значков, например, «Внимание», а также возможно задание количества и типа командных кнопок и обозначить, какую именно кнопку щелкнул программист. На рисунке ниже представлена иллюстрация окна, выведенного вследствие выполнения следующей инструкции:

В качестве значения функции MessageDlg выступает число, проверка значения которого может показать, какая командная кнопка завершила диалог. Общий вид обращения к данной функции представлен ниже:

  • Сообщение представляет собой некоторый текст;
  • Тип определяет тип сообщения, которое включает в себя информационное, предупреждающее или сообщение о критической ошибке. Определенному типу ставится в соответствие некоторый значок. Именованная константа задает тип сообщения (табл. ниже).
  • Кнопки выступают в качестве списка кнопок, которые отображаются в окне сообщения. В состав данного списка входят именованные константы, разделенные запятыми (табл. ниже), при этом весь список заключен в квадратных скобках. К примеру, для появления в окне сообщения кнопок OK и Cancel необходимо представить список Кнопки как [mbOk,mbCansel]. Помимо указанных в таблиц выше констант возможно применение и таких констант, как mbAbortRetryIgnore, а также mbYesNoCansel и др. Как правило, данные константы чаще используются в комбинациях командных кнопок диалоговых окон.
  • КонтекстСправки означает параметр, обозначающий раздел справочной системы, который впоследствии выведется на экран при нажатии пользователем на клавишу F1. В случае отсутствия справочной системы, параметр КонтекстСправки должен быть приравнен нулю.

Значение функции MessageDlg определяет, на какую из командных кнопок щелкнул пользователь при работе с программой (табл. ниже).

При выполнении макроса Microsoft Access выводит ненужное сообщение

Читайте также:

  1. Access для Windows
  2. DocsVision клиент для Microsoft Outlook
  3. Microsoft
  4. Microsoft
  5. Microsoft Baseline Security Analyzer
  6. Microsoft Excel
  7. Microsoft Excel
  8. Microsoft Excel Поиск решения
  9. MICROSOFT POWERPOINT
  10. Microsoft Project
  11. Microsoft TechNet и Microsoft Developer Network на компакт-дисках
  12. Microsoft Word 2007

Для того чтобы временно отключить вывод предупреждений и других сообщений на время выполнения макроса, следует вызвать в макросе макрокоманду УстановитьСообщения (SetWarnings) с аргументом «Нет». Повторный вызов макрокоманды УстановитьСообщения (SetWarnings) позволяет снова включить режим вывода сообщений. Для получения дополнительных сведений нажмите кнопку .

Макрокоманда «КомандыКлавиатуры» (SendKeys) используется в макросе для передачи нажатий клавиш в диалоговое окно, но нажатия клавиш не передаются.

Открытие диалогового окна прерывает выполнение макроса, поэтому макрокоманду КомандыКлавиатуры (SendKeys) следует поместить в макросе до макрокоманды, открывающей диалоговое окно. Для того чтобы выполнение макроса не прерывалось, следует задать для аргумента «Пауза» значение «Нет». Для получения дополнительных сведений о макрокоманде КомандыКлавиатуры (SendKeys) нажмите кнопку .

Автоматическое создание ярлыка базы данных в папке «Избранное»

В папку «Избранное» помещают ярлыки баз данных и других часто используемых файлов, в том числе хранящихся на удаленных станциях, что позволяет не проводить каждый раз поиск этих файлов. Положение исходных файлов или папок при этом не изменяется.

1В меню Файл выберите команду Открыть базу данных.

2Выполните одно из следующих действий.

·Для создания ярлыка вложенной папки или базы данных, выведенных в диалоговом окне «Открытие файла базы данных», выделите файл или папку, нажмите кнопку Поместить в папку «Избранное» на панели инструментов, а затем выберите команду Добавить выделенный объект в папку «Избранное».

·Для создания ярлыка папки, имя которой указано в поле «Папка», нажмите кнопку Поместить в папку «Избранное» на панели инструментов и выберите команду Добавить ‘имя папки’ в личную папку.

Примечание. Чтобы быстро открыть папку «Избранное» после запуска Microsoft Access в диалоговом окне Открытие файла базы данных нажмите кнопку Открыть папку «Избранное» .

Почему при открытии или создании новой базы данных по умолчанию открывается папка «Мои документы»?

В предыдущих версиях файлы сохранялись в той же папке или каталоге, в которой были созданы. Однако при необходимости резервирования всех файлов пользователь обнаруживал, что эта операция является сложной и занимает много времени, поскольку файлы сохраняются в разных местах. Поэтому в Microsoft Access каждый раз при запуске приложения по умолчанию предлагается папка «Мои документы». Там можно хранить все файлы, при необходимости приходится резервировать только одну папку.

При переименовании или перемещении папки «Мои документы» Microsoft Windows запоминает новое имя папки. Это означает, что при перезапуске Microsoft Access папка «Мои документы» будет по-прежнему использоваться по умолчанию вне зависимости от ее имени и места хранения. Если папка «Мои документы» удаляется, то при повторном запуске приложения она автоматически воссоздается.

При желании пользователь может назначить другую папку в качестве используемой по умолчанию. Для получения дополнительных сведений нажмите кнопку .

Выводится сообщение «Невозможно присоединить имя »

Данное сообщение выводится на экран, если в диалоговом окне Параметры запроса не были четко определены параметры, используемые для перекрестных запросов или для запросов, на которых основан перекрестный запрос или диаграмма. Для разрешения этой проблемы выполните следующие действия.

1В запросе, содержащем данный параметр, в диалоговом окне Параметры запроса укажите параметр и его тип данных. Для получения дополнительных сведений нажмите кнопку .

2В том же самом запросе установите свойство Заголовки столбцов (ColumnHeadings). Для получения дополнительных сведений нажмите кнопку .

Использование папок «Мои документы» и «Избранное»

Папку «Избранное» используют для сохранения ярлыков часто используемых баз данных, включая и находящиеся на удаленных компьютерах. Исходный файл или папка при этом не перемещается. Ярлык обеспечивает быстрый доступ к файлу без необходимости помнить его место расположения. Для получения дополнительных сведений об автоматическом добавлении ярлыка базы данных в папку «Избранное» нажмите кнопку .

В папке «Мои документы» удобно хранить все исходные собственные базы данных и файлы. Это позволяет одновременно создавать резервные копии всех собственных документов. Папка «Мои документы» является папкой, используемой по умолчанию при создании новых баз данных Microsoft Access, если пользователь не указал другую папку, используемую по умолчанию. Для получения дополнительных сведений об используемой по умолчанию папке нажмите кнопку .

После использования команды «Ввод данных» снова вывести записи на экран невозможно

·В меню Записи выберите команду Удалить фильтр.

На экран выводится сообщение «Запрос содержит неоднозначные внешние связи»

Это может произойти при попытке запустить запрос с определенными комбинациями объединений. Для получения примера, что может вызвать такой конфликт, и сведений о способах его разрешения см. статью Q124937 «Explanation of ‘Ambiguous outer joins’ error message» в базе данных Microsoft Knowledge Base. Для связывания страницы поиска Microsoft Access Knowledge Base в сети Web нажмите кнопку . Для получения дополнительных сведений о доступе к базе данных Knowledge Base или другим техническим ресурсам нажмите кнопку .

KСоздание запроса с параметрами, условия которого находятся в специальном диалоговом окне

Специальные диалоговые окна используются для определения условий для запроса, который является базовым для формы или отчета. Например, в специальном диалоговом окне могут быть определены записи, включенные в выводимый на печать отчет.

1Создайте или откройте запрос, значения условий которого будут взяты из диалогового окна.

2Убедитесь, что запрос содержит необходимые таблицы.

3Добавьте в бланк запроса поля, связанные с каждым из элементов управления диалоговых окон, куда затем будут введены значения условий. Для каждого из данных полей в ячейку Условие отбора введите выражение, указывающее, что за определенными значениями условий необходимо обращаться к данному элементу управления диалогового окна. Если при создании выражения понадобится помощь, используйте построитель выражений. Для получения дополнительных сведений нажмите кнопку .

4Добавьте в бланк запроса поля, значения которых должны возвращаться.

Например, можно создать форму диалогового окна «Сведения о клиенте», содержащую элемент управления для поля «КодКлиента». При вводе кода клиента в диалоговое окно запрос возвращает правильное название фирмы клиента, его адрес и город. Для создания такого запроса выполните следующие действия.

·Добавьте поле «КодКлиента» в бланк запроса. В ячейку Условие отбора введите выражение, указывающее Microsoft Access, что за значением условия отбора, используемым запросом, следует обращаться к элементу управления «КодКлиента» в диалоговом окне. В этом случае необходимо ввести выражение Forms![Сведения о клиенте]![КодКлиента].

·Добавьте в бланк запроса поля, значения которых должны возвращаться на основе значения «КодКлиента» (поля «Название», «Адрес» и «Город»).

Для получения дополнительных сведений об использовании форм для сбора и отображения данных см главу 3 «Использование форм для ввода, вывода и отбора данных» книги Разработка приложений для Microsoft Access 97.

Дата добавления: 2014-11-29 ; Просмотров: 787 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Всплывающие окно предупреждения JS?

Только начал изучать JavaScript. Задача в следующем, на странице сайта есть кнопка удаление записи из таблицы mysql. Мне нужно, при нажатии на эту кнопку, чтобы всплывало окно подтверждения удаления с двумя кнопками Да и Нет. Если нажимаю ДА идет отправка на сервер и запись удаляется, если кликаю НЕТ — отправка на сервер не осуществляться и всплывающие окно исчезает.

Вот написал такой код:

При нажатии кнопки Delete все нормально работает — всплывает окно с кнопками да и нет. Но при нажатии на эти кнопки ничего не происходит(. Подскажите где ошибки пожалуйста.

  • Вопрос задан более трёх лет назад
  • 2024 просмотра

Создаем простую кнопку вместо Submit.

И привязываем события, а не проверяем наличие привязаного события на кнопках yes и no

И еще поправим CSS:

Головой ударился. В каком древнем свитке ты такую ахинею прочитал. Если такое правило и было, то оно было лет 10 назад. И применялось в совсем других случаях чем у тебя.

Какая хрен разница поисковой системе как ты скрываеш вспомогательный контет на странице. Тебе что, нужно чтобы робот проанализировал твое всплывающе окно? Так вот, в твоем случае все наоборот с display:none поискова система будет корректнее анализировать контент, понимая, что это не значимий контет. Главное правильно разложи все по HTML5 блокам, и если ты так печешся о поисковиках то пропиши роли каждого значимого блока.

Инструкция: Скрытие seo — текста чтобы заблокировать сайт.
Напишите seo-текст, вставьте в него рекомендуемое оптимизаторами количество ключевых слов, выделив их жирным шрифтом, разместите его на сайте, скрыв от пользователя (с помощью display:none, visibility:hidden или ДРУГИХ МЕТОДОВ. Для ускорения эффекта наложения фильтра, пожалуйтесь на свой сайт в службу поддержки поисковика.

Так, что если у вас лежит SEO текст задвинутым вашим методом, можете ждать блокировки. Или лучше не ждать я сразу пожаловаться.

Окна оповещения в JavaScript

Окна оповещения используются в случаях, когда необходимо, чтобы пользователь обязательно обратил внимание на определенную информацию.

Когда окно оповещения будет вызвано пользователь должен будет нажать кнопку «OK» для, того чтобы продолжить просмотр страницы.

Окна подтверждения в JavaScript

Окна подтверждения используются в случаях когда необходимо, чтобы пользователь подтвердил или отклонил что-либо.

Когда окно подтверждения будет вызвано пользователь должен будет нажать либо «OK», либо «Отмена», чтобы продолжить.

Если пользователь нажмет «OK» вернется true (истина), если пользователь нажмет «Отмена» вернется false (ложь).

Окна запроса в JavaScript

Окна запроса используются в случаях, когда от пользователя необходимо получить определенную информацию.

Когда окно запроса будет вызвано пользователь должен будет ввести определенные данные и нажать на «OK». Если пользователь не хочет вводить данные он может нажать «Отмена» и окно сразу будет закрыто.


Если пользователь введет что-либо в окно и нажмет «OK» будет возвращено введенное пользователем значение, если пользователь нажмет «Отмена», то будет возвращено null.

Сделайте сами

Задание 1. Исправьте ошибки в коде ниже (после нажатие на каждую из кнопок должно вызываться соответствующее окно).

Задание 2. Узнайте пароль и авторизируйтесь.

Вывод окон сообщений, запросов, предупреждений

Вывод сообщений в пользовательском режиме решает ряд задач:

  • отражение хода выполнения текущего процесса (показ стадии выполнения процесса; показ расчетных значений, полученных в ходе работы алгоритма);
  • выдача ошибок пользователю для возможного их исправления;
  • выдача рекомендаций;
  • терминирующие, которые останавливают выполнение программы и не дают продолжить ее, пока пользователь не ознакомится с этим сообщением и не выполнит определенные действия. Например, на экран пользователю будет выдан вопрос, на который нужно будет ответить Да или Нет. Пока пользователь не ответит – программа не выполняет дальнейшие действия;
  • ознакомительные сообщения, которые просто выводятся для пользователя и позволяют работать дальше (т.е. используются в режиме оповещения).

Терминирующими сообщениями должны быть сообщения об ошибках, а ознакомительными: рекомендации, сообщения о текущем этапе процесса и показ расчетных значений (отладочная печать).

Ознакомительные сообщения предназначены для того, чтобы выдать пользователю некоторую информацию.

Необходимо, чтобы пользователь с ней обязательно ознакомился и, возможно, предпринял какие-то действия, которые описаны в этом сообщении.

Очень важно, чтобы пользователь действительно читал эти сообщения, поэтому они должны содержать только важную информацию.

Тестовые и отладочные сообщения выдавать пользователю не стоит, т.к. рано или поздно он начнет игнорировать абсолютно все сообщения.

В концепции управляемого интерфейса несколько изменился подход к выдаче сообщения. Оно теперь привязано к форме, в которой возникло. Его уже нельзя закрыть так, чтобы текст было совсем невидно.

Открепить от формы окно с сообщением нельзя.

Т.е. первым параметром является сам текст.

Второй параметр (статус сообщения) является необязательным. Для статуса можно указывать значения: Обычное, Важное, ОченьВажное и т.д.

От данного значения зависит, какой значок будет расположен рядом с сообщением. Однако это работает только в обычном интерфейсе.

В концепции управляемого интерфейса значок всегда в виде восклицательного знака, переопределить его нельзя.

Дело в том, что если сообщение будет формироваться в момент записи элемента справочника, может произойти следующая ситуация.

Пользователь нажимает на кнопку Записать и закрыть, в этом случае сообщение выводится в соответствующее окно (справа формы).

Но форма моментально закрывается, и пользователь не увидит, что для него выводилась какая-то информация.

Поэтому в концепции управляемого приложения ознакомительные сообщения рекомендуется выводить с помощью так называемых оповещений. Пример неправильного использования функции Сообщить представлен на рисунке.

Тем не менее, функция Сообщить может использоваться для вывода информации о некоторых ошибках, например в момент проведения документа.

В этом случае системе можно сообщить, что форму закрывать не нужно, и показать пользователю, какие ошибки возникают при проведении документа.

Функция Сообщить полностью поддерживается в Платформе 8.3. Ее можно использовать, и она будет работать (и в файловом варианте, и в клиент-серверном).

Но также следует отметить, что у функции Сообщить есть дальнейшее развитие – это класс сообщения пользователю, который позволяет помимо того, что выводить сообщение, привязывать его контекстно к каким-либо элементам формы.

Например, сообщение об ошибке можно привязать к элементу формы, что для пользователя очень наглядно. Несколько позже к рассмотрению этого вопроса мы вернемся. У функции Сообщить есть интересная особенность.

Так, программный код в Платформе 8.3 может быть исполнен как на стороне Клиента, так и на стороне Сервера.

При этом клиентский программный код отвечает за взаимодействие с пользователем, т.е. на стороне клиента открываются формы, выводятся отчеты.

Различные диалоговые документы также отображаются только на клиенте. На сервере они не могут быть исполнены, поскольку сервер не имеет возможности взаимодействия с пользователями.

Но функция Сообщить может быть исполнена как на стороне Клиента, так и на стороне Сервера. При этом использование метода Сообщить на Сервере вовсе не означает, что сообщение будет выводиться именно на Сервере, там их просто некуда выводить.

Это означает, что если мы в серверной процедуре будем выводить сообщение с помощью этого метода, они будут накапливаться в некотором буфере и выведутся они на экран только тогда, когда серверная процедура закончится и произойдет возврат на Клиента.

Илон Маск рекомендует:  Заметки о разном

В этот момент система запросит данные из буфера и выведет их на экран.

Эта же особенность касается и класса СообщениеПользователю. На рисунке приведен пример использования метода Сообщить на стороне Сервера.

В результате использования метода Сообщить на стороне Сервера вывелись сообщения на экран на стороне Клиента.

Существует стандартное оповещение, возникающее в момент записи элементов справочников, документов. Это оповещение возникает в правом нижнем углу приложения и сообщает о совершенном действии.

В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет, и есть возможность внимательно его прочитать.

Кроме того, к оповещениям можно обратиться в соответствующей области информационной панели (кнопка История слева внизу формы приложения). Т.е. существует возможность узнать историю.

Таким образом, пользователь просто не сможет пропустить мимо себя это оповещение. Оно в любом случае возникнет в определенном месте экрана и будет привлекать внимание. Пользователь может оперативно реагировать на оповещения.

В отличие от сообщения, размеры окна оповещения не меняются, его сложно не увидеть.

Чтобы создавать свои собственные оповещения используется метод, который называется ПоказатьОповещениеПользователя.

В первом параметре передается текст, который будет выводиться в оповещении.

Далее (вторым параметром) можно передать некую навигационную ссылку на какой-либо элемент информационной базы (тот элемент, который соответствует тексту нашего сообщения).

С помощью третьего параметра можно передать некое пояснение для сообщения, т.е. какое-то расширенное описание.

И можно также присвоить картинку, отображающую какой-то статус оповещения.

Следует отметить, что все эти параметры являются необязательными для заполнения. Ниже приведен пример использования оповещения (в конфигураторе и в пользовательском режиме).

Таким образом, ознакомительные сообщения рекомендуется выводить с помощью оповещений.

Терминирующие сообщения – это те сообщения, которые не позволят работать, пока пользователь не произведет определенные действия, т.е. пока он не обработает сообщение.

О возможности использования терминирующих сообщений в Платформе 8.3 мы поговорим немного позже (в последнее время их стараются не использовать, поэтому рассмотренный пример больше касается Платформы 8.2).

Существуют два метода для выдачи терминирующих сообщений Предупреждение и Вопрос. Предупреждение отличается от Вопроса тем, что у него есть единственная кнопка ОК.

В вопросе могут определяться разные наборы вариантов ответов (ДаНет, ДаНетОтмена, ОК, ОКОтмена, ПовторитьОтмена, ПрерватьПовторитьПропустить), которые задаются с помощью параметра.

Выведем какое-нибудь предупреждение с помощью строки (например, в модуле управляемого приложения):

Чтобы открыть модуль управляемого приложения, следует в дереве конфигурации выбрать объект Конфигурация, вызвать контекстное меню и выбрать пункт Открыть модуль управляемого приложения.

В данном случае, при запуске приложения, будет выводиться окно, которое является модальным. Модальное окно перекрывает собой все окна, которые существуют в приложении. Пока мы не обработаем это окно, дальнейшие действия невозможны.

Аналогичным образом работает и функция Вопрос.

Обязательными являются только первые два параметра. Для второго параметра тип данных составной (РежимДиалогаВопрос или СписокЗначений). Третий параметр ( ) характеризует интервал времени в секундах, в течение которого система будет ожидать ответа пользователя.

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

В качестве примера использования функции Вопрос можно использовать следующий код, записанный в модуле управляемого приложения:

Обращаю Ваше внимание, что данные методы (Предупреждение и Вопрос) не доступны на Сервере. И это логично, потому что интерфейсные методы не могут быть выполнены на Сервере, где нет пользователя.

Особенности использования модальных окон в Платформе 8.3

В платформе 8.3 существуют режимы работы с использованием и без использования модальности. По умолчанию стоит настройка Не использовать режим модальности.

В этом случае использование терминирующих сообщений невозможно. В случае необходимости использования терминирующих сообщений (функции Предупреждение и Вопрос) следует изменить значение свойства конфигурации Режим использования модальности на Использовать.

Модальное окно выводится на самый верх и блокирует работу с другими окнами до завершения действий с модальным окном. Кроме того, останавливается выполнение программного кода на том месте, где происходит вызов этого окна. Выполнение кода продолжится только после закрытия модального окна.

Во-первых, проблемы по использованию модальных окон возникают для мобильного приложения. Во-вторых, в браузере модальность окон реализуется с помощью отдельных всплывающих окон.

В настройках браузера по умолчанию всплывающие окна зачастую запрещены. Пользователя приходится заставлять устанавливать разрешение на эти окна.

Браузеры для планшетных компьютеров и для телефонов в большинстве случаев вообще не поддерживают всплывающие окна.

Для замены функций Вопрос и Предупреждение разработаны новые методы: ПоказатьВопрос, ПоказатьПредупреждение.

Эти методы позволяют вызывать окно, но не останавливать выполнение программного кода. Технически это реализуется формированием псевдоокна внутри родительского окна. Псевдоокно не перекрывает родительское окно. После открытия такого окна код продолжает выполняться.

Получение и обработка введенных пользователем значений осуществляется в отдельной процедуре, которая вызывается при закрытии диалогового окна.

Синтаксис функции ПоказатьПредупреждение:

Тип данных: ОписаниеОповещения.

Содержит описание процедуры, которая будет вызвана после закрытия окна предупреждения.

Синтаксис функции ПоказатьВопрос:

Обязательными являются первые три параметра.

Ниже приведен пример использования функции.

Основное удобство класса сообщений СообщениеПользователю заключается в том, что это контекстное сообщение (в отличии от методов Предупреждение и Вопрос).

Сообщения могут быть привязаны к конкретному экранному элементу. Этот объект доступен и на Сервере.

Следует обратить внимание, что, во-первых, данный объект нужно создавать. Например: Сообщение = Новый СообщениеПользователю;

Таким образом мы создаем экземпляр данного объекта.

Во-вторых, нужно прописывать текст сообщения в отдельном свойстве.

В-третьих, в свойстве Поле можно указать, к какому элементу формы данное сообщение должно быть привязано.

Внимание! Для привязки к нужному полю формы обратите внимание на инициализацию свойств ПутьКДанным и КлючДанных. Применительно для документа при размещении кода в модуле объекта можно писать:

Сообщение.ПутьКДанным = «Объект»;
Сообщение.КлючДанных = ЭтотОбъект.Ссылка;

Чтобы открыть модуль документа, следует в окне редактирования объекта (документа) на закладке Прочее нажать на кнопку Модуль объекта.

Для эксперимента в модуле объекта какого-либо документа разместим код.

Ниже представлен полученный в пользовательском режиме результат для Платформы 8.3.

Следует отметить, что сообщения, выводимые с помощью нового объекта системы СообщениеПользователю в общем случае не являются терминирующими. Т.е. система позволит пользователю продолжить дальнейшие действия не отреагировав на выводимые сообщения.

Но, во-первых, данные сообщения достаточно заметны. Во-вторых, обычно сообщения пользователю выводятся в момент записи элементов справочников или проведения документов, т.е., когда выполняются какие-то проверки. И если были обнаружены ошибки, то пользователь увидит эти самые сообщения.

Соответственно, в момент обнаружения ошибок отменяется транзакция, т.е. запрещается запись элемента справочника, либо запрещается проведение документа.

Таким образом, происходит своего рода эмуляция терминирующего сообщения. Потому что действие отменяется, пока пользователь не отреагирует на вводимое сообщение, завершить действие, например, провести документ, будет нельзя.


Но, с другой стороны, есть возможность закрыть документ без проведения, никак не прореагировав на сообщение. Поэтому данные сообщения пользователю не являются терминирующими.

Уведомление о состоянии процесса

Существует специальная функция, с помощью которой можно отображать примерный ход выполнения какого-либо процесса.

Синтаксис:Состояние( , , , )
Параметры: и — не обязательные, тип – Строка.
Текст выводится на специальную панель состояния.
параметр тоже необязательный, но наглядный.
Тип: Число. Значение индикатора прогресса (от 1 до 100).
тоже необязательный параметр.
При обработке какого-либо события могут использоваться периодические вызовы функции типа:

При этом могут меняться надписи, а могут изменяться значения параметра Прогресс.

Функция может вызываться как из одной процедуры (функции), так и из нескольких. Таким образом можно отслеживать состояние выполнения процесса.

Вывод окон сообщений, запросов, предупреждений

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Работа с Диалогами в языке 1С 8.3, 8.2 (в примерах

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Как в 1С вывести сообщение пользователю (бесплатная статья по Программированию в 1С)
из цикла статей «Первые шаги в разработке на 1С»

О чем эта статья

Статья продолжает цикл статей «Первые шаги в разработке на 1С».

В ней мы рассмотрим способы информирования пользователя, которые присутствуют в платформе «1С:Предприятие» 8, а также акцентируем ваше внимание на некоторых особенностях работы этих механизмов, эти особенности связаны с режимом использования модальности.

Применимость

В статье рассматривается функциональность:

  • Интерфейса в варианте «Версии 8.2» для конфигурации, разработанной на платформе «1С:Предприятие» 8.2.19.130
  • Интерфейса «Такси» для конфигурации, разработанной на платформе «1С:Предприятие» 8.3.4.496 до 8.3.9+
  • Интерфейса «Такси» для конфигурации, разработанной на платформе «1С:Предприятие» 8.3.10-8.3.11

Как в 1С вывести сообщение пользователю

Вывод сообщений в пользовательском режиме решает ряд задач:

  • отражение хода выполнения текущего процесса (показ стадии выполнения процесса; показ расчетных значений, полученных в ходе работы алгоритма);
  • выдача ошибок пользователю для возможного их исправления;
  • выдача рекомендаций;
  • терминирующие, которые останавливают выполнение программы и не дают продолжить ее, пока пользователь не ознакомится с этим сообщением и не выполнит определенные действия. Например, на экран пользователю будет выдан вопрос, на который нужно будет ответить Да или Нет. Пока пользователь не ответит – программа не выполняет дальнейшие действия;
  • ознакомительные сообщения, которые просто выводятся для пользователя и позволяют работать дальше (т.е. используются в режиме оповещения).

Терминирующими сообщениями должны быть сообщения об ошибках, а ознакомительными: рекомендации, сообщения о текущем этапе процесса и показ расчетных значений (отладочная печать).

Ознакомительные сообщения

Ознакомительные сообщения предназначены для того, чтобы выдать пользователю некоторую информацию.

Необходимо, чтобы пользователь с ней обязательно ознакомился и, возможно, предпринял какие-то действия, которые описаны в этом сообщении.

Очень важно, чтобы пользователь действительно читал эти сообщения, поэтому они должны содержать только важную информацию.

Тестовые и отладочные сообщения выдавать пользователю не стоит, т.к. рано или поздно он начнет игнорировать абсолютно все сообщения.

В концепции управляемого интерфейса несколько изменился подход к выдаче сообщения. Оно теперь привязано к форме, в которой возникло. Его уже нельзя закрыть так, чтобы текст было совсем невидно.

Открепить от формы окно с сообщением нельзя.

Т.е. первым параметром является сам текст.

Второй параметр (статус сообщения) является необязательным. Для статуса можно указывать значения: Обычное, Важное, ОченьВажное и т.д.

От данного значения зависит, какой значок будет расположен рядом с сообщением. Однако это работает только в обычном интерфейсе.

В концепции управляемого интерфейса значок всегда в виде восклицательного знака, переопределить его нельзя.

Дело в том, что если сообщение будет формироваться в момент записи элемента справочника, может произойти следующая ситуация.

Пользователь нажимает на кнопку Записать и закрыть, в этом случае сообщение выводится в соответствующее окно (справа формы).

Но форма моментально закрывается, и пользователь не увидит, что для него выводилась какая-то информация.

Поэтому в концепции управляемого приложения ознакомительные сообщения рекомендуется выводить с помощью так называемых оповещений. Пример неправильного использования функции Сообщить представлен на рисунке.

Тем не менее, функция Сообщить может использоваться для вывода информации о некоторых ошибках, например в момент проведения документа.

В этом случае системе можно сообщить, что форму закрывать не нужно, и показать пользователю, какие ошибки возникают при проведении документа.

Функция Сообщить полностью поддерживается в Платформе 8.3. Ее можно использовать, и она будет работать (и в файловом варианте, и в клиент-серверном).

Но также следует отметить, что у функции Сообщить есть дальнейшее развитие – это класс сообщения пользователю, который позволяет помимо того, что выводить сообщение, привязывать его контекстно к каким-либо элементам формы.

Например, сообщение об ошибке можно привязать к элементу формы, что для пользователя очень наглядно. Несколько позже к рассмотрению этого вопроса мы вернемся. У функции Сообщить есть интересная особенность.

Так, программный код в Платформе 8.3 может быть исполнен как на стороне Клиента, так и на стороне Сервера.

При этом клиентский программный код отвечает за взаимодействие с пользователем, т.е. на стороне клиента открываются формы, выводятся отчеты.

Различные диалоговые документы также отображаются только на клиенте. На сервере они не могут быть исполнены, поскольку сервер не имеет возможности взаимодействия с пользователями.

Но функция Сообщить может быть исполнена как на стороне Клиента, так и на стороне Сервера. При этом использование метода Сообщить на Сервере вовсе не означает, что сообщение будет выводиться именно на Сервере, там их просто некуда выводить.

Это означает, что если мы в серверной процедуре будем выводить сообщение с помощью этого метода, они будут накапливаться в некотором буфере и выведутся они на экран только тогда, когда серверная процедура закончится и произойдет возврат на Клиента.

В этот момент система запросит данные из буфера и выведет их на экран.

Эта же особенность касается и класса СообщениеПользователю. На рисунке приведен пример использования метода Сообщить на стороне Сервера.

В результате использования метода Сообщить на стороне Сервера вывелись сообщения на экран на стороне Клиента.

Механизм оповещений

Механизм оповещений нужен, чтобы информировать пользователя о том, что в системе “что-то” произошло и это “что-то” требует внимания пользователя. Оповещения создаются двумя сценариями:

  1. Самой платформой при интерактивной записи или изменении объекта
  2. Разработчиком при вызове в коде метода ПоказатьОповещениеПользователя().

Само оповещение представляет собой небольшое окошко, которое появляется, как правило, в нижнем правом углу и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет и можно внимательно его прочитать.

Кроме того, к оповещениям можно обратиться в соответствующей области информационной панели (кнопка “История” слева внизу формы приложения в варианте интерфейса «Версии 8.2»).

Чтобы создавать свои собственные оповещения, необходимо использовать метод глобального контекста ПоказатьОповещениеПользователя(). Его синтаксис до редакции 8.3.10 представлен ниже:

В первом параметре передается текст, который будет выводиться в оповещении.

Далее вторым параметром можно передать некую навигационную ссылку на какой-либо элемент информационной базы (тот элемент, который соответствует тексту нашего сообщения). При нажатии пользователем на оповещение будет выполнен переход по этой ссылке.

С помощью третьего параметра можно передать пояснение для сообщения, т.е. какое-то расширенное описание.

Также можно присвоить картинку, отображающую статус оповещения.

Следует отметить, что все эти параметры являются необязательными для заполнения. Ниже приведен пример использования данного метода (в конфигураторе и в пользовательском режиме в варианте интерфейса «Версии 8.2»).

В редакции платформы 8.3.10.216 для интерфейса в варианте «Такси» механизм оповещений был существенным образом доработан с целью повышения удобства работы как в тонком, так и в веб-клиенте. По этой причине изменились и передаваемые параметры в метод ПоказатьОповещениеПользователя(). Теперь синтаксис выглядят так:

Видно, что второй параметр, ранее называемый НавигационнаяСсылка, получил новое имя ДействиеПриНажатии. Это связано с тем, что теперь в него стало возможным передавать не только строку с навигационной ссылкой, но и описание оповещения. Это проиллюстрировано скриншотом ниже:

Как видно из примера, у нас появилась возможность программным образом обрабатывать нажатие на окно с оповещением, согласно той логике, которая необходима.

Следующий параметр СтатусОповещенияПользователя появился впервые. В нем указывается статус оповещения (Информация или Важное).

В случае варианта Важное, если пользователь не отреагировал на сообщение, то после того, как оно будет скрыто с экрана, его можно будет прочитать через Центр оповещений (о нем ниже). В случае же варианта Информация, оповещение удаляется без запоминания в этом центре. Давайте перепишем код из нашего примера, как показано ниже:

После выполнения команды получим приблизительно такой вид окна приложения:

В панели инструментов появилась кнопка с пиктограммой звонка, по которой вызывается упомянутый выше Центр оповещений. В нем накапливаются новые важные оповещения, на которые пользователь пока никак не отреагировал.

Если в Центре есть какие-то оповещения, то рядом с ним появляется маленькая оранжевая точка, чтобы привлечь внимание пользователя. Пользователь может открыть Центр оповещений, прочитать текст и, если необходимо, выполнить какие-то действия.

Из Центра оповещение убирается нажатием на кнопку очистки, однако если с оповещением связано какое-то действие, то, как только пользователь щелкнет мышью по тексту сообщения, оно тоже пропадет.

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

Как видим, возможностей, предоставляемых соответствующим методом, стало еще больше! Но это не все изменения в механизме оповещений.

Как вы уже, наверное, успели заметить, изменился их внешний вид. Теперь оповещения выглядят более современно и эргономично, но их нельзя перемещать по экрану и изменять их размер. Обратите внимание, в нашем примере, текст оповещения попросту не поместился целиком в самом окне, и прочитать его полностью пользователь сможет, только открыв Центр Оповещений. Поэтому не стоит в текст оповещения писать большое количество текста.

Также к новым возможностям относится и одновременное отображение на экране до трех оповещений.

На этом завершим наше знакомство с программным формированием оповещений. Однако вспомним, что оповещения формируются не только разработчиком программно, но и самой платформой в момент интерактивной записи или изменения объекта. И часто этот факт вызывает непонимание в первую очередь у начинающих пользователей: зачем нужны эти служебные оповещения, которые, кстати, нельзя отключить?

Давайте представим такую простую ситуацию: пользователь установил фильтр в каком-то списке для удобства. Допустим, он сделал это в форме списка справочника Номенклатуры. Потом, через какое-то время, решил ввести новый элемент с наименованием “Стул”, который не соответствует установленному ранее фильтру. Вводит его, записывает и…? И не видит его в списке. Что будет делать среднестатистический пользователь? Конечно, введет его второй раз, но опять не увидит. Дальше может последовать третий, четвертый, пятый раз. Когда ему надоест вводить одно и тоже, он, наконец, спросит у вас: а куда все пропадает?

Вот именно поэтому платформа и отображает эти служебные оповещения, информируя пользователя о том, что его действие выполнено. В нашем примере в момент интерактивной записи пользователь увидит следующее оповещение:

Терминирующие сообщения

Терминирующие сообщения – это те сообщения, которые не позволят работать, пока пользователь не произведет определенные действия, т.е. пока он не обработает сообщение.

О возможности использования терминирующих сообщений в Платформе 8.3 мы поговорим немного позже (в последнее время их стараются не использовать, поэтому рассмотренный пример больше касается Платформы 8.2).

Существуют два метода для выдачи терминирующих сообщений Предупреждение и Вопрос. Предупреждение отличается от Вопроса тем, что у него есть единственная кнопка ОК.

В вопросе могут определяться разные наборы вариантов ответов (ДаНет, ДаНетОтмена, ОК, ОКОтмена, ПовторитьОтмена, ПрерватьПовторитьПропустить), которые задаются с помощью параметра.

Выведем какое-нибудь предупреждение с помощью строки (например, в модуле управляемого приложения):

Предупреждение(“Сейчас будет открыта база”);


Чтобы открыть модуль управляемого приложения, следует в дереве конфигурации выбрать объект Конфигурация, вызвать контекстное меню и выбрать пункт Открыть модуль управляемого приложения.

В данном случае, при запуске приложения, будет выводиться окно, которое является модальным. Модальное окно перекрывает собой все окна, которые существуют в приложении. Пока мы не обработаем это окно, дальнейшие действия невозможны.

Аналогичным образом работает и функция Вопрос.

Обязательными являются только первые два параметра. Для второго параметра тип данных составной (РежимДиалогаВопрос или СписокЗначений). Третий параметр ( ) характеризует интервал времени в секундах, в течение которого система будет ожидать ответа пользователя.

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

В качестве примера использования функции Вопрос можно использовать следующий код, записанный в модуле управляемого приложения:

Обращаю Ваше внимание, что данные методы (Предупреждение и Вопрос) не доступны на Сервере. И это логично, потому что интерфейсные методы не могут быть выполнены на Сервере, где нет пользователя.

Особенности использования модальных окон в Платформе 8.3

В платформе 8.3 существуют режимы работы с использованием и без использования модальности. По умолчанию стоит настройка Не использовать режим модальности.

В этом случае использование терминирующих сообщений невозможно. В случае необходимости использования терминирующих сообщений (функции Предупреждение и Вопрос) следует изменить значение свойства конфигурации Режим использования модальности на Использовать.

Модальное окно выводится на самый верх и блокирует работу с другими окнами до завершения действий с модальным окном. Кроме того, останавливается выполнение программного кода на том месте, где происходит вызов этого окна. Выполнение кода продолжится только после закрытия модального окна.

Во-первых, проблемы по использованию модальных окон возникают для мобильного приложения. Во-вторых, в браузере модальность окон реализуется с помощью отдельных всплывающих окон.

В настройках браузера по умолчанию всплывающие окна зачастую запрещены. Пользователя приходится заставлять устанавливать разрешение на эти окна.

Браузеры для планшетных компьютеров и для телефонов в большинстве случаев вообще не поддерживают всплывающие окна.

Для замены функций Вопрос и Предупреждение разработаны новые методы: ПоказатьВопрос, ПоказатьПредупреждение.

Эти методы позволяют вызывать окно, но не останавливать выполнение программного кода. Технически это реализуется формированием псевдоокна внутри родительского окна. Псевдоокно не перекрывает родительское окно. После открытия такого окна код продолжает выполняться.

Получение и обработка введенных пользователем значений осуществляется в отдельной процедуре, которая вызывается при закрытии диалогового окна.

Синтаксис функции ПоказатьПредупреждение:

Тип данных: ОписаниеОповещения.

Содержит описание процедуры, которая будет вызвана после закрытия окна предупреждения.

Синтаксис функции ПоказатьВопрос:

Обязательными являются первые три параметра.

Ниже приведен пример использования функции.

Класс СообщениеПользователю

Основное удобство класса сообщений СообщениеПользователю заключается в том, что это контекстное сообщение (в отличии от методов Предупреждение и Вопрос).

Сообщения могут быть привязаны к конкретному экранному элементу. Этот объект доступен и на Сервере.

Следует обратить внимание, что, во-первых, данный объект нужно создавать. Например: Сообщение = Новый СообщениеПользователю;

Таким образом мы создаем экземпляр данного объекта.

Во-вторых, нужно прописывать текст сообщения в отдельном свойстве.

В-третьих, в свойстве Поле можно указать, к какому элементу формы данное сообщение должно быть привязано.

Внимание! Для привязки к нужному полю формы обратите внимание на инициализацию свойств ПутьКДанным и КлючДанных. Применительно для документа при размещении кода в модуле объекта можно писать:

Сообщение.ПутьКДанным = “Объект”;
Сообщение.КлючДанных = ЭтотОбъект.Ссылка;

Чтобы открыть модуль документа, следует в окне редактирования объекта (документа) на закладке Прочее нажать на кнопку Модуль объекта.

Для эксперимента в модуле объекта какого-либо документа разместим код.

Ниже представлен полученный в пользовательском режиме результат для Платформы 8.3.

Следует отметить, что сообщения, выводимые с помощью нового объекта системы СообщениеПользователю в общем случае не являются терминирующими. Т.е. система позволит пользователю продолжить дальнейшие действия не отреагировав на выводимые сообщения.

Но, во-первых, данные сообщения достаточно заметны. Во-вторых, обычно сообщения пользователю выводятся в момент записи элементов справочников или проведения документов, т.е., когда выполняются какие-то проверки. И если были обнаружены ошибки, то пользователь увидит эти самые сообщения.

Соответственно, в момент обнаружения ошибок отменяется транзакция, т.е. запрещается запись элемента справочника, либо запрещается проведение документа.

Таким образом, происходит своего рода эмуляция терминирующего сообщения. Потому что действие отменяется, пока пользователь не отреагирует на вводимое сообщение, завершить действие, например, провести документ, будет нельзя.

Но, с другой стороны, есть возможность закрыть документ без проведения, никак не прореагировав на сообщение. Поэтому данные сообщения пользователю не являются терминирующими.

Уведомление о состоянии процесса

Существует специальная функция, с помощью которой можно отображать примерный ход выполнения какого-либо процесса.

Синтаксис: Состояние( , , , )
Параметры: и – не обязательные, тип – Строка.
Текст выводится на специальную панель состояния.
параметр тоже необязательный, но наглядный.
Тип: Число. Значение индикатора прогресса (от 1 до 100).
тоже необязательный параметр.
При обработке какого-либо события могут использоваться периодические вызовы функции типа:

При этом могут меняться надписи, а могут изменяться значения параметра Прогресс.

Функция может вызываться как из одной процедуры (функции), так и из нескольких. Таким образом можно отслеживать состояние выполнения процесса.

Если вы хотите ознакомиться с механизмом уведомления более подробно, то прямо сейчас прервитесь и прочтите нашу новую статью Отображение прогресса длительных операций в 8.3.10. В ней уже не на уровне новичка объясняются все тонкости и подводные камни работы этого механизма.

Мы же завершаем знакомство со способами информирования пользователя. Надеемся, что у вас сложилось понимание, в каких ситуациях следует применять тот или иной способ.

Хочется еще раз акцентировать ваше внимание на том факте, что если ваша конфигурация (версии 8.3.3+) предполагает работу с помощью веб-клиента, то:

  • на уровне конфигурации должна быть установлена настройка режима модальности «Не использовать»
  • в коде должны использоваться методы асинхронной модели взаимодействия с пользователем. Такие методы начинаются со слов Показать или Начать.

Более подробно об отказе от использования модальных окон в платформе 1С:Предприятие 8.3 можно почитать в финальной статье цикла. А мы идем дальше и, наконец, приступаем к изучению долгожданного интерфейса «Такси», который уже не раз упоминался в наших материалах.

PDF-версия статьи для участников группы ВКонтакте

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Статья в PDF-формате

Вы можете скачать эту статью в формате PDF по следующей ссылке:
Ссылка доступна для зарегистрированных пользователей)

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

16 комментариев для “ Как в 1С вывести сообщение пользователю (бесплатная статья по Программированию в 1С)
из цикла статей «Первые шаги в разработке на 1С» ”

Немного не в тему, но про сообщения. Есть ли возможность отправить сообщения активным пользователям в УПП 1.3 на платформе 8.2? Может какие обработки есть?

Вывод окон сообщений, запросов, предупреждений

В программах на платформе 1С:Предприятие сообщение пользователю можно показать разными способами.

1. Метод ПоказатьПредупреждение .

При использовании этой конструкции окно с предупреждением возникает в центре интерфейса программы.

ОписаниеОповещенияОЗавершении (необязательный)
Тип: ОписаниеОповещения. Содержит описание процедуры, которая будет вызвана после закрытия окна предупреждения со следующими параметрами: ДополнительныеПараметры — значение, которое было указано при создании объекта ОписаниеОповещения. Если параметр не указан, то по завершении никакая процедура вызвана не будет.

ТекстПредупреждения (обязательный)
Тип: Строка; ФорматированнаяСтрока. Текст предупреждения.

Таймаут (необязательный)
Тип: Число. Интервал времени в секундах, в течение которого система будет ожидать ответа пользователя. По истечении интервала окно предупреждения будет закрыто. Если параметр не указан, то время ожидания не ограничено. Если параметр имеет отрицательное значение, будет сгенерировано исключение. Значение по умолчанию: 0.

Заголовок (необязательный)
Тип: Строка. Содержит заголовок окна предупреждения. Описание: Выводит на экран окно предупреждения, но не ожидает его закрытия.

Доступность: Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).

Примечание: Если после закрытия пользователем окна предупреждения должен быть выполнен какой-либо код, то его нужно разместить в отдельной процедуре модуля и описать ее в параметре.

2. Метод Предупреждение .

Окно с предупреждением возникает в центре интерфейса программы. Однако, если для конфигурации свойство РежимИспользованияМодальности установлено в НеИспользовать , то метод не работает.

Доступность: Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение(клиент).

3. Метод ПоказатьОповещениеПользователя .

При использовании этого метода сообщение появляется в правом нижнем углу интерфейса.

Доступность: Тонкий клиент, веб-клиент, толстый клиент.

4. Метод Сообщить .

Сообщение появляется в нижней части интерфейса, в строке.

Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

5. Объект СообщениеПользователю .

Предназначен для хранения параметров сообщения, которые необходимо вывести пользователю. Если сообщение еще не было показано пользователю (такое может быть при работе на стороне сервера, в фоновом задании, внешнем соединении или Web-сервисах), можно получить накопленные сообщения методом ПолучитьСообщенияПользователю .

Свойства: ИдентификаторНазначения (Target >КлючДанных (DataKey); Поле (Field); ПутьКДанным (DataPath); Текст (Text).

Методы: Сообщить (Message); УстановитьДанные (SetData).

Сообщение появляется в нижней части интерфейса, в строке.

Разработка конфигураций в режиме без использования модальности

1С:Предприятие использует модальные окна в тех ситуациях, когда от пользователя требуется ввод информации, без которой невозможно дальнейшее выполнение алгоритма. При этом полностью блокируется весь остальной интерфейс программы, а исполнение программного кода останавливается до тех пор, пока пользователь не закроет модальное окно. С появлением веб-клиента и с переходом 1С:Предприятия на мобильные платформы, модальные окна оказались источником большого количества неудобств и проблем, зачастую неразрешимых.

Как правило «десктопные» браузеры лучше или хуже, но поддерживают модальные окна и открывают их в новом окне браузера как «всплывающее окно». Но из-за того, что технология всплывающих окон массово используется в Интернете для размещения рекламы, практически во всех браузерах стандартно отключен показ всплывающих окон. В подавляющем большинстве случаев без изменения этой настройки браузера работа веб-клиента становится невозможной.

Другая проблема заключается в том, что мобильные браузеры вообще не поддерживают модальные окна.

В такой ситуации вариант работы интерфейса 1С:Предприятия без использования модальных окон снимает все перечисленные выше проблемы. При этом не происходит отказа от функциональности, которая обеспечивалась ранее модальными окнами. Но эта функциональность реализуется другими технологиями, которые не препятствуют работе 1С:Предприятия в браузерах. В новом режиме работы интерфейса окно, которое раньше было бы модальным, рисуется в пределах родительского окна, и точно так же блокирует весь остальной интерфейс веб-клиента. В результате:

  • Не происходит открытия новых окон браузера, что повышает производительность и стабильность веб-клиента;
  • Во многих случаях дополнительная настройка браузера становится ненужной, так как 1С:Предприятие больше не использует всплывающие окна;
  • Любая конфигурация, используя веб-клиент, может работать на iPad.

Когда надо отказываться от модальности

Не нужно «бросать всё» и начинать отказываться от модальности. Есть несколько случаев, когда можно продолжать работать в модальном режиме.

Во-первых, не любая версия технологической платформы поддерживает режим работы интерфейса без использования модальности. Этот режим работы существует, начиная с версии 8.3.3.721 (06.09.2013). Поэтому, если вы работаете на младших версиях платформы, можете пока не озадачиваться отказом от модальности.

Во-вторых, не все прикладные решения в обязательном порядке должны использовать этот режим. Критичными являются приложения, работа с которыми будет вестись:


  • На iPad;
  • В режиме сервиса (например, они будут размещаться на 1cfresh.com);
  • С помощью веб-клиента.

Если ваше прикладное решение заведомо не будет использоваться в этих режимах, вы можете пока не отказываться от модальности.

Однако все типовые решения 1С разрабатывает исходя из того, что они могут использоваться любым из доступных способов. Поэтому в них основным режимом работы интерфейса является режим без использования модальности. В этом режиме будут работать новые прикладные решения. На этот режим будут переводиться старые прикладные решения. А значит, этот режим работы вам лучше начать осваивать уже сейчас. Даже если ваше приложение пока может его не использовать, мы рекомендуем, по возможности, начать перевод уже сейчас. Потому что в будущем этот режим работы будет единственным.

Сравнение модального и немодального режимов работы

Следует сказать, что отказ от модальности — это вещь не простая. Она является существенным поворотом в сторону асинхронной модели работы клиентского приложения. Не все сценарии, использующие на данный момент модальные окна, могут быть легко переведены на использование блокирующих окон.

Существенное количество сценариев работы может потребовать не просто замены одних методов встроенного языка другими, а изменения самого подхода к проектированию юзабилити интерфейса прикладного решения. Проще говоря, прежде чем пытаться переделать модальный диалог, стоит подумать, а можно ли здесь вообще обойтись без него?

Подробнее об этом мы поговорим позже, а для начала разберемся, в чём же заключаются принципиальные отличия этих двух режимов работы интерфейса. Понять разницу модального и немодального режимов работы проще всего на небольшом примере. Старая процедура, открывавшая модальное окно и обрабатывавшая полученные им данные, могла выглядеть так:

Метод Вопрос() открывает модальное окно. В момент исполнения этого метода дальнейшее исполнение программного кода останавливается, модальное окно блокирует весь интерфейс и ожидает реакции пользователя.

После того, как пользователь нажимает одну из кнопок, например «Да» , исполнение кода продолжается, а модальное окно исчезает и пользователю снова становится доступен весь интерфейс:

В этом примере выводятся два тестовых сообщения и на картинке видно, что оба сообщения появляются на экране только после того, как модальное окно исчезнет.

Таким образом можно сказать, что старый режим работы обеспечивает модальность как для разработчика (останавливается исполнение кода), так и для пользователя (блокируется интерфейс, доступно только модальное окно).

Новый режим работы интерфейса обеспечивает модальность лишь для пользователя. Для разработчика, в момент отображения блокирующего окна, исполнение программного кода не останавливается. Чтобы увидеть это рассмотрим не совсем корректный пример:

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

После того, как пользователь нажмёт одну из кнопок, например «Да» , начнётся исполнение другой процедуры. Той, которая была назначена в качестве обработчика оповещения при вызове метода ПоказатьВопрос() :

В этом примере мы специально допустили ошибку. Но благодаря ей мы можем увидеть обе важные особенности.

Во-первых, алгоритм, который раньше являлся одним целым, теперь нужно разделять на две части. Одна часть открывает блокирующее окно. Вторая часть обрабатывает реакцию пользователя в блокирующем окне. Чтобы система знала, с какого места продолжать исполнение программного кода, блокирующему окну передаётся имя процедуры, которая должна быть выполнена тогда, когда пользователь закроет это окно.

Во-вторых, после оператора, открывающего блокирующее окно, не должно содержаться исполняемого кода. Иначе этот код будет выполнен, не дожидаясь реакции пользователя.

Поэтому правильным решением является перенос всего кода в процедуру, исполняемую после закрытия блокирующего окна:

Тут нужно оговориться, и мы это видели на примере, что нет запрета на то, чтобы после оператора, открывающего блокирующее окно, содержался какой-либо исполняемый код. Но вы должны понимать, что платформа выполнит этот код без остановки. Независимо от того, что введёт пользователь в блокирующем окне, или когда он это окно закроет. Если такое поведение не противоречит логике вашего прикладного решения, то пожалуйста, можно использовать этот вариант.

Механизмы платформы для отказа от модальности

Этот раздел носит, скорее, «энциклопедический» характер. Он будет полезен тем, кто хочет в полной мере познакомиться со всеми механизмами платформы, которые появились для обеспечения немодального режима работы.

Если же вам не терпится приступить к «активным действиям», то вы можете перейти сразу к одному из следующих разделов:

  • Как писать новые конфигурации — для тех, кто сразу хочет создавать конфигурацию, работающую в режиме без использования модальности;
  • Как переделывать старые конфигурации — для тех, кто хочет перевести имеющуюся конфигурацию в режим работы без использования модальности.

Итак, возвращаясь к механизмам платформы нужно сказать, что по большому счёту они делятся на две большие группы. Механизмы, которые обеспечивают работу в немодальном режиме и механизмы, помогающие перейти в этот режим. Основная часть этих механизмов появилась в платформе начиная с версии 8.3.3.721 (06.09.2013), а в версии 8.3.5 в неё были добавлены инструменты рефакторинга, облегчающие преобразование имеющихся конфигураций. Перечислим все эти механизмы по-порядку.

Новый режим интерфейса

У конфигурации появилось новое свойство — » Режим использования модальности» . Именно оно и определяет, в каком режиме работает конфигурация:

  • «Не использовать» — это новый, немодальный режим работы. Для новых конфигураций это стандартный режим;
  • «Использовать с предупреждением» — этот режим предназначен для разработчика. Он не препятствует использованию модальных окон, но каждый раз, когда открывается модальное окно, выдаёт предупреждающее сообщение. Пример использования этого режима есть в разделе Поиск модальных методов — В режиме 1С:Предприятие;
  • » Использовать» — режим, обеспечивающий совместимость новой версии платформы со старыми конфигурациями, работающими в модальном режиме.

Новый режим открытия окна формы

У свойства формы РежимОткрытияОкна появилось новое значение — БлокироватьВесьИнтерфейс . Именно это значение теперь следует использовать для того, чтобы из всего интерфейса пользователю была бы доступна только одна открытая форма. Пример использования этого свойства есть в разделе Как открыть произвольную форму в блокирующем режиме.

Немодальные аналоги модальных методов

Некоторые методы встроенного языка открывают модальные окна. Для этих методов в платформе были созданы «методы-дублёры», которые обладают той же функциональностью, но используют блокирующие окна. Например, старый метод Вопрос() и новый «метод-дублёр» ПоказатьВопрос() . Полный список этих методов можно посмотреть в документации Руководство разработчика, Приложение 13. Соответствие синхронных методов асинхронным аналогам.

Кроме документации метод-дублёр можно посмотреть и в синтакс-помощнике. Для каждого старого метода они указаны.

Пример использования этих методов есть, например, в разделе Вопрос в модуле команды, формы или в общем модуле.

Новый синтаксис метода ОткрытьФорму()

Для того чтобы открывать форму в блокирующем режиме, метод-дублёр создавать не стали. Потому что уже и так существовало два метода: ОткрытьФормуМодально() и ОткрытьФорму() . Поэтому в привычный метод ОткрытьФорму() добавили несколько новых параметров: ОписаниеОповещенияОЗакрытии и РежимОткрытияОкна .

Они позволяют сразу передать форме нужное описание оповещения и указать новый режим открытия окна. Пример можно посмотреть в разделе Как поступить, если форму нужно открывать то в обычном, то в блокирующем режиме.

Объект встроенного языка ОписаниеОповещения

Назначение этого объекта — указать точку конфигурации, с которой должно быть продолжено исполнение кода после того, как пользователь закроет блокирующее окно. Этот объект содержит имя экспортируемой процедуры, которая начнёт выполняться, а также указание на модуль, в котором находится эта процедура.

Если процедура находится в том же модуле, в котором создаётся описание оповещения, то для указания на этот модуль используется значение ЭтотОбъект . Это новое свойство, реализованное для управляемой формы, команды командного интерфейса и общего модуля. Именно в этих модулях может находиться процедура обработки оповещения. Пример есть в разделе Вопрос в модуле команды, формы или в общем модуле.

Иногда возникает необходимость разместить обработчик оповещения не в том модуле, в котором создаётся описание оповещения, а в другом, например, в общем модуле. В таком случае вместо ЭтотОбъект можно указать имя общего модуля. Пример можно посмотреть в разделе Вопрос в модуле управляемого приложения.

Кроме этих параметров описание оповещения может содержать структуру с произвольными данными. Передача этих данных в обработчик оповещения может понадобиться для того, чтобы алгоритм, выполняемый после реакции пользователя, мог использовать значения, вычисленные перед открытием блокирующего окна. Такой пример можно посмотреть в разделе Как передать дополнительную информацию в форму, открываемую в блокирующем режиме.

Свойство формы ОписаниеОповещенияОЗакрытии

У формы появилось новое свойство — ОписаниеОповещенияОЗакрытии . В него передаётся то описание оповещения, которое мы указываем в методе ОткрытьФорму() . После закрытия формы исполнение кода продолжается с процедуры, указанной в этом описании оповещения.

Метод ВыполнитьОбработкуОповещения()

Этот метод используется для того, чтобы выполнить процедуру обработчика оповещения. Чтобы указать на этот обработчик, в метод передаётся описание оповещения.

Этот метод требуется в сложных «многоуровневых» алгоритмах асинхронных вызовов, т.к. описание оповещения может быть сконструировано в начале алгоритма, а реальное использование этого обработчика может понадобиться через несколько вложенных процедур. Такой пример можно посмотреть в разделе Вопрос во вложенной процедуре, после которой есть код.

Поиск модальных методов в режиме расширенной проверки конфигурации

В механизме проверки конфигурации реализован новый режим расширенной проверки «Поиск использования модальности» . Он позволяет найти те фрагменты кода, которые приводят к открытию модальных окон. Пример можно посмотреть в разделе Проверка конфигурации в режиме Конфигуратор.

Из командной строки эта проверка выполняется с помощью параметра -CheckUseModality ключа командной строки запуска ExtendedModulesCheck .

Инструменты для полуавтоматического перевода конфигураций в режим без использования модальности

Эти инструменты реализованы в платформе начиная с версии 8.3.5. Они собраны в меню «Конфигурация — Рефакторинг» и » Текст — Рефакторинг — Модальные вызовы» . С помощью этих инструментов можно частично автоматически, а частично с применением «ручного труда» перевести существующую конфигурацию в немодальный режим работы. Примеры использования этих инструментов можно посмотреть в разделах Автоматическое преобразование модальных методов и Ручное преобразование конструкций, которые невозможно преобразовать автоматически.

Как писать новые конфигурации

Общие замечания

Если вы создаёте новую конфигурацию и хотите, чтобы она не использовала модальный режим, нужно придерживаться нескольких простых советов.

Во-первых, о свойствах самой конфигурации беспокоиться не надо. Режим без использования модальности является стандартным для новых конфигураций. Поэтому после создания новой информационной базы с пустой конфигурацией её свойство «Режим использования модальности» будет установлено в значение «Не использовать» .

Во-вторых, прежде чем использовать блокирующие окна, или методы, открывающие диалоги в блокирующем режиме, следует подумать, есть ли в них необходимость. Если логика работы позволяет обойтись без блокирующего диалога — лучше не использовать его. Более того, в целом ряде случаев ради этого полезно изменить алгоритм или какие-то интерфейсные решения. Потому что это может быть проще, понятнее и надёжнее, чем пытаться реализовать «именно такой» сценарий работы в асинхронной модели работы интерфейса.

Как мы уже говорили ранее, не все сценарии работы могут быть легко и просто переведены на использование блокирующих диалогов. Если нельзя отказаться от использования блокирующих диалогов, то в новых конфигурациях имеет смысл заранее продумывать разделение кода, требующего действий пользователя, и кода, реализующего прикладную логику. И стараться их не смешивать. Например, сначала выполнить все интерактивные действия, «пообщаться» с пользователем, а после этого выполнить прикладной алгоритм «без вопросов».

В-третьих, если вы всё же решили использовать блокирующие диалоги, то вместо старых, модальных методов, следует использовать их новые немодальные аналоги. Обычно (но не всегда) немодальные аналоги начинаются со слова «Показать». В синтакс-помощнике для каждого старого модального метода указан его блокирующий аналог. А полный список соответствия всех методов можно посмотреть в документации.

В-четвёртых, чтобы открыть форму в блокирующем режиме вместо метода ОткрытьФормуМодально() нужно использовать метод ОткрытьФорму() , но с новым синтаксисом. Новый синтаксис позволяет указать ОписаниеОповещения и режим открытия окна.

В-пятых, если форма всегда будет открываться только в блокирующем режиме, в конфигураторе нужно установить её свойство РежимОткрытияОкна в значение «Блокировать весь интерфейс «.

Здесь надо сделать следующее замечание. Используя » Блокировать весь интерфейс » мы полностью моделируем для пользователя старое, модальное поведение. Но дело в том, что модальные окна, являясь элементами синхронной (блокирующей) модели, не очень хорошо сочетаются с природой веб-приложений, которые в большинстве своём построены на асинхронной модели. То есть веб-приложения не блокируют действия пользователя, если на это нет совсем крайней необходимости.

Поэтому если мы хотим, а мы хотим, двигаться в сторону веб-приложений, то вместо «Блокировать весь интерфейс» лучше использовать » Блокировать окно владельца» . Тогда окно владельца будет заблокировано, но остальной интерфейс прикладного решения для пользователя будет доступен.

В некоторых сценариях это может быть полезно. Например для того, чтобы выполнить действия, препятствующие дальнейшей работе длительной обработки. Через 30 минут её работы выяснилось, что не все нужные документы проведены. Тогда пользователь может провести документы, а потом вернуться к прерванной обработке. Не запуская её с самого начала.

В некоторых ситуациях это может быть вредно. Потому что пользователь может «потерять фокус», начать «гулять» по интерфейсу, зайти далеко и потом долго искать ту форму, на которой был задан вопрос.

Однозначно хорошего совета тут дать нельзя. Но все же, прежде чем использовать » Блокировать весь интерфейс» в каждом конкретном случае желательно проанализировать возможность использования значения «Блокировать окно владельца» . Потому что оно больше подходит к формату веб-приложений.

В-шестых, так как указывать ОписаниеОповещения нужно во всех методах, использующих блокирующие окна, в конфигураторе есть возможность автоматизировать эту работу (начиная с версии 8.3.5). Достаточно написать имя метода и открывающую скобку. А после этого из контекстного меню вызвать команду «Рефакторинг — Создать обработку оповещения» :

В результате платформа создаст конструктор и процедуру, обрабатывающую оповещение:

Типичные примеры

Далее мы разберём несколько типичных примеров использования немодальных вызовов. Эти примеры помогут вам разобраться в новых подходах к написанию кода и построению алгоритмов.

Вопрос в модуле команды, формы или в общем модуле

Суть этого примера заключается в том, что мы используем немодальный метод-дублёр, в который передаём описание оповещения. А всю логику, которая должна обрабатывать ответ пользователя, помещаем в отдельную экспортируемую процедуру в этом же модуле. Именно на эту процедуру и указывает описание оповещения.

Вопрос в модуле управляемого приложения

Особенность этого примера заключается в том, что нет возможности сослаться на модуль приложения с помощью свойства ЭтотОбъект . Поэтому процедуру, обрабатывающую оповещение, нужно располагать, например, в неглобальном клиентском общем модуле. В конструкторе описания оповещения на такой модуль можно сослаться, просто указав его имя:

Этот же приём нужно использовать, если вы находитесь в глобальном общем модуле.

По поводу модуля управляемого приложения нужно сделать ещё одно замечание. Возможно, вы захотите организовать немодальный диалог с пользователем в обработчике ПередНачаломРаботыСистемы . Так, чтобы до момента ответа пользователя не открывалось главное окно приложения. К сожалению, на момент написания статьи, такой возможности нет. И в этом случае вам придётся выбрать другую логику работы прикладного решения.

Другой сценарий, который является крайне нежелательным — это немодальный диалог в обработчике ПередЗавершениемРаботыСистемы . Во-первых потому, что в условиях веб-клиента браузеры очень негативно относятся к показу каких-либо сообщений при закрытии приложений и блокируют их. Во-вторых потому, что наличие такого диалога не позволит реализовать некоторые сценарии работы.

Например, в конфигурации есть форма, перед закрытием которой также задаётся вопрос пользователю в немодальном диалоге. Допустим, пользователь модифицировал данные в этой форме и, не сохраняя их, пытается закрыть всё приложение. В результате он ответит что-то в диалоге перед закрытием формы, форма закроется, но приложение останется открытым. Так происходит потому, что в немодальном диалоге перед закрытием формы сначала отменяется стандартная последовательность действий системы (см. пример). А это, в том числе, отменяет и закрытие самого приложения.

Как открыть произвольную форму в блокирующем режиме

Если у вас есть форма, которую вы всегда хотите открывать только в блокирующем режиме, можно сразу, в конфигураторе, установить её свойство РежимОткрытияОкна в значение «Блокировать весь интерфейс» . А затем открывать её прежним методом ОткрытьФорму() , передавая в него описание оповещения:

Как поступить, если форму нужно открывать то в обычном, то в блокирующем режиме

В этом случае в конфигураторе свойство формы РежимОткрытияОкна лучше оставить в стандартном значении «Независимый» . А при открытии формы в явном виде указывать нужный режим открытия окна прямо в методе ОткрытьФорму() :

Как передать дополнительную информацию в форму, открываемую в блокирующем режиме

Может так случиться, что до вызова блокирующего окна у вас накопились какие-то значения, которые должны быть использованы после того, как пользователь ответит на вопрос или закроет блокирующую форму. Как передать их в процедуру, обрабатывающую оповещение?

Для этого у объекта ОписаниеОповещения существует третий параметр в конструкторе, в который можно передать структуру, содержащую значения, необходимые в дальнейшем:

Вопрос во вложенной процедуре, после которой нет кода

Рассмотрим ситуацию, когда блокирующий вызов хочется написать во вложенной процедуре. Например, так:

В этом случае достаточно будет вместо одной вложенной процедуры написать две процедуры, использующие блокирующий метод ПоказатьВопрос() :

Вопрос во вложенной процедуре, после которой есть код

Рассмотрим более сложный случай, когда после вызова вложенной функции выполнятся некоторый код. Например, так:


Казалось бы, следуя рекомендациям, надо просто заменить вложенную процедуру двумя процедурами:

Однако в этом случае алгоритм, следующий за вызовом вложенной процедуры, будет выполнен ещё до того, как пользователь ответит на вопрос. Ведь, как мы знаем, исполнение кода не останавливается после выполнения блокирующего метода (Сравнение модального и немодального режимов работы):

Поэтому в такой ситуации нужно не только использовать блокирующий метод с вызовом оповещения, но ещё и выполнять асинхронный вызов самой вложенной процедуры, также используя оповещение:

Здесь во вложенную процедуру мы сразу передаём описание оповещения, в котором содержится тот код, который должен быть выполнен после вложенной процедуры (последняя процедура). Вызывая блокирующий метод, мы передаём ему «его» описание оповещения ( ВложеннаяПроцедураЗавершение ), а также, через дополнительные параметры, то описание оповещения, которое нужно будет выполнить после того, как будут обработаны интерактивные действия пользователя ( ОбработкаКомандыЗавершение ).

Если сразу осознать такую конструкцию сложно, можно писать «по старому», а затем использовать функции рефакторинга. Они доступны начиная с версии 8.3.5. Как это делается можно посмотреть в примере Необходимо преобразование в асинхронную процедуру.

Вопрос в обработчике формы ПередЗакрытием

Особенность диалога с пользователем в этом (и многих других) обработчиках заключается в том, что в зависимости от реакции пользователя принимается решение: продолжать дальнейшие действия, или отказаться от них. Для этого используется параметр процедуры Отказ . При одном ответе пользователя мы отказываемся от продолжения ( Отказ = Истина ). При другом ответе пользователя — продолжаем дальнейшие действия.

В данном случае сложность заключается в том, что ответ пользователя мы узнаем уже после того, как выйдем из контекста этого обработчика. В процедуре, обрабатывающей оповещение. А параметр Отказ нужно установить именно в этом обработчике.

Поэтому мы действуем в два приёма:

  • В первый раз безусловно отменяем дальнейшие действия ( Отказ = Истина ) и выводим вопрос пользователю;
  • В обработчике оповещения, в зависимости от реакции пользователя, либо снова программно закрываем форму, либо ничего не делаем.

Проблема заключается в том, что обработчик ПередЗакрытием будет выполнен два раза. И чтобы отличить первое его выполнение от второго (когда ответ пользователя уже известен) мы используем клиентскую переменную ВыполняетсяЗакрытие в качестве флага.

В первый проход её значение равно Ложь , и это значит, что нужно отказаться от закрытия и задать вопрос. Во второй проход её значение равно Истина , и это значит, что вопрос задавать не надо:

Вопрос в обработчике формы ПередЗаписью

В обработчике события формы ПередЗаписью также может возникнуть потребность задать вопрос. Как и в предыдущем примере. Однако здесь вопрос так просто не решается. Отличие заключается в следующем.

В предыдущем примере, оказываясь в обработчике ПередЗакрытием , мы однозначно знали действие, которое должно быть выполнено. Это закрытие формы. Поэтому в обработке оповещения мы смело писали Закрыть() .

Но в обработчике ПередЗаписью мы такой однозначной информации не имеем. В этом обработчике мы можем оказаться по двум причинам: если пользователь нажал Записать , или если он нажал Записать и закрыть . То есть дальнейший сценарий действий нам неизвестен. Определить его стандартными способами, находясь внутри этого обработчика, мы не можем.

Поэтому тут можно предложить три варианта, но все они, к сожалению, обладают недостатками:

  • Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике. Это не всегда возможно;
  • В обработке оповещения с помощью собственной блокирующей формы задавать пользователю развернутый вопрос, предполагающий точное описание дальнейших действий: Отказаться?, Только записать? , Записать и закрыть? Это может выглядеть не очень красиво, ведь пользователь уже нажал «Записать и закрыть» , а его опять об этом спрашивают;
  • Не использовать стандартные команды формы Записать , » Записать и закрыть» . Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат.

Как переделывать старые конфигурации

Общие замечания

Переделка имеющихся конфигураций для работы в режиме без использования модальности сводится к трём этапам:

  • Первый этап — это поиск модальных вызовов и оценка возможности их преобразования;
  • Второй этап — автоматическое преобразование модальных вызовов;
  • Третий этап — полуавтоматическое преобразование тех модальных вызовов, которые невозможно преобразовать автоматически. Либо изменение алгоритма с целью вообще отказаться от использования таких вызовов (если преобразование оказывается слишком сложным и трудоёмким).

Далее мы рассмотрим все три этапа по-порядку. Какие инструменты можно использовать, какие рекомендации можно дать.

Поиск модальных методов

Существует несколько инструментов, которые позволяют найти модальные вызовы конфигурации. Некоторые из этих инструментов позволяют также оценить возможность автоматического преобразования этих вызовов.

В режиме 1С:Предприятие

Для того чтобы прямо в пользовательском режиме увидеть модальные вызовы конфигурации можно использовать свойство конфигурации «Режим использования модальности» . Его нужно установить в значение » Использовать с предупреждением» . Тогда в процессе работы прикладного решения будут выводиться сообщения каждый раз, как выполняется модальный метод. Но работе приложения это препятствовать не будет:

Проверка конфигурации в режиме Конфигуратор

Можно найти все методы, открывающие модальные диалоговые окна. Для этого нужно выполнить проверку конфигурации с установленным флажком «Поиск использования модальности» .

Проверка конфигурации — Расширенная проверка — Поиск использования модальности :

Результат проверки будет выдан в окно служебных сообщений, из которого можно сразу же перейти в модуль, в котором находится данный метод:

Нужно отметить, что эта проверка обнаруживает не все возможные модальные вызовы, а только те, которые можно определить «наверняка». То есть это модальные методы глобального контекста и модальные методы тех объектов, тип которых однозначно определён в анализируемом контексте.

Поэтому, например, в приведённом примере проверка не обнаруживает модальное открытие диалога выбора цвета во вложенной процедуре. В контексте этой процедуры тип переменной «Диалог» неизвестен.

Проверка одного модуля

Можно найти все модальные вызовы в каком-либо одном модуле (начиная с версии 8.3.5). Для этого нужно открыть этот модуль и выполнить команду контекстного меню «Рефакторинг — Модальные вызовы — Найти модальные вызовы модуля» (эти же команды доступны из меню «Текст» ):

В этом случае будут найдены все строки кода, которые приводят или могут привести к открытию модальных окон. В том числе и те строки, где открытие модального окна возможно, если объект имеет определённый тип:

Например, во вложенной процедуре в данном примере действительно будет открыто модальное окно для выбора цвета.

Если бы во вложенную процедуру в переменной » Диалог » передавалась бы выборка справочника, то, естественно, никакого модального вызова не было бы. Однако проверка всё равно отметила бы эту строку как «потенциально опасную».

Поэтому окончательное решение в таких случаях нужно принимать на основе визуального анализа алгоритма и типов используемых объектов.

Поиск с анализом возможности автоматического преобразования

Можно не только найти все модальные вызовы, но и оценить возможность их автоматического преобразования (начиная с версии 8.3.5). Оговоримся, что автоматическое преобразование выполняется не во всех случаях, подробнее об этом можно прочитать в разделе Автоматическое преобразование модальных методов.

Анализ модальных вызовов выполняется для всей конфигурации командой » Конфигурация — Рефакторинг — Анализ модальных вызовов конфигурации «:

Перед выполнением анализа можно задать параметры. Они позволяют уточнить анализ и одновременно с анализом выполнить преобразование:

Со стандартными значениями (если ничего не менять) буду найдены только те вызовы модальных методов, которые удалось определить однозначно:

Если установить флажок «Отображать методы объектов неопределенного типа» , то тогда будут показаны и те методы объектов, которые потенциально могут привести к открытию модальных окон. Это могут быть действительно модальные вызовы, а может быть и нет. Всё зависит от типа объекта, который нужно определять визуально, анализируя код программы:

В любом случае (с теми или иными параметрами анализа) результат будет содержать подробную информацию по каждому вызову с комментарием:

Вызовы, имеющие отметку «Может быть преобразован» , поддаются автоматическому преобразованию, которое выполняется этой же командой (нужно установить соответствующий флажок). Подробнее можно прочитать в разделе Автоматическое преобразование модальных методов.

С теми вызовами, про которые сказано, что они » Требуют дополнительных изменений» , нужно разбираться вручную. Тут сложно описать все возможные ситуации, но по некоторым типичным сообщениям можно дать примеры.

  • «Принадлежность не определена» — суть проблемы описана в разделе Проверка одного модуля. Вы должны самостоятельно определить тип объекта и на основании этого понять, приводит ли его метод к модальному вызову, или нет.
  • Необходимо преобразование в асинхронную процедуру ;
  • «Не поддерживается для процедур и функций глобального контекста» — суть проблемы описана в разделе Вопрос в модуле управляемого приложения. Нужно вручную определить модуль, в котором будет располагаться обработчик оповещения.
  • Присвоение ссылочного параметра: СтандартнаяОбработка ;
  • Присвоение ссылочного параметра: Отказ ;
  • Невозможно выделить фрагмент-окончание: фрагмент содержит незавершенный блок условия…

Автоматическое преобразование модальных методов

Автоматическое преобразование можно выполнить для всей конфигурации командой «Конфигурация — Рефакторинг — Анализ модальных вызовов конфигурации — Производить преобразование найденных вызовов» .

Можно выполнить аналогичное преобразование только для одного модуля. Для этого можно использовать команду контекстного меню «Рефакторинг — Модальные вызовы — Преобразовать модальные вызовы модуля» , или аналогичную команду из меню » Текст» .

Эти инструменты доступны начиная с версии 8.3.5.

Автоматически преобразуются только тривиальные вызовы. Это такие вызовы, преобразование которых затрагивает одну процедуру и не требует операций помимо выделения объекта.

Остальные вызовы требуют вашего вмешательства. Часть из них можно также преобразовать автоматически, но с помощью последовательного выполнения других команд рефакторинга. Другая часть потребует предварительного изменения алгоритма программы. Некоторые такие типичные ситуации рассматриваются в примерах следующего раздела.

Ручное преобразование конструкций, которые невозможно преобразовать автоматически

В этом разделе мы разберём некоторые типичные случаи, когда автоматическое преобразование невозможно и требуется вмешательство разработчика.

Как мы уже неоднократно говорили, далеко не во всех сценариях работы нужно стремиться «во что бы то ни стало» преобразовать модальный код в блокирующий. Как поступить в каждом конкретном случае — это вопрос творческий. Дать готовые рекомендации вроде «если у вас то-то, то поступить надо так-то» довольно затруднительно.

Мы рекомендуем отталкиваться от того соображения, что асинхронная модель работы, по сути, требует другого подхода к проектированию юзабилити интерфейса. То есть, «по хорошему», «по большому счёту» вопрос не в том, чтобы заменить одни операторы встроенного языка другими. Вопрос в том, чтобы изменить сценарий работы прикладного решения таким образом, когда использование блокирующего диалога станет ненужным.

Поэтому если преобразование существующего модального кода кажется сложным, затратным или вовсе невозможным — не стоит ломать голову. Не стоит придумывать сложные способы преобразования его в блокирующий код. Лучше подумать о том, чтобы в этом месте совсем отказаться от использования модальности.

Необходимо преобразование в асинхронную процедуру

При анализе модулей могут встретиться конструкции, автоматическое преобразование которых затруднительно. Например, на модальный вызов во вложенной процедуре система отреагирует следующим образом:

Это не значит, что автоматическое преобразование невозможно. Это значит, что его результат может оказаться непростым. И по этой причине желательно, чтобы разработчик выполнил его отдельно и самостоятельно.

Чтобы в подобном случае выполнить преобразование, можно установить курсор на модальный метод и из контекстного меню выполнить команду » Рефакторинг — Модальные вызовы — Преобразовать модальный вызов» :

Перед выполнением платформа известит вас, что кроме самого модального вызова необходимо преобразовать вызов процедуры к асинхронному виду:

И после этого будут выполнены оба преобразования:

Присвоение cсылочного параметра: СтандартнаяОбработка

Это простой, но типичный пример. Такое сообщение, например, будет выдано при анализе следующего модуля:

Здесь проблема заключается в том, что присвоение значения переменной СтандартнаяОбработка происходит уже после выполнения модального метода, а значит должно выполняться в процедуре обработчика оповещения. Но там это выполнить невозможно.

На самом деле видно, что в этом фрагменте строку СтандартнаяОбработка = Ложь; можно разместить и до вызова модального метода. От этого логика работы не меняется:

И если мы поступим таким образом, то сразу же облегчим задачу преобразования. Теперь оно может быть выполнено автоматически:

Присвоение cсылочного параметра: Отказ

Этот пример по своему «диагностическому сообщению» очень похож на предыдущий, но решение его уже не такое простое. Например, исходный код выглядит так:

Суть проблемы здесь та же, что и в предыдущем примере. После выполнения модального метода нужно присвоить значение переменной «Отказ» . Но сделать это в контексте обработчика оповещения невозможно.

Дополнительная сложность заключается в том, что просто переставить местами строки кода, как в предыдущем примере, тоже нельзя. Отказ выполняется только при одном из условий.

Поэтому тут нужно применять решение, которое описано в разделе Вопрос в обработчике формы ПередЗакрытием. Выполнять закрытие формы «в два прохода». Первый раз безусловно отказываться от действия и только задавать вопрос. А второй раз уже закрывать форму. А чтобы не зациклиться, использовать переменную модуля для того, чтобы отличить первый проход от второго.

Невозможно выделить фрагмент-окончание: фрагмент содержит незавершенный блок условия. Пример 1

Подобные сообщения свидетельствуют о том, что код довольно сложен и алгоритм автоматического преобразования не может его обработать. В таких случаях можно попытаться изменить или упростить алгоритм для того, чтобы автоматическое преобразование стало возможным. Условия, при которых возможно автоматическое преобразование, подробно описаны в документации.

Безусловно, ситуации могут быть самыми разными и в общем случае они требуют творческого подхода. Здесь мы покажем пару типичных приёмов. Это избавление от цикла и выделение фрагментов в отдельную процедуру.

Итак, к сообщению, вынесенному в заголовок, может привести, например, следующий фрагмент:

Проблема этого фрагмента в том, что модальный вызов выполняется внутри цикла. Для того чтобы появилась возможность преобразовать этот фрагмент в немодальный, нужно изменить логику алгоритма. Вместо того чтобы задавать вопрос каждый раз, как попадается «подозрительная» строка таблицы, нужно сначала найти все подозрительные строки, а затем один раз задать вопрос по поводу этих строк:

После такого изменения становится доступным автоматическое преобразование:

Невозможно выделить фрагмент-окончание: фрагмент содержит незавершенный блок условия. Пример 2

Другой фрагмент, который может привести к такому сообщению, может выглядеть так:

Проблема этого фрагмента заключается в строках, отмеченных стрелками. Каждая из этих строк может быть выполнена как в результате прохода по ветке с модальным вызовом, так и в результате прохода по «безмодальным» веткам алгоритма. Если бы в коде присутствовала только одна из этих строк, автоматическое преобразование было бы возможно. Но так, как их две, ситуация становится довольно сложной.

Что можно сделать? Путём выделения фрагмента кода в отдельную процедуру можно попытаться уменьшить «вариативность» алгоритма.

Посмотрим на первую «проблемную» строку. Перейти к ней мы можем из двух веток алгоритма:

Причём эти переходы должны будут принципиально отличаться, ведь из «немодальной» ветки мы можем перейти в эту же процедуру, а из «модальной» мы должны будем перейти в обработчик оповещения.

Можно упростить эту ситуацию, выделив весь оператор » Если» в отдельную процедуру:

Тогда уже будет неважно, по какой ветке шло выполнение алгоритма. К выполнению «проблемной» строки мы придём из одной и той же точки — после возврата из выделенной процедуры.

Поскольку выделяемый фрагмент содержит «Возврат» , выделим его в асинхронную процедуру. Получится четыре процедуры:

А теперь уже можно преобразовать вызов ОткрытьФормуМодально() . Вместо одной процедуры АктВыполненныхРаботПоЗаказамПриИзмененииФрагмент() получится три процедуры:

Илон Маск рекомендует:  Вложенные селекторы
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL