ЮНИТ 20. ИСПОЛЬЗОВАНИЕ ДИАЛОГОВ В ЯЗЫКЕ 1С

Давайте определимся, что же такое диалог? Вызов команды Сообщить является диалогом? А вызов команды Ввести Число! А вызов ОткрытьЗначение?

Итак, диалог — это прежде всего элемент графического интерфейса. окно. А, следовательно, вызов Сообщить диалогом не является, так как у него нет своего отдельного окна.

Диалог — это не просто окно. Это окно, которое открывается пользователю с целью вывода информации и (или) получения ответа.

Примеры диалогов:

1 С: Предприятие

X

Вам понятен материал?

Да I

Нет

1 С: Предприятие X

Кафедра Прикладной информатики

ОК

іигнчіїїтдиичіїїзіниипчпїтіі

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

Предупреждение

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

Предупреждение("Осторожно!");

Что мы видим? Вызов команды Предупреждение, в которую в качестве параметра передается строка "Осторожно".

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

К примеру, пусть у нас есть такой код:

Предупреждение(" 1");

Предупреждение("2");

Предупреждение("3");

Как он будет выполняться?

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

После закрытия диалога компьютер перейдет к выполнению строчки №2 и выполнит команду Предупреждение уже с другим параметром "2". Пользователю снова покажется диалоговое окно, но уже с текстом "2", а компьютер замрет уже на второй строчке и будет ожидать, пока пользователь закроет диалог.

Затем компьютер перейдет к третьей строчке. Ну, и так далее.

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

Предупреждение(<ТекстПредупреждения>, <Таймаут>, <Заголо-вок>)

Таймаут — означает количество секунд, через которое диалог закроется сам, если этого не сделает пользователь.

Заголовок — подменяет стандартный заголовок "1 С: Предприятие" на строку пользователя.

К примеру, такой код:

Предупреждение("Осторожно.", 5, "Внимание!");

покажет диалог с текстом "Осторожно." и заголовком "Внимание!", а также закроется через 5 секунд, если пользователь не сделает этого раньше:

Внимание!

X

Осторожно.

ОК

А что если мы хотим задать только текст и заголовок окна, а таймаут не задавать?

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

Предупреждение("Осторожно.", О, "Внимание!");

А во-вторых, мы можем просто оставить пустое место вместо параметра, и система сама поймет, что нужно оставить его значение по умолчанию:

Предупреждение("Осторожно.",, "Внимание!");

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

Ввод числа

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

К примеру, напишем:

Число = 0;

ВвестиЧисло(Число);

Введите число

'3 ш |-г-

ок

Отмена

Зачем мы передаем в команду параметр Число? Во-первых, для того, чтобы отобразить начальное значение ввода в диалоге. А, во-вторых, чтобы вернуть в эту переменную значение, которое ввел пользователь.

Но что если пользователь отказался от ввода и нажал кнопку "Отмена"? Как об этом узнать? Оказывается, функция ВвестиЧисло не только показывает диалог ввода числа, но еще и возвращает нам Истина в том случае, если пользователь нажал кнопку "ОК", и Ложь, если он отменил ввод, нажав кнопку "Отмена".

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

Число = 0;

Результат = ВвестиЧисло(Число);

Если Результат = Истина Тогда ОткрытьЗначение("Вы ввели " + Строка(Число));

Иначе

ОткрытьЗначение("Вы отменили ввод");

КонецЕсли;

В переменную Результат (имя могло быть любым) возвращается Истина или Ложь в зависимости от того, какую кнопку нажал пользователь ("ОК" или "Отмена").

В переменную Число возвращается число, введенное пользователем.

Вопрос

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

Имя команды, которая вызывает этот диалог, нам известно — Вопрос.

Теперь давайте посмотрим в синтакс-помощнике, какие параметры принимает эта команда:

Вопрос(<ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмол-чанию>, <Заголовок>, <КнопкаТаймаута>)

ТекстВопроса — это сам вопрос в текстовом виде, который увидит пользователь.

Кнопки это одно из предопределенных значений, которые также можно посмотреть в синтакс-помощнике. Например, если передать в этот параметр:

  • • РежимДиалогаВопрос.ДаНет — в диалоге будет всего две кнопки Да и Нет.
  • • РежимДиалогаВопрос.ДаНетОтмена — три кнопки Да, Нет и Отмена.
  • • РежимДиалогаВопрос.ОкОтмена — две кнопки Ок и Отмена.
  • • И другие варианты кнопок.

Таймаут этот параметр нам уже знаком.

КнопкаПоУмолчанию — это кнопка, на которой будет фокус при показе окна. Ее значения могут быть такими:

  • • КодВозвратаДиалога.Нет
  • • КодВозвратаДиалога.Да
  • • КодВозвратаДиалога.Отмена
  • • И другие кнопки.

Заголовок — этот параметр нам уже знаком.

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

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

Вопрос("Вам понятен материал?",

Режим Д и лога Вопрос .Да Н ет);

1С: Предприятие

X

Вам понятен материал?

Да |

Нет

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

Результат = Вопрос("Вам понятен материал?", РежимДиалогаВо-прос.ДаНет);

Если Результат = КодВозвратаДиалога.Да Тогда ОткрытьЗначение("Какой вы молодец!");

Иначе

ОткрытьЗначение("Выполните задания еще раз!");

КонецЕсли;

Модальность

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

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

Таким недостатком не обладают немодальные версии диалогов, но к ним переходить нам еще рано.

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

Напишите программу, которая спрашивает пользователя "Нажмите Да, чтобы вывести числа от 1 до 10, Нет — чтобы вывести числа от 10 до 100, ни в коем случае не нажимайте кнопку Отмена". В диалоге должны быть три кнопки Да, Нет и Отмена.

Если пользователь нажал Да — выводим числа от 1 до 10, Нет — от 10 до 100, Отмена — выводим диалог предупреждения с текстом "Мы же вас предупреждали, что нельзя нажимать отмену!".

Решение

Результат = Вопрос(

"Нажмите Да, чтобы вывести числа от 1 до 10" +

", Нет — чтобы вывести числа 10 до 100, ни в коем" +

"случае не нажимайте кнопку Отмена", РежимДиалогаВопрос. ДаНетОтмена);

Если Результат = КодВозвратаДиалога.Да Тогда Для Шаг = 1 По 10 Цикл Сообщить(Шаг);

КонецЦикла;

ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда Для Шаг = 10 По 100 Цикл Сообщить(Шаг);

КонецЦикла;

ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда ОткрытьЗначение("Мы же вас предупреждали, что нельзя нажимать отмену!");

КонецЕсли;

 
< Пред   СОДЕРЖАНИЕ     След >