Что такое модальное окно в 1с. Что делать если "использование модальных окон в данном режиме запрещено". Быстрое исправление проблемы

14
Для принудительного запуска предприятия в Обычном или Управляемом приложении используются следующие ключи: /RunModeOrdinaryApplication запуск толстого клиента в обычном режиме, несмотря на настройки конфигурации и... 3
Нужно чтобы пользователи не могли менять настроенный для них интерфейс! Решение: Для отключения нужно в правах доступа у корневого элемента конфигурации убрать право " Сохранение данных пользователя ". ... 2
В текущей работе пользователь обычно открывает несколько объектов. Это может быть документ, справочник, отчет и т.д. В предыдущем интерфейсе не было проблем быстро найти открытый объект и актуализировать его для... 2
В прошлой статье: Установка адресного классификатора (KLADR) в 1С я рассказал Вам что такое Кладр и как его загрузить в 1С обычные формы (8.0-8.2). В данной статье я расскажу как загрузить Адресный классификатор (KLADR) в... 2
Часто разрабатывая некую конфигурацию, пользователи хотят прикреплять к элементу справочника фото и чтобы они хранились в базе данных. В этой статье я расскажу как к справочнику объекты строительства подключить...

«Использование модальных окон в данном режиме запрещено» — такая ошибка сейчас начинает беспокоить пользователей и программистов 1С с приходом нового интерфейса платформы 1С 8.3 — « «.

Разработчики технологической платформы 1С идут в ногу со временем, стандартизируя своё решение под мировые стандарты разработки программного обеспечения. Все стандарты так или иначе сводятся к единому интерфейсу, близкому к веб-страницам.

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

Особенно часто мы видим ошибку модальности у следующих методов 1С:

  • Вопрос;
  • Предупреждение;
  • ОткрытьЗначение.

Разработчики платформы 1С 8 с выходом нового интерфейса «такси» приняли верное решение — попытаться переучить разработчиков прикладных решений на новый лад. Они включили в новую платформу возможность — «режим использования модальности».

Быстрое исправление проблемы

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

Для этого зайдите в систему в режиме , откройте конфигурацию:

В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:

Получите 267 видеоуроков по 1С бесплатно:

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

После этого сохраните и примените изменения, нажав клавишу «F7».

Правильное решение задачи

Правильный способ решения этой проблемы — доработать конфигурацию или внешнюю обработку под новые требования.

Предупреждение, вопрос, диалоговые окна и другие модальные окна — всё это необходимо переписывать на новый лад.

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

Например:

  • Предупреждение — ПоказатьПредупреждение;
  • Вопрос — ПоказатьВопрос (подробно — );
  • — ПоказатьВводЧисла.

При этом появился специализированный объект — ОписаниеОпевещения.

Пример замены:

Строка = "" ; ВвестиСтроку(Строка, "Введите строковое значение" ) Сообщить("Вы ввели " + Строка) ;

Необходимо заменить на:

Строка = "" ; ОписаниеОповещения = Новый ОписаниеОповещения("ТестовыйВводСтроки" , ЭтаФорма) ; ПоказатьВводСтроки(ОписаниеОповещения, Строка, "Введите строковое значение" ) ;

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

&НаКлиенте Процедура ТестовыйВводСтроки(ПолученноеЗначение, ПереданныеПараметры) Экспорт Сообщить("Вы ввели " + Строка) ; КонецПроцедуры

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

Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:

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

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

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

Часть кода с вопросом может выглядеть примерно так:

Если ТЧ. Количество() < > 0 Тогда Ответ = Вопрос(" // В этой строке произойдет вывод модального окна с вопросом и выполнение кода остановится до ответа пользователя Если Ответ = КодВозвратаДиалога. Нет Тогда Возврат ; КонецЕсли ; // Пользователь согласился продолжить ТЧ. Очистить() ; КонецЕсли ; // Выполнение дальнейших действия // Сюда программа попадет если ТЧ была пустая или пользователь положительно ответил на вопрос о перезаполнении ВыполнениеДальнейшихДействий() ;

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

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

Как изменится раннее написанный код:

// Необходимо заполнить ТЧ данными // Проверка ТЧ на заполненность Если ТЧ. Количество() < > 0 Тогда // ТЧ не пустая, необходимо спросить пользователя о перезаполнении ПоказатьВопрос(Новый ОписаниеОповещения(" ПерезаполнениеТЧЗавершение " , ЭтотОбъект, ДополнительныеПараметры) , " ТЧ будет перезаполнена. Продолжить ? " , РежимДиалогаВопрос. ДаНет) ; // В этой строке произойдет вывод окна с вопросом, но выполнение кода не остановится Иначе // Сюда программа попадет если ТЧ была пустой ВыполнитьДальнейшиеДействия() ; КонецЕсли ; // Сюда программа попадет в любом случае, была ТЧ пустая или нет // (если, конечно, не произошло ошибки в предыдущем коде) . . . // Экспортная процедура в том же модуле // Вызывается после ответа пользователя на вопрос & НаКлиенте Процедура ПерезаполнениеТЧЗавершение(РезультатОтвета, ДополниетельныеПараметры) Экспорт Если РезультатОтвета = КодВозвратаДиалога. Нет Тогда // Пользователь отказался от продолжения Возврат ; КонецЕсли ; // Выполнение дальнейших дейтсвий // Сюда программа попадет если ТЧ была не пустая и пользователь положительно ответил на вопрос о перезаполнении ТЧ. Очистить() ; ВыполнитьДальнейшиеДействия() ; КонецПроцедуры

Таким образом, так как программа не остановится при выполнении процедуры ПоказатьВопрос, необходимо аккуратно обработать все события
При решении данной задачи выполнение дальнейших действий может произойти при двух событиях:
1. Если ТЧ была пустой
2. Если ТЧ была не пустой и положительном ответе пользователя на вопрос перезаполнении

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

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

Реализовано в версии 8.3.3.641.

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

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

Как правило "десктопные" браузеры лучше или хуже, но поддерживают модальные окна и открывают их в новом окне браузера как "всплывающее окно":

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

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

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

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

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

В результате:

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

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

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

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

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

В новом варианте для формы ФормаВводТекста (которая будет открываться в блокирующем окне) нужно установить свойство РежимОткрытияОкна в значение БлокироватьВесьИнтерфейс . Это обеспечит модальность для пользователя:

А программный код вместо одной процедуры, как раньше, будет содержать уже две процедуры:

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

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

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

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

Например, ниже показано использование старого метода ВвестиЗначение() и его нового метода-дублёра ПоказатьВводЗначения() :

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

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

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

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

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

В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

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

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

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

Такое поведение может обеспечить, например, следующий код:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Ответ = Вопрос (“Табличная часть будет очищена. Продолжить?” , РежимДиалогаВопрос.ДаНет );
Если Ответ = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли ;
КонецПроцедуры

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

Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().

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

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

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

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

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

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

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

У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.

Если выбран вариант “Использовать”, то модальные окна можно открывать. Если выбран вариант “Не использовать”, то модальные окна недопустимы. При попытке вызвать метод, открывающий модальное окно, система выводит сообщение об ошибке:

При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.

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

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

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

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

Код нужно разделить на две части:

  • открытие блокирующего окна;
  • обработка выбора пользователя.

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

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Оповещение = Новый ОписаниеОповещения (, ЭтотОбъект );

РежимДиалогаВопрос.ДаНет );
КонецПроцедуры
&НаКлиенте
Процедура (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли ;
КонецПроцедуры

После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.

Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.

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

В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.

Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().

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

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Оповещение = Новый ОписаниеОповещения (“ЗаполнитьТоварыВопросЗавершение” ,
ОбработкаОповещений );
ТекстВопроса = “Табличная часть будет очищена. Продолжить?” ;
ПоказатьВопрос (Оповещение , ТекстВопроса , РежимДиалогаВопрос.ДаНет );
КонецПроцедуры

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

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

Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.

На примере рассмотренного выше участка кода это можно сделать так:

&НаКлиенте
Процедура ЗаполнитьТовары (Команда )
Параметр1 = 0 ;
Параметр2 = 0 ;
СписокПараметров = Новый Структура (“Параметр1 , Параметр2″ , Параметр1 , Параметр2 );
Оповещение = Новый ОписаниеОповещения (“ЗаполнитьТоварыВопросЗавершение” , ЭтотОбъект ,
СписокПараметров );
ПоказатьВопрос (Оповещение , “Табличная часть будет очищена. Продолжить?” ,
РежимДиалогаВопрос.ДаНет );
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТоварыВопросЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//анализируем ДополнительныеПараметры.Параметр1
//анализируем ДополнительныеПараметры.Параметр2
КонецЕсли ;
КонецПроцедуры

Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.

Рассмотрим несколько примеров работы с блокирующими окнами.

Задача 1. Открытие другой формы

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

Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:

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

Обработчик команды выглядит следующим образом: &НаКлиенте
Процедура ЗакрытьФорму (Команда )
СписокПараметров = Новый Структура (“Параметр1, Параметр2” , Параметр1 , Параметр2 );
Закрыть (СписокПараметров ); КонецПроцедуры

Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:

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

&НаКлиенте
Процедура ОткрытьПараметры (Команда )
Оповещение = Новый ОписаниеОповещения (“ОткрытьПараметрыЗавершение” , ЭтотОбъект );
ОткрытьФорму (“ОбщаяФорма.ФормаПараметров” , , , , , , Оповещение );
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПараметрыЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если ТипЗнч (Результат ) = Тип (“Структура” ) Тогда
Для каждого КлючЗначение Из Результат Цикл
Сообщение = Новый СообщениеПользователю ;
Сообщение.Текст = “Ключ: “” ” + КлючЗначение.Ключ + “”” , значение = ”
+ КлючЗначение.Значение ;
Сообщение.Сообщить ();
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры

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

Для увеличения нажмите на изображение.

Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.

&НаКлиенте
Процедура ОткрытьПараметры (Команда )
Оповещение = Новый ОписаниеОповещения (“ОткрытьПараметрыЗавершение” , ЭтотОбъект );
ОткрытьФорму (“ОбщаяФорма.ФормаПараметров” , , , , , , Оповещение ,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);
КонецПроцедуры

Задача 2. Вопрос при закрытии формы

При закрытии окна обработки задавать пользователю вопрос, действительно ли он хочет закрыть окно.

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

&НаКлиенте
Перем НужноЗакрыватьФорму ;
&НаКлиенте
Процедура ПередЗакрытием (Отказ , СтандартнаяОбработка )
Если НЕ НужноЗакрыватьФорму = Истина Тогда
Отказ = Истина ;
Оповещение = Новый ОписаниеОповещения (“ПередЗакрытиемЗавершение” , ЭтотОбъект );
ПоказатьВопрос (Оповещение , “Вы действительно хотите закрыть окно?” ,
РежимДиалогаВопрос.ДаНет
);
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
НужноЗакрыватьФорму = Истина ;
Закрыть ();
Иначе
НужноЗакрыватьФорму = Неопределено ;
КонецЕсли ;
КонецПроцедуры

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

После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.

Задача 3. Ввод числового значения

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

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

&НаКлиенте
Процедура ВводЧисла (Команда )
Оповещение = Новый ОписаниеОповещения (“ВводЧислаЗавершение” , ЭтотОбъект );
ПоказатьВводЧисла (Оповещение , 0 , “Введите количество” , 15 , 3 );
КонецПроцедуры
&НаКлиенте
Процедура ВводЧислаЗавершение (Результат , ДополнительныеПараметры ) Экспорт

Сообщение = Новый СообщениеПользователю ;
Сообщение.Текст = “Вы ввели количество ” + Результат ;
Сообщение.Сообщить ();
КонецЕсли ;
КонецПроцедуры

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

Задача 4. Выбор цвета

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

Добавим на форму команду ВыборЦвета со следующим обработчиком:

&НаКлиенте
Процедура ВыборЦвета (Команда )
ДиалогВыбораЦвета = Новый ДиалогВыбораЦвета ;
Оповещение = Новый ОписаниеОповещения (“ВыборЦветаЗавершение” , ЭтотОбъект );
ДиалогВыбораЦвета. Пока зать (Оповещение );
КонецПроцедуры
&НаКлиенте
Процедура ВыборЦветаЗавершение (Результат , ДополнительныеПараметры ) Экспорт
Если НЕ Результат = Неопределено Тогда
Элементы.ВыборЦвета.ЦветФона = Результат ;
КонецЕсли ;
КонецПроцедуры

Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.

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

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

Для использования диалога выбора файла на веб-клиенте необходимо предварительно подключить расширение работы с файлами.

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

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

Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке. Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать». Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.

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

  1. Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
  2. Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).

Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.

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

Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора. Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е. на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.

Чтобы расставить все точки над “i”, заметим, что начиная с редакции 8.3.9 в толстом клиенте игнорируется свойство конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент», при этом соответствующие синхронные методы работают без генерации исключений и вывода предупреждений. Указанное игнорируемое свойство было добавлено в редакции 8.3.5 с целью поддержки асинхронной работы с внешними компонентами, криптографией и расширениями для работы с файлами в веб-браузере Google Chrome. Понятно, что к толстому клиенту это никакого отношения не имеет, и поэтому “тихое” игнорирование данного свойства просто исключило лишние проверки использования синхронных методов при использовании конфигурации.

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

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

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

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

Вместо заключения

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

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

В продолжение темы:
Программы

Мы не часто пишем о легендарных продуктах. Немногие Hi-Fi-компоненты могут похвастаться долголетием, подтверждающим подобную популярность. Однако АЕ1 были именно такими....

Новые статьи
/
Популярные