рубрики: Язык программирования 1С | Дата: 15 марта, 2017
Достаточно часто возникает ситуация, когда программе необходимо взаимодействовать с пользователем. В 1С:Предприятии это реализовано с помощью сообщений, предупреждений и вопросов. .Рассмотрим каждый из этих способов.
Сообщение можно выводить двумя способами. Оба метода доступны на толстом клиент, тонком клиенте, веб-клиенте, на сервере, во внешнем соединении и в мобильном приложении.
Выводит указанный текст в окно сообщений. Синтаксис очень прост:
Сообщить(<ТекстСообщения>, <СтатусСообщения>)
ТекстСообщения — это произвольный текст, который может быть как статическим, так и формироваться динамически. Также это может быть строковая переменная.
СтатусСообщения — это системное перечисление, которое может принимать следующие значения:
СтатусСообщения необязательный параметр и может опускаться.
На практике это выглядит примерно так:
Сообщить("Произошла ошибка", СтатусСообщения.Внимание);
Объект СообщениеПользователю, в отличие от метода Сообщить(), обладает методами и свойствами, которые наделяют этот объект расширенными возможностями по выводу сообщений. В частности позволяют привязывать сообщение к элементам формы. Давайте сразу рассмотрим практический пример. В окне с кодом набираем сообщи нажимаем горячие клавиши Ctrl + Q. Тем самым мы используем встроенный шаблон текста, который есть в любой конфигурации. И сразу же получаем вот такую заготовку:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "";
Сообщение.Поле = "";
Сообщение.УстановитьДанные();
Сообщение.Сообщить();
В простейшем случае (когда не хотим ни к чему привязывать сообщение) достаточно доработать этот шаблон следующим образом:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Произошла ошибка";
Сообщение.Сообщить();
Для того, чтобы привязать СообщениеПользователю к элементу формы, необходимо заполнить его свойства ПутьКДанным и КлючДанных. Это можно сделать непосредственно присвоив значение каждому из этих свойств. Либо применить метод УстановитьДанные(<Объект>), который заполнит эти два свойства на основании данных объекта. Механизм по выводу сообщений с привязкой к элементу формы работает только для управляемых форм.
Рассмотрим пару примеров. Для начала возьмем форму справочника (в моем случае он называется «Товары»):
И доработаем модуль формы таким образом, чтобы перед записью у нас выводилось сообщение, привязанное к реквизиту формы Поставщик.
&НаСервере
Процедура ВывестиСообщение()
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Здесь должен быть указан поставщик";
Сообщение.Поле = "Поставщик";
//Получаем из реквизита формы объект прикладного типа
СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Товары"));
//Устанавливаем соответствие между полученным объектом и реквизитом формы
УстановитьСоответствиеОбъектаИРеквизитаФормы(СправочникОбъект, "Объект");
Сообщение.УстановитьДанные(СправочникОбъект);
Сообщение.Сообщить();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ВывестиСообщение();
КонецПроцедуры
Теперь откроем элемент справочника и запишем его. В результате получим сообщение привязанное к полю Поставщик.
Чтобы установить непосредственно свойства ПутьКДанным и КлючДанных без использования метода УстановитьДанные() необходимо видоизменить процедурау ВывестиСообщение() следующим образом
Процедура ВывестиСообщение()
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Здесь должен быть указан поставщик";
Сообщение.Поле = "Поставщик";
СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Товары"));
Сообщение.ПутьКДанным = "Объект";
Сообщение.КлючДанных = СправочникОбъект.Ссылка;
Сообщение.Сообщить();
КонецПроцедуры
Работа ее при этом не измениться.
Теперь проделаем то же самое для внешней обработки. С тем отличием, что привязывать сообщение будем не к реквизиту, а к строке табличной части. Итак создаем внешнюю обработку:
В модуле формы создадим процедуру, которая будет выводить сообщение привязанное к реквизиту Товар во второй строке табличной части.
&НаКлиенте
Процедура Сообщение(Команда)
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Должен быть указан товар";
Сообщение.Поле = "ТабличнаяЧасть[1].Товар";
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();
КонецПроцедуры
Как видим для внешней обработки КлючДанных указывать не нужно. Достаточно свойства ПутьКДанным. Результат выполнения этой процедуры показан на картинке:
Предупреждение выводит диалоговое окно с текстом для пользователя, которое закрывается по нажатию пользователем кнопки OK либо по таймауту (по истечении времени в секундах, указанного разработчиком).
Вот пример кода, выводящий предупреждение, которое автоматически закрывается по истечении 10 секунд.
Предупреждение("В процессе работы возникла ошибка", 10);
Установка таймаута обязательна! Зависшие окна с предупреждениями могут приводить к неприятным последствиям. Недопустимо использовать предупреждения в транзакциях. Например, при проведении документа, т.к. это может приводить к блокировкам. Вообще желательно использовать сообщения, а предупреждения только в крайних случаях.
Зачастую от пользователя требуется подтверждение того или иного действия. В этих случаях используется диалоговое окно с вопросом. Как и с предупреждением в вопросе обязательно указание таймаута. Я как правило использую вот такую конструкцию:
Ответ = Вопрос("Вы действительно хотите совершить это действие?", РежимДиалогаВопрос.ДаНет, 10);
Если Ответ <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
В этом случае в диалоговом окне присутствуют две кнопки: Да и Нет.
Как легко можно понять из кода, в случае если нажата кнопка Нет или прошло более 10 секунд, дальнейшее выполнение кода прерывается.
Добавить комментарий