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