[Alimir_BootModal_Login]

Внутренний язык программирования 1С 8.3 для начинающих программистов: использование диалогов в 1С

Автор уроков и преподаватель школы: Владимир Милькин

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

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

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

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

Вопрос Вывод значения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

01

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

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

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

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

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

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

Ввод числа

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

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

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

02

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

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

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

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

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

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

Вопрос

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

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

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

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

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

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

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

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

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

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

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

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

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

Вопрос("Вы хорошо выспались?", РежимДиалогаВопрос.ДаНет);

Вопрос

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

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

Модальность

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

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

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

Пройдите тест

Начать тест

Домашнее задание

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

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

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

Дополнение

Данный материал рассчитан на начинающих разработчиков. Если он показался вам слишком лёгким - рассмотрите другие примеры использования диалогов в 1С (ссылка).

Для учеников

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

Обязательно выполняйте все тесты и домашние задания, старайтесь улучшить свои результаты. Сверяйтесь с эталонными решениями только после самостоятельного выполнения задач.

На вопросы учеников — отвечаю по почте,  но прежде загляните в ЧАВО (ссылка) .

С уважением, Владимир Милькин