Профессия — 1С

Рукопашный бой Карташ

Категории

Взаимодействие с пользователем

рубрики: Язык программирования 1С | Дата: 15 Март, 2017

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




Сообщение

Сообщение можно выводить двумя способами. Оба метода доступны на толстом клиент, тонком клиенте, веб-клиенте, на сервере, во внешнем соединении и в мобильном приложении.

  1. Метод Сообщить().

    Выводит указанный текст в окно сообщений. Синтаксис очень прост:

    
    
    
    Сообщить(<ТекстСообщения>, <СтатусСообщения>)
    

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

    • БезСтатуса
    • Важное
    • Внимание
    • Информация
    • Обычное
    • ОченьВажное

    СтатусСообщения необязательный параметр и может опускаться.
    На практике это выглядит примерно так:

    
    
    
    Сообщить("Произошла ошибка", СтатусСообщения.Внимание);
    
  2. Объект СообщениеПользователю.

    Объект СообщениеПользователю, в отличие от метода Сообщить(), обладает методами и свойствами, которые наделяют этот объект расширенными возможностями по выводу сообщений. В частности позволяют привязывать сообщение к элементам формы. Давайте сразу рассмотрим практический пример. В окне с кодом набираем сообщи нажимаем горячие клавиши Ctrl + Q. Тем самым мы используем встроенный шаблон текста, который есть в любой конфигурации. И сразу же получаем вот такую заготовку:

    
    
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "";
    Сообщение.Поле = "";
    Сообщение.УстановитьДанные();
    Сообщение.Сообщить();
    

    В простейшем случае (когда не хотим ни к чему привязывать сообщение) достаточно доработать этот шаблон следующим образом:

    
    
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Произошла ошибка";
    Сообщение.Сообщить();
    

    Для того, чтобы привязать СообщениеПользователю к элементу формы, необходимо заполнить его свойства ПутьКДанным и КлючДанных. Это можно сделать непосредственно присвоив значение каждому из этих свойств. Либо применить метод УстановитьДанные(<Объект>), который заполнит эти два свойства на основании данных объекта. Механизм по выводу сообщений с привязкой к элементу формы работает только для управляемых форм.
    Рассмотрим пару примеров. Для начала возьмем форму справочника (в моем случае он называется «Товары»):


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

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

    Теперь откроем элемент справочника и запишем его. В результате получим сообщение привязанное к полю Поставщик.

    Чтобы установить непосредственно свойства ПутьКДанным и КлючДанных без использования метода УстановитьДанные() необходимо видоизменить процедурау ВывестиСообщение() следующим образом

    
    
    
    Процедура ВывестиСообщение()
    
    	Сообщение = Новый СообщениеПользователю;
    	Сообщение.Текст = "Здесь должен быть указан поставщик";
    	Сообщение.Поле = "Поставщик";
    
    	СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Товары"));
    
    	Сообщение.ПутьКДанным = "Объект";
    	Сообщение.КлючДанных = СправочникОбъект.Ссылка;
    
    	Сообщение.Сообщить();
    
    КонецПроцедуры
    

    Работа ее при этом не измениться.

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

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

    
    
    
    &НаКлиенте
    Процедура Сообщение(Команда)
    
    	Сообщение = Новый СообщениеПользователю;
    	Сообщение.Текст			= "Должен быть указан товар";
    	Сообщение.Поле			= "ТабличнаяЧасть[1].Товар";
    	Сообщение.ПутьКДанным	= "Объект";
    
    	Сообщение.Сообщить();
    
    КонецПроцедуры
    

    Как видим для внешней обработки КлючДанных указывать не нужно. Достаточно свойства ПутьКДанным. Результат выполнения этой процедуры показан на картинке:

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

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




Вот пример кода, выводящий предупреждение, которое автоматически закрывается по истечении 10 секунд.



Предупреждение("В процессе работы возникла ошибка", 10);


Установка таймаута обязательна! Зависшие окна с предупреждениями могут приводить к неприятным последствиям. Недопустимо использовать предупреждения в транзакциях. Например, при проведении документа, т.к. это может приводить к блокировкам. Вообще желательно использовать сообщения, а предупреждения только в крайних случаях.

Вопрос

Зачастую от пользователя требуется подтверждение того или иного действия. В этих случаях используется диалоговое окно с вопросом. Как и с предупреждением в вопросе обязательно указание таймаута. Я как правило использую вот такую конструкцию:




Ответ = Вопрос("Вы действительно хотите совершить это действие?", РежимДиалогаВопрос.ДаНет, 10);
Если Ответ <> КодВозвратаДиалога.Да Тогда

	Возврат;

КонецЕсли;

В этом случае в диалоговом окне присутствуют две кнопки: Да и Нет.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С