1с открытьзначение не модально

Обновлено: 07.07.2024

Ограничение на использование модальных окон и синхронных вызовов

Область применения: управляемое приложение.

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

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

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

3. В процедуре ПриЗавершенииРаботыСистемы модуля управляемого приложения недопустимо использовать асинхронные вызовы.

4. Если в процедуре ПередЗавершениемРаботыСистемы модуля управляемого приложения используются асинхронные вызовы, то в ней необходимо установить значение параметра Отказ = Истина и из процедуры оповещения о завершении асинхронного вызова продолжить завершение работы системы.
Пример:

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

// Общий модуль РаботаСФайламиКлиент:
Процедура ПослеУдаленияФайлов(ДополнительныеПараметры) Экспорт
Если ДополнительныеПараметры.ЗавершитьРаботуСистемы Тогда
// Больше нет действий перед завершением работы системы.
ЗавершитьРаботуСистемы();
КонецЕсли;
КонецПроцедуры

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


Вернитесь в конфигуратор и выберите пункт меню "Конфигурация" -> "Открыть конфигурацию":


В открывшемся окне нажмите правой кнопкой на пункте "Конфигурация" и выберите из раскрывшегося меню пункт "Свойства":


Откроется окно со свойствами конфигурации (справа):


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


Установите его значение в "Использовать":

Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле "Режим использования синхронных вызовов. ". Его также нужно установить в "Использовать".

Наконец, выберите пункт меню "Конфигурация" -> "Сохранить конфигурацию":


Готово! Теперь ошибки больше не возникнет.

Пояснения ниже - для тех кому интересно, что мы сделали.

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

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

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

Мы же можем смело включать его, так как пишем учебные примеры, не рассчитанные на работу в интернете.

Старая процедура, открывавшая модальное окно и обрабатывавшая полученные им данные, могла выглядеть так:


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


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


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

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

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

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

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


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

Теперь в простых, и в не очень простых, случаях вы можете сделать это автоматически (команда Модальные вызовы - Преобразовать модальный вызов):


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


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


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


Дело в том, что у глобального контекста нет свойства, позволяющего сослаться на него самого (ЭтотОбъект). А значит процедуру, обрабатывающую оповещение, нельзя разместить тут же, в модуле управляемого приложения. Её можно разместить, например, в каком-нибудь общем модуле. Эти действия вам нужно будет выполнить вручную:

Старая процедура, открывавшая модальное окно и обрабатывавшая полученные им данные, могла выглядеть так:


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


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


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

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

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

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

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


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

Теперь в простых, и в не очень простых, случаях вы можете сделать это автоматически (команда Модальные вызовы - Преобразовать модальный вызов):


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


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


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


Дело в том, что у глобального контекста нет свойства, позволяющего сослаться на него самого (ЭтотОбъект). А значит процедуру, обрабатывающую оповещение, нельзя разместить тут же, в модуле управляемого приложения. Её можно разместить, например, в каком-нибудь общем модуле. Эти действия вам нужно будет выполнить вручную:

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