вопрос ответ 1с управляемые формы
Вопрос в 1С 8.3 — отказываемся от модальности в управляемых формах с помощью асинхронных вызовов
Когда появилась возможность публиковать 1С в интернете или устанавливать платформу 1С 8.3 на мобильные приложения, возникла проблема с модальными окнами.
Дело в том, что в мобильных приложениях (web интерфейсах) они не открываются вообще, а на настольных компьютерах в браузере они воспринимаются как всплывающие окна, и чаще всего заблокированы пользователем.
Какое-то время фирма 1С боролась с таким положением вещей и даже разработала сложный и ненадежный механизм для модальных окон. Но, например, на iPhone он до сих пор не работает (из источников на сайте 1С).
В связи с этим, фирма 1С решила вообще отказаться от модальных окон. Точнее, пока оставили такую возможность, но и появилась настройка, запрещающая полностью использовать модальность. В 1С 8.3 появилась возможность производить асинхронный вызов модальных окон.
Эту настройку можно найти в свойствах конфигурации.
Заходим в Конфигуратор, нажимаем правой кнопкой мышки на самую первую строчку и выбираем «Свойства». У кого все свойства не уместились на экране, прокручиваем до самого низа:
На данный момент существует три режима применения модальных окон:
Теперь разберемся, как оформить новый функционал программно.
Задаем вопрос в 1С Предприятие 8.3
Начну с того, что нужно будет делать две процедуры. Первая, где задается сам вопрос, вторая, где он обрабатывается.
Я сразу напишу пример, а в комментариях будут пояснения. Так проще и наглядней:
На этом все, приятного программирования!
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Использование ПоказатьВопрос() в событии НачалоВыбора()
В качестве предисловия стоит написать, что в современных типовых конфигурациях настройка «Режим использования модальности» установлена в значение «Не использовать».
В обычных формах было допустимо использование конструкции «Ответ = Вопрос()». При вызове этой функции окно программы блокируется (т.е. работает в модальном режиме). Следовательно в пользовательском режиме будет выдана ошибка «Использование модальных окон в данном режиме запрещено».
Какую задачу решал я:
Перед тем, как изменить одно из ключевых полей на форме, проверялась заполненность вспомогательных таблиц. И если вспомогательная таблица не пустая, необходимо от пользователя получить согласие на её автоматическую модификацию. Это необходимо, т.к. пользователь ранее потратил время на настройку. Возможно он случайно нажал на кнопку выбора из списка у реквизита.
Для этого мне необходимо такую проверку написать в событии «НачалоВыбора».
Почему именно здесь? Потому как в этом событии есть параметр «СтандартнаяОбработка».
Если данный параметр установить в значение Ложь, и написать Возврат, то выбор даже не начнётся. Но, к сожалению здесь использовать конструкцию ПоказатьВопрос не получится по следующим причинам:
1. Если установить параметр СтандартнаяОбработка = Ложь сразу в процедуре, то не сработает стандартный механизм выбора, который нам нужен при положительном ответе пользователя.
2. Передать это как параметр в Оповещение тоже нельзя, т.к. назад значение не вернётся. Связано это с тем, что ПоказатьВопрос должно быть последним выполняемым действием в процедуре/функции.
3. Возможно пользователь ничего не поменял! Тогда и смысла нет ему лишний раз показывать вопрос. Понять произошли изменения или нет можно в событиях «ПриИзменении» либо «ОбработкаВыбора».
По этим причинам пришлось выдумать более сложную схему, состоящую из следующих шагов:
1. Создаем реквизит формы с постфиксом «Исходный».
2. Запоминаем его значение до изменения в событии «НачалоВыбора»:
3. Обрабатываем выбор в событии «ОбработкаВыбора». Здесь мы проверяем, изменилось ли вообще значение. Может и смысла нет задавать пользователю лишний вопрос, ведь он ничего не поменял!
4. Если вспомогательная таблица пустая, то вызываем процедуру, которая является оповещением, как будто пользователь нажал на кнопку «Да». Таким образом ещё уменьшаем количество сценариев, где необходимо вмешательство пользователя.
6. В случае с обычными формами, мы бы обработали выбор в обработчике «При изменении». В данной ситуации код этого обработчика ушел в оповещение. Также в оповещение через параметр передаем СтандартнаяОбработка. Ниже по коду видно, что в одном из случаев, мы устанавливаем её в значение «Ложь». Делаем это ДО ВХОДА в оповещение.
8. Выполняем необходимые действия при изменении:
Обратите внимание на то, что процедура СпособОпределенияСпискаСотрудниковЗавершениеВыбора экспортная. Не забывайте для оповещений ставить Экспорт.
Таким вот замысловатым способом удалось обойти ограничения по модальности окон, и решить мою задачу. Также данный подход снизил количество сценариев, при которых пользователь видит вопрос! Это немаловажно при разработке дружественных интерфейсов. Пользователя необходимо как можно реже отрывать от заполнения формы вопросами и сообщениями.