1С 8.3 : Использование модальных окон в данном режиме запрещено! Модальные окна не работают, как быть?

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

Режим использования модальности

Если установить Не использовать, то — принципе весь код, который после ОткрытьФормуМодально() Вопрос(), Предупреждение(), Выборов и диалогов открытия-сохранения станет работать с ошибками!

Рассмотрим пример с Использовать:

[wp_ad_camp_3]

 

В режиме Предприятие получаем

Тест модального окна Вопрос

Если мы поставим Режим использования модальности = Не использовать то получим ошибку: Использование модальных окон в данном режиме запрещено

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

Теперь код нужно писать по новому:

 

в результате

Почему 1С решила отказаться от использования модальных окон ?

[wp_ad_camp_3]

В наш век развития мобильных технологий все идет к тому — что скоро все будут работать на планшетах и телефонах. 1С сделала для этого «Web Клиент» и «Мобильное приложение».  И чтобы успешно двигаться вперед нужно решать такие проблемы как, блокировка всплывающих окон. Ведь даже обычные браузеры по умолчанию блокируют модальные (всплывающие) окна!

 

Источник: helpf.pro

1С 8.3 : Использование модальных окон в данном режиме запрещено! Модальные окна не работают, как быть?: 21 комментарий

  1. А как быть и что делать, если при разрешенных модальных окнах все браузеры, кроме FireFox и iExplore говорят, что «Использование модальных окон в данном режиме запрещено» ?

    1. Для работы через web можно использовать только конструкцию:

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

      &НаКлиенте
      Процедура ОтветНаВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
      Если Результат = КодВозвратаДиалога.Да Тогда
      Сообщить(«Ответили ДА»);
      КонецЕсли;
      КонецПроцедуры

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

      1. Вопрос принципа — конфигурация на поддержке и снимать нельзя.

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

        Я ответ уже нашёл — http://rarus.ru/forum/forum14/topic6662 — придётся бразуер ставить человеческий, который на свои настройки не забывает.

        1. Это временный вариант, не решающий проблему.
          Можно решить проблему модальности не снимая конфигурацию с поддержки путем применения механизма «Расширения конфигурации», где выполнить подмену типового кода модуля на свой, с применением диалоговых окон без модальности (в 8.3.9 уже можно подменять код)

          1. 8.3.9.
            Но это не решает проблему — почему — опишу.

            Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

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

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

    Общий модуль:
    СтандартныеПодсистемыКлиент

    Процедура:
    ПередЗавершениемРаботыСистемы(Отказ = Ложь, ТекстПредупреждения = «») Экспорт

    1. Если я верно понимаю — то там используются 2 новых параметра, в результате которых мы можем только ДА\НЕТ ответить на ТекстПредупреждения.
      В вопросе можно получить несколько больше вариантов ответа и выполнить ещё несколько действий, в отличие от завершать работу или нет при использовании ЗавершениеРаботы+ТекстПредупреждения.
      Плюс к тому — если это не ЗавершениеРаботы — то ТекстПредупреждения игнорируется.

      1. Что мешает вызвать произвольную форму? Там хоть 20 вариантов ответа можно прописать 🙂

        1. Смотрите выше — после выхода из процедуры — я уже не смогу манипулировать её переменными (ОТКАЗ в частности).

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

          2. В указанном примере НЕТУ реализации возврата обратно — там только вопрос средствами платформы и только ДА\НЕТ.
            при вызове НачатьПоказ…. невозможно вернуться обратно. Увы. Это Асинхронный вызов.

  3. Процедура ФормаОтчетаОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
    ВариантРасшифровки = Новый СписокЗначений;
    ВариантРасшифровки.Добавить(«СведенияОРегламентномЗадании», НСтр(«ru = ‘Сведения о регламентном задании'»));
    ВариантРасшифровки.Добавить(«ОткрытьЖурналРегистрации», НСтр(«ru = ‘Перейти к журналу регистрации'»));

    ПараметрыОбработчика = Новый Структура;
    ПараметрыОбработчика.Вставить(«Расшифровка», Расшифровка);
    ПараметрыОбработчика.Вставить(«ФормаОтчета», ФормаОтчета);
    Обработчик = Новый ОписаниеОповещения(«РезультатОбработкаРасшифровкиЗавершение», ЭтотОбъект, ПараметрыОбработчика);
    ФормаОтчета.ПоказатьВыборИзМеню(Обработчик, ВариантРасшифровки);
    КонецПроцедуры

    Процедура РезультатОбработкаРасшифровкиЗавершение(ВыбранныйВариант, ПараметрыОбработчика) Экспорт
    Если ВыбранныйВариант = Неопределено Тогда
    Возврат;
    КонецЕсли;

    Действие = ВыбранныйВариант.Значение;
    Если Действие = «СведенияОРегламентномЗадании» Тогда

    СписокТочек = ПараметрыОбработчика.ФормаОтчета.ОтчетТабличныйДокумент.Области.ДиаграммаГанта.Объект.Точки;
    Для Каждого ТочкаДиаграммыГанта Из СписокТочек Цикл

    РасшифровкаТочки = ТочкаДиаграммыГанта.Расшифровка;
    Если ТочкаДиаграммыГанта.Значение = НСтр(«ru = ‘Фоновые задания'») Тогда
    Продолжить;
    КонецЕсли;

    Если РасшифровкаТочки.Найти(ПараметрыОбработчика.Расшифровка.Получить(2)) <> Неопределено Тогда
    ПоказатьСведенияОРегламентномЗадании(РасшифровкаТочки);
    Прервать;
    КонецЕсли;

    КонецЦикла;

    ИначеЕсли Действие = «ОткрытьЖурналРегистрации» Тогда

    СеансРегламентногоЗадания = Новый СписокЗначений;
    СеансРегламентногоЗадания.Добавить(ПараметрыОбработчика.Расшифровка.Получить(1));
    ДатаНачала = ПараметрыОбработчика.Расшифровка.Получить(3);
    ДатаОкончания = ПараметрыОбработчика.Расшифровка.Получить(4);
    ОтборЖурналаРегистрации = Новый Структура(«Сеанс, ДатаНачала, ДатаОкончания»,
    СеансРегламентногоЗадания, ДатаНачала, ДатаОкончания);
    ОткрытьФорму(«Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации», ОтборЖурналаРегистрации);

    КонецЕсли;

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

    1. Это всё красиво и понятно — суть вопроса совсем в другом.
      Это нужно вызвать не по кнопке в процессе работы.
      Это нужно вызвать в ПередЗаписью или ПередЗакрытием и по результату не дать записать или закрыть форму.

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

        1. Что мешает — в порядке приоритетов:
          1. Перво-наперво — это КОСТЫЛЬ.
          2. Это решает только при закрытии формы (и нагружает читабельность кода — согласитесь — обработать вопрос сразу намного приятнее).
          3. Перед записью — вот тут куча вариантов может быть. Не спрашивать же повторно — какое действие вызвало запись ? Пользователь просто не поймёт, что он него хотят.

  4. Откройте любую типовую последнюю конфигурацию на упр. формах, там море примеров!!! Не ужели так сложно?

    1. Буду признателен за указание типовой, на 8.3.8+.
      И если не сложно, где используется вопрос при закрытии формы (перед записью) с вариантами больше 2 (Да\НЕТ).

      1. Почитайте ответы! Уже писал название с точным номером релиза

        1. Спасибо — попробую последнюю.
          В версии 1.6.2 — ничего такого нету.

  5. Про — http://its.1c.ru/docs/v8nonmodal/.
    Тото же — сами придумали, и сами не знают как быть:
    1. С закрытием показывают в документации как правильно писать костыли.
    2. С записью сами не смогли придумать как быть.

    Резюме: вот вам новый костыль, дорогие разработчики — как хотите — так и пишите.

    п.с.: УНФ новую докачаю посмотрю, но, уверен, с учетом ссылки — там вряд ли будет что-то бОльшее, чем в этой ссылке.

Обсуждение закрыто.