1с сообщение пользователю с привязкой к реквизиту формы

 +7 

   

Распечатать

Сообщение пользователю с привязкой текста к полю из контекста клиента в форме СообщениеПользователю

Частенько нужно сообщить пользователю какую-то информацию, раньше использовали Сообщить() или

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

Код 1C v 8.3

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

//////////////////// КОД для ТИПОВЫХ конфигураций:
//Для БСП:
//в модуле объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(“Текст ошибки”,                
                        ЭтотОбъект,
                        "Договор",,
                        Отказ);
//в форме объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Дублирование пременной'"), ,
"Запросы["+ИдентификаторСтроки+"].ИмяПеременнойЗапроса",//путь к данным
 "Объект", Отказ);

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

еще примеры:

Код 1C v 8.3

 

// Сообщение.КлючДанных = Ссылка на объект базы или ключ записи

// Сообщение.ПутьКДанным = содержит путь в форме до объекта.

// показываем сообщение из обработки

// КлючДанных и ПутьКДанным - пустые

Сообщение = Новый СообщениеПользователю;

Сообщение.Поле = "Комментарий";

Сообщение.Текст = "Заполните комментарий";

Сообщение.Сообщить();

// показываем сообщение из документа

// КлючДанных - пустой, ПутьКДанным заполнится автоматически

Сообщение = Новый СообщениеПользователю;

Сообщение.Поле = "Товары[0].Количество";

Сообщение.Текст = "Не заполнено количество товара в первой строке!";

Сообщение.УстановитьДанные(ЭтотОбъект);

Сообщение.Сообщить();

В этой статье рассмотрим один из способов вывода сообщения пользователю 1С – использование объекта СообщениеПользователю. С этим объектом можно работать на тонком, толстом, мобильном и веб-клиенте, а также в серверном контексте 1С 8.3.

Сообщение пользователю на управляемой форме 1С

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

&НаКлиенте
Процедура Заполнить(Команда)
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Выберете контрагента";
	Сообщение.Сообщить();
КонецПроцедуры

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

Сообщение пользователю 1С

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

Например, у меня на форме документа имеется поле ввода Контрагент, которое связано с одноименным реквизитом документа. Этот реквизит формы Контрагент является подчиненным реквизитом основного реквизита  формы Объект.

Реквизиты управляемой формы 1С

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

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

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

Сообщение пользователю 1С

В свойстве Поле объекта  СообщениеПользователю можно указать путь к любому реквизиту формы. Например, добавим на форму реквизит Комментарий, который ни как не будет связан с основным реквизитом формы.

Реквизиты управляемой формы 1С

Мы можем вывести сообщение, которое будет привязано к элементу, связанному с этим реквизитом.

&НаКлиенте
Процедура Заполнить(Команда)	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Заполните комментарий";
	Сообщение.Поле = "Комментарий";
	Сообщение.Сообщить();	
КонецПроцедуры

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

Сообщение пользователю 1С

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

Реквизиты управляемой формы 1С

Сделаем проверку на то, что значение в этой колонке пустое.

&НаКлиенте
Процедура Заполнить(Команда)
	Для Каждого стрТовар из Объект.Товары Цикл
		Если стрТовар.Количество = 0 Тогда
			Сообщение = Новый СообщениеПользователю;
			ИндексСтроки = стрТовар.НомерСтроки - 1;
			Сообщение.Поле = "Объект.Товары["+ИндексСтроки+"].Количество";
			Сообщение.Текст = "Количество не заполнено";
			Сообщение.Сообщить();
			Возврат
		КонецЕсли;
	КонецЦикла;	
КонецПроцедуры

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

Сообщение пользователю 1С

Вывести сообщение пользователю 1С

Пойдем дальше! Иногда требуется выполнить проверку заполнения того или иного реквизита при проведении документа. В последних платформах 1С следует это делать в обработчике ОбработкаПроверкиЗаполнения, этот обработчик создается в модуле объекта, и срабатывает перед проведением документа.

В нем необходимо делать проверки на заполнение реквизитов документа.

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

Если мы попробуем провести документ «Продажа товара» с пустым полем «Контрагент», то выйдет сообщение.

Сообщение пользователю 1С

Можно сделать проще:

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

Результат будет тот же самый. Что делает метод УстановитьДанные? Этот метод автоматически устанавливает свойства ПутьКДанным и КлючДанных на основании переданного в него объекта.  

Статья про вывод простых сообщений пользователям

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Это изображение имеет пустой атрибут alt; его имя файла - 1C-в-желтом-цвете-3D-221x300.png

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Это изображение имеет пустой атрибут alt; его имя файла - 1_в-желтом-цвете-3D-маленькая-221x300.jpg

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu


Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Вывести СообщениеПользователю из общего модуля привязкой к реквизиту

Я
   Радим1987

20.04.17 — 09:53

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

[1c]

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = «услуги [ «+ВидРезки+» ] не существует»;

Сообщение.Поле = «Товары[0].Номенклатура»;

Сообщение.Сообщить();     

[/1c]

  

Партнерская программа EFSOL Oblako

   Радим1987

1 — 20.04.17 — 09:55

Сообщение выводиться но ни как привязывается к табЧасти

Параметрах процедуры есть (Объект = ДанныеФормыСтруктура,Форма = управляемая форма)

что только не пробывал

   Радим1987

2 — 20.04.17 — 09:58

Попытка

1) ДокументОбъект = ДанныеФормыВЗначение(Объект, Тип(«ДокументОбъект.РеализацияТоваровУслуг»));

Сообщение.УстановитьДанные(ДокументОбъект );

2) Сообщение.КлючДанных = Объект.Ссылка;

Сообщение.ПутьКДанным = «Объект»;

3) ДокументОбъект = ДанныеФормыВЗначение(Объект, Тип(«ДокументОбъект.РеализацияТоваровУслуг»));

УстановитьСоответствиеОбъектаИРеквизитаФормы(Документ, «Объект»);

Сообщение.УстановитьДанные(ДокументОбъект );

итд итд

   dezss

3 — 20.04.17 — 10:17

Что передаешь в процедуру/функцию общего модуля?

   Радим1987

4 — 20.04.17 — 10:19

Объект = ДанныеФормыСтруктура,Форма = управляемая форма

   dezss

5 — 20.04.17 — 10:19

(3) тьфу, увидел…

а если

Сообщение.Поле = «Форма.Элементы.Товары[0].Номенклатура»;

   drcrasher

6 — 20.04.17 — 10:23

(2) установитьДанные(документСсылка)

   Радим1987

7 — 20.04.17 — 10:24

(5) нет не получилось

   Радим1987

8 — 20.04.17 — 10:25

(6) УстановитьДанные(<Объект>)

Параметры:

<Объект> (обязательный)

Тип: Произвольный.

Объект, с которым должно быть связано сообщение.

   dezss

9 — 20.04.17 — 10:26

(7) а попробуй подобным образом привязать к какому-нибудь другому элементу формы, не тч.

   Радим1987

10 — 20.04.17 — 10:26

УстановитьСоответствиеОбъектаИФормы(<Объект>, <ИдентификаторФормыИИмяРеквизита>)

<ИдентификаторФормыИИмяРеквизита> (обязательный)

Тип: Структура.

Содержит идентификатор формы и имя реквизита элемента управления, для которых выполняется установка соответствия.

Структура, передаваемая в параметр, может содержать два элемента с именами ключей:

1. «ИдентификаторФормы» («FormID») – уникальный идентификатор формы (тип УникальныйИдентификатор);

2. «ИмяРеквизита» («AttributeName») – имя реквизита в форме (тип Строка). Этот элемент может не указываться.

но когда я делаю через структуру ругается

типа неправильный параметр

   Радим1987

11 — 20.04.17 — 10:27

(9) другим элементам тоже не привязывается

   Радим1987

12 — 20.04.17 — 10:33

УстановитьСоответствиеОбъектаИРеквизитаФормы(ДокументОб,ст);    

по причине:

Несоответствие типов (параметр номер ‘2’)

ПОЧЕМУ ?????

УстановитьСоответствиеОбъектаИФормы(<Объект>, <ИдентификаторФормыИИмяРеквизита>)

<ИдентификаторФормыИИмяРеквизита> (обязательный)

Тип: Структура.

ст = Новый Структура;            Ст.Вставить(«ИдентификаторФормы»,Форма.УникальныйИдентификатор);            Ст.Вставить(«ИмяРеквизита»,Форма.Объект);

   dezss

13 — 20.04.17 — 10:35

Ст.Вставить(«ИмяРеквизита»,Строка(Форма.Объект));

   dezss

14 — 20.04.17 — 10:36

(13) не точно так, но принцип понятен, да?

   dezss

15 — 20.04.17 — 10:37

(13) по идее можно прям так

Ст.Вставить(«ИмяРеквизита»,»Объект»);

   Радим1987

16 — 20.04.17 — 10:40

(13),  (15) та же ошибка по причине:

Несоответствие типов (параметр номер ‘2’)

   dezss

17 — 20.04.17 — 10:47

ПолучитьСоответствиеОбъектаИФормы(<Объект>)

что возвращает?

   Радим1987

18 — 20.04.17 — 10:50

(17)

ИдентификаторФормы,00000-000            

ИмяРеквизита,ДанныеФормыСтруктура

   dezss

19 — 20.04.17 — 10:56

(18) а в ДанныеФормыСтруктура что-то есть?

   Радим1987

20 — 20.04.17 — 11:01

Сделал так УстановитьСоответствиеОбъектаИРеквизитаФормы(ДокументОб,»ст»);

ПолучитьСоответствиеОбъектаИФормы(Док) вернул структуру

ИдентификаторФормы =  00000-00000-0000000000

ИмяРеквизита = «ст»

Получается не устанавливается идентификатор формы

   dezss

21 — 20.04.17 — 11:04

(20) а с каких пор ДокументОб стал идентификатором формы? О_о

   Радим1987

22 — 20.04.17 — 11:09

я имею ввиду что процедура УстановитьСоответствиеОбъектаИРеквизитаФормы(ДокументОб,»ст»); устанавливает  только имя «ИмяРеквизита = «ст»»

   dezss

23 — 20.04.17 — 11:09

(22) а ты передай ему в первом параметре идентификатор формы…вот тогда и увидим что он устанавливает…

   dezss

24 — 20.04.17 — 11:13

(23) тьфу…туплю, блин…

   dezss

25 — 20.04.17 — 11:14

кста, а модуль серверный?

   Радим1987

26 — 20.04.17 — 11:16

(25) да почти решил жду отладку)

   dezss

27 — 20.04.17 — 11:23

(26) ты ж напиши как решил

   Радим1987

28 — 20.04.17 — 11:29

Не получилось

ДокументОб = Форма.РеквизитФормыВЗначение(«Объект», Тип(«ДокументОбъект.РеализацияТоваровУслуг»));

возвращает то что надо

ПолучитьСоответствиеОбъектаИФормы(Док) вернул структуру

ИдентификаторФормы =  rt896-gbfg56-456fdbd3vc5b

ИмяРеквизита = «Объект»

но

после использования

УстановитьСоответствиеОбъектаИРеквизитаФормы(ДокументОб,»Объект»)

ИдентификаторФормы =  000-000-00000000

ИмяРеквизита = «Объект»

даже не знаю куда копать

   dezss

29 — 20.04.17 — 11:34

(28) да понятно, что установить… у тебя не работает как написано в сп, передавать только «Объект» безсмысленно.

А попробуй передавать структуру только с идентификатором. Убери строчку:

Ст.Вставить(«ИмяРеквизита»,Форма.Объект);

Будет тогда ругаться на тип параметра?

   Радим1987

30 — 20.04.17 — 11:36

(29) пробываал тоже самое

   dezss

31 — 20.04.17 — 11:39

Блин….прям вот щас сам попробую. Интересно стало.

   Радим1987

32 — 20.04.17 — 11:39

)))

   dezss

33 — 20.04.17 — 11:46

УстановитьСоответствиеОбъектаИРеквизитаФормы <> УстановитьСоответствиеОбъектаИФормы

Первое у тебя в (28)

УстановитьСоответствиеОбъектаИФормы у меня отработал нормально.

ПолучитьСоответствиеОбъектаИФормы вернул те значения, что я передал в структуре.

Правда делал все модуле формы.

   Радим1987

34 — 20.04.17 — 11:54

ст = Новый Структура;

Ст.Вставить(«ИдентификаторФормы»,Форма.УникальныйИдентификатор);

Ст.Вставить(«ИмяРеквизита»,Форма.Объект);

         УстановитьСоответствиеОбъектаИФормы(ДокументОб,ст);

по причине:

Недопустимое значение параметра (параметр номер ‘2’)

   dezss

35 — 20.04.17 — 11:56

(34) да еп жеж….

Ст.Вставить(«ИмяРеквизита»,<тут должна быть СТРОКА!!!!>);

   dezss

36 — 20.04.17 — 11:57

(34) с реквизитами формы привязка работает, с объектом и всем дочерним к нему чета нет…пороюсь

   dezss

37 — 20.04.17 — 12:20

Кароч. Все решается так:

    об = РеквизитФормыВЗначение(«Объект»);

    ст = Новый Структура;

    ст.Вставить(«ИдентификаторФормы»,ЭтаФорма.УникальныйИдентификатор);

    ст.Вставить(«ИмяРеквизита»,»Объект»);

    УстановитьСоответствиеОбъектаИФормы(об,ст);

    сообщение = Новый СообщениеПользователю;

    сообщение.Текст = «Все очень плохо»;

    сообщение.УстановитьДанные(об);

    сообщение.Поле = «<тут имя поля формы>»;

    сообщение.Сообщить();

в модуле формы работает…думаю, и в общем модуле должно

   Радим1987

38 — 20.04.17 — 12:29

ДокументОб = Форма.РеквизитФормыВЗначение(«Объект», Тип(«ДокументОбъект.РеализацияТоваровУслуг»));                

            
            ИдентификаторФормыИИмяРеквизита = Новый Структура;

            ИдентификаторФормыИИмяРеквизита.Вставить(«ИдентификаторФормы»,Форма.УникальныйИдентификатор);

            ИдентификаторФормыИИмяРеквизита.Вставить(«ИмяРеквизита»,»Объект»);

            УстановитьСоответствиеОбъектаИФормы(ДокументОб,ИдентификаторФормыИИмяРеквизита);

            
            Сообщение = Новый СообщениеПользователю;

            Сообщение.Текст = «услуги [ «+ВидРезки+» ] не существует»;  

            Сообщение.Поле = «Форма.Элементы.Товары»;

            Сообщение.УстановитьДанные(ДокументОб);

            Сообщение.Сообщить();     

тоже все работает я дума щас проблема в этом

Товары[0].Номенклатура

   Радим1987

39 — 20.04.17 — 12:30

т.е Сообщение.Поле = ?

   Радим1987

40 — 20.04.17 — 12:35

ПОЛЕ =

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

Например, путь к реквизиту Номенклатура в строке с индексом 10 табличной части документа, в которой произошла ошибка: ТабличнаяЧастьСоставДокумента[10].Номенклатура.

а в моем случае к чему будет равно Поле = ?

Сообщение.Поле = Форма.ТОвары или

Сообщение.Поле = Объект.ТОвары

   dezss

41 — 20.04.17 — 12:55

А если так:

Сообщение.Поле = «Форма.Элементы.Товары.ТекущаяСтрока»;

Я так понимаю Товары[0].Номенклатура — это для ОФ, в УФ работать не будет.

(40) Для УФ поле формы надо сюда пихать, насколько я понял

Сообщение.Поле = Форма.Элементы.Товары

   dezss

42 — 20.04.17 — 12:59

(41) Я не прав, надо именно имя реквизита, а не элемента формы. Только что проверил.

Тебе можно писать просто

Сообщение.Поле = Товары

Так как с объектом ты это сообщение уже связал через

Сообщение.УстановитьДанные(ДокументОб);

   dezss

43 — 20.04.17 — 13:02

Кстати, если надо будет вызвать сообщение на реквизит формы, не подчиненный объекту, то надо будет переустанавливать УстановитьСоответствиеОбъектаИФормы на этот реквизит.

   Радим1987

44 — 20.04.17 — 13:03

пробывал ничего не происходит выводит сообщение только сбоку

   dezss

45 — 20.04.17 — 13:03

(43) Или сделать так:

Сообщение.Поле = «»;

сообщение.ПутьКДанным = «<имя реквизита формы>»;

   dezss

46 — 20.04.17 — 13:04

(44) Я на обед, а пока покажи код и сообщение.

   Радим1987

47 — 20.04.17 — 13:04

Сообщение = Новый СообщениеПользователю;

            Сообщение.Текст = «услуги [ «+ВидРезки+» ] не существует»;  

            Сообщение.Поле = «Товары[0].Номенклатура»;

            Сообщение.КлючДанных = ДокументОб.Ссылка;

            Сообщение.ПутьКДанным = «Объект»;

            Сообщение.Сообщить();     

            
            ТекстОшибки = «услуги [ «+ВидРезки+» ] не существует»;

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб,»Товары[0].Номенклатура»,, );

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб,»Объект.Товары[0].Номенклатура»,, );

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб,»ДанныеФормыСтруктураО.Товары[0].Номенклатура»,, );

            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб.Ссылка,»Товары[0].Номенклатура»,»Объект», );

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб.Ссылка,»Объект.Товары[0].Номенклатура»,»Объект», );

            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб.Ссылка,»ДанныеФормыСтруктураО.Товары[0].Номенклатура»,»Объект», );

   dezss

48 — 20.04.17 — 14:05

так-с…теперь ты решил воспользоваться уже написанным…но воспользовался неправильно.

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ДокументОб,»Товары»,»Объект», );

Если реквизит формы не связан с объектом, то так:

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки,,»<имя_реквизита>»,);

По поводу обращения с индексом сейчас поищу на чем попробовать.

   Радим1987

49 — 20.04.17 — 14:12

В модуле ФОРМЫ (УФ)

&НаСервере
Процедура ПроверкаНаСервере()
        //Объект = ДанныеФормыСтруктура

    РТ.ВывестиСообщение(Объект,ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура Проверка(Команда)
    ПроверкаНаСервере();
КонецПроцедуры

Общий модуль серверная

Процедура ВывестиСообщение(Данные,Форма) Экспорт   
//Данные ФормыВЗначение(Объект,Тип(ДокументОбъект....)) НЕ РАБОТАЕТ при установке УстановитьСоответствиеОбъектаИФормы() ИдентификаторФормы = ПустойУникальныйИдентификатор и Объек = ""


//Поэтому только через  "Форма.РеквизитФормыВЗначение" кто не знает метод управляемой формы    

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

УстановитьСоответствиеОбъектаИФормы(Док,ИдентификаторФормыИИмяРеквизита);
             
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "услуги не существует";  
Сообщение.Поле = "Товары[0].Номенклатура";
Сообщение.УстановитьДанные(Док);
Сообщение.Сообщить();             
    

КонецПроцедуры

   Радим1987

50 — 20.04.17 — 14:14

(48) спасибо все решилось создал новую конфигурацию там работает идеально ко всем реквизитам цепляется. Но только не в моей конфигурации КА 2.2.3.178 видимо где то запрет или что нить такое

   dezss

51 — 20.04.17 — 14:21

вот так у меня все сработало…

&НаСервере

Процедура МояКомандаНаСервере()

    об = РеквизитФормыВЗначение(«Объект»);

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(«Все очень плохо»,об,»Товары[1].Номенклатура»,»Объект»);

КонецПроцедуры

&НаКлиенте

Процедура МояКоманда(Команда)

    МояКомандаНаСервере();

КонецПроцедуры

   dezss

52 — 20.04.17 — 14:23

(50) ну и хорошо.

Только зачем свой ОМ мутить, если все и так есть.

   Радим1987

53 — 20.04.17 — 14:27

(52) типовой сказали не трогать все процедуры функции только в расширение и тем более вот этот канитель не только для этого документа а для всех документов продажи покупки

  

dezss

54 — 20.04.17 — 14:35

(53) типовой конечно не трогать, но им же можно пользоваться)

Ведь всего 2 строчки

    об = РеквизитФормыВЗначение(«Объект»);

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(«Все очень плохо»,об,»Товары[1].Номенклатура»,»Объект»);

  • Главная
  • О сайте
  • Главная
  • Содержание

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

Категории

—>

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

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

Сообщение

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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



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

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

Вопрос

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




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

	Возврат;

КонецЕсли;

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

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

Методические рекомендации

Для вывода информации пользователю в 1С:Предприятии 8.2 /8.3 существует специальный механизм сообщений. В этом механизме используется объект встроенного языка СообщениеПользователю. Он находится в разделе Общие объекты в синтаксис – помощнике электронной документации платформы

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

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

Платформа позволяет указать, какие реквизиты объектов конфигурации должны автоматически проверяться на заполненность. Если в процессе работы пользователь хочет записать объект, а какой-либо реквизит этого объекта не заполнен, платформа отобразит пользователю сообщение об ошибке. Такое сообщение будет  “привязано” к элементу управления в форме. Если щелкнуть на сообщении в окне сообщений, фокус ввода перейдет на указанное поле, а рядом появится информационное окно с текстом сообщения.

Рассмотрим подробно, что при этом происходит и как можно добиться такого же поведения в своем коде. В качестве примера возьмем ситуацию проведения документа.

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

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

После этого наступает ответственный момент – форме надо предоставить информацию о том, чьё это сообщение и в каком реквизите формы хранится наш объект. Это делается для того, чтобы форма могла впоследствии привязать сообщение к нужному элементу управления. Для установки связи объект данных вызывает у объекта сообщения метод УстановитьДанные(), передавая себя в качестве параметра. При этом происходит поиск среди запомненных ранее соответствий “объект – имя реквизита формы”. Если для объекта существует значение имени реквизита формы, метод УстановитьДанные() помещает имя реквизита формы в свойство ПутьКДанным объекта СообщениеПользователю, а ссылка объекта (или ключ записи регистра) помещается в свойство КлючДанных.

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

ПРИМЕЧАНИЕ
Пока управление не передано обратно на клиента, можно получить массив сообщений методом глобального контекста ПолучитьСообщенияПользователю().

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

Если свойство КлючДанных заполнено, но в форме отсутствует реквизит с именем из свойства ПутьКДанным, то будет открыта новая форма объекта, в которую будут перенесены все сообщения с таким ключом данных (ссылкой или ключом записи регистра).

Программное создание сообщений

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

Первое, что необходимо сделать – зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИФормы(). Сделать это можно следующим образом:

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

В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени “Объект”.

Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:

 &НаСервере
 Процедура ДействиеСОбъектом(ОбъектДанных)  
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " +   НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
     Сообщение.Поле = "Номенклатура[10].Количество";      Сообщение.УстановитьДанные(ОбъектДанных); 
    Сообщение.Сообщить();
 
КонецПроцедуры;

В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары “Объект/ИмяРеквизитаФормы”. В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.

ВАЖНО
Привязка объекта к имени реквизита формы действует только для конкретного экземпляр объекта, а не для его ссылки, и живет до тех пор, пока этот экземпляр существует.

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

 &НаКлиенте
Процедура ДействиеСОбъектомНаКлиенте(ОбъектДанных)

     // Какие либо действия, которые требуют создания сообщения

    // Создание сообщения
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "В строке 11 табличной части ""Номенклатура"" не хватает " + 
                      НедостающееКоличество + " " + ЕдиницаИзмеренияНоменклатуры;
    Сообщение.Поле = "Номенклатура[10].Количество";

    // Привязка объекта к реквизиту формы "вручную"
    Сообщение.КлючДанных = ОбъектДанных.Ссылка;
    Сообщение.ПутьКДанным = "Объект";

    // Сообщение выводится пользователю
    Сообщение.Сообщить();

     // В дальнейшем сообщение будет показано в форме и привязано к
     // элементу управления, связанного с полем Количество 
    // в 11-й строке табличной части Номенклатура.
    ...
КонецПроцедуры;

ПРИМЕЧАНИЕ
Отметим, что в обоих примерах сообщение, устанавливаемое свойству Текст, указывает строку как 11-ю, а значение, устанавливаемое свойству Поле, указывает на 10-ю. Так сделано потому, что в интерфейсе строки табличных частей начинают нумерацию с 1, а в программном коде – с 0.

Примеры заполнения свойства Поле объекта СообщениеПользователю

Свойства Поле объекта содержит путь к реквизиту формы, для которого было выведено сообщение, или к данным объекта.
Например, путь к реквизиту Номенклатура в строке с индексом 10 табличной части документа, в которой произошла ошибка: ТабличнаяЧастьСоставДокумента[10].Номенклатура.

В следующей таблице показан пример заполнения:

Тип Шаблон Пример
Реквизит ИмяРеквизита Контрагент
Табличная часть ИмяТабличнойЧасти Скидки
Реквизит табличной части ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита Номенклатура[10].Количество
Реквизит набора записей [ИндексСтроки].ИмяРеквизита [10].Курс

См. также:

  • Установить Соответствие Объекта И Формы

О чем эта статья

Статья продолжает цикл статей «Первые шаги в разработке на 1С».

В ней мы рассмотрим способы информирования пользователя, которые присутствуют в платформе «1С:Предприятие» 8, а также акцентируем ваше внимание на некоторых особенностях работы этих механизмов, эти особенности связаны с режимом использования модальности.

Применимость

В статье рассматривается функциональность:

  • Интерфейса в варианте «Версии 8.2» для конфигурации, разработанной на платформе «1С:Предприятие» 8.2.19.130
  • Интерфейса «Такси» для конфигурации, разработанной на платформе «1С:Предприятие» 8.3.4.496 до 8.3.9+
  • Интерфейса «Такси» для конфигурации, разработанной на платформе «1С:Предприятие» 8.3.10-8.3.11

Как в 1С вывести сообщение пользователю

  1. Ознакомительные сообщения
  2. Механизм оповещений
  3. Терминирующие сообщения
  4. Особенности использования модальных окон в Платформе 8.3
  5. Класс СообщениеПользователю
  6. Уведомление о состоянии процесса

Вывод сообщений в пользовательском режиме решает ряд задач:

  • отражение хода выполнения текущего процесса (показ стадии выполнения процесса; показ расчетных значений, полученных в ходе работы алгоритма);
  • выдача ошибок пользователю для возможного их исправления;
  • выдача рекомендаций;

Типы сообщений:

  • терминирующие, которые останавливают выполнение программы и не дают продолжить ее, пока пользователь не ознакомится с этим сообщением и не выполнит определенные действия. Например, на экран пользователю будет выдан вопрос, на который нужно будет ответить Да или Нет. Пока пользователь не ответит – программа не выполняет дальнейшие действия;
  • ознакомительные сообщения, которые просто выводятся для пользователя и позволяют работать дальше (т.е. используются в режиме оповещения).

Терминирующими сообщениями должны быть сообщения об ошибках, а ознакомительными: рекомендации, сообщения о текущем этапе процесса и показ расчетных значений (отладочная печать).

Ознакомительные сообщения

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

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

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

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

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

Открепить от формы окно с сообщением нельзя.

Синтаксис функции:

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

Т.е. первым параметром является сам текст.

Второй параметр (статус сообщения) является необязательным. Для статуса можно указывать значения: Обычное, Важное, ОченьВажное и т.д.

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

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

Ознакомительные сообщения

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

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

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

Поэтому в концепции управляемого приложения ознакомительные сообщения рекомендуется выводить с помощью так называемых оповещений. Пример неправильного использования функции Сообщить представлен на рисунке.

Неправильное использование функции Сообщить

Тем не менее, функция Сообщить может использоваться для вывода информации о некоторых ошибках, например в момент проведения документа.

В этом случае системе можно сообщить, что форму закрывать не нужно, и показать пользователю, какие ошибки возникают при проведении документа.

Функция Сообщить полностью поддерживается в Платформе 8.3. Ее можно использовать, и она будет работать (и в файловом варианте, и в клиент-серверном).

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

Например, сообщение об ошибке можно привязать к элементу формы, что для пользователя очень наглядно. Несколько позже к рассмотрению этого вопроса мы вернемся. У функции Сообщить есть интересная особенность.

Так, программный код в Платформе 8.3 может быть исполнен как на стороне Клиента, так и на стороне Сервера.

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

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

Но функция Сообщить может быть исполнена как на стороне Клиента, так и на стороне Сервера. При этом использование метода Сообщить на Сервере вовсе не означает, что сообщение будет выводиться именно на Сервере, там их просто некуда выводить.

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

В этот момент система запросит данные из буфера и выведет их на экран.

Эта же особенность касается и класса СообщениеПользователю. На рисунке приведен пример использования метода Сообщить на стороне Сервера.

НаСервере Сообщить

В результате использования метода Сообщить на стороне Сервера вывелись сообщения на экран на стороне Клиента.

Сообщения на Клиенте

Механизм оповещений

Механизм оповещений нужен, чтобы информировать пользователя о том, что в системе “что-то” произошло и это “что-то” требует внимания пользователя. Оповещения создаются двумя сценариями:

  1. Самой платформой при интерактивной записи или изменении объекта
  2. Разработчиком при вызове в коде метода ПоказатьОповещениеПользователя().

Само оповещение представляет собой небольшое окошко, которое появляется, как правило, в нижнем правом углу и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет и можно внимательно его прочитать.

Механизм оповещений

Кроме того, к оповещениям можно обратиться в соответствующей области информационной панели (кнопка “История” слева внизу формы приложения в варианте интерфейса «Версии 8.2»).

Чтобы создавать свои собственные оповещения, необходимо использовать метод глобального контекста ПоказатьОповещениеПользователя(). Его синтаксис до редакции 8.3.10 представлен ниже:

ПоказатьОповещениеПользователя (<Текст>, <НавигационнаяССылка>, <Пояснение>, <Картинка>)

В первом параметре передается текст, который будет выводиться в оповещении.

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

С помощью третьего параметра можно передать пояснение для сообщения, т.е. какое-то расширенное описание.

Также можно присвоить картинку, отображающую статус оповещения.

Следует отметить, что все эти параметры являются необязательными для заполнения. Ниже приведен пример использования данного метода (в конфигураторе и в пользовательском режиме в варианте интерфейса «Версии 8.2»).

Механизм оповещений
Механизм оповещений

В редакции платформы 8.3.10.216 для интерфейса в варианте «Такси» механизм оповещений был существенным образом доработан с целью повышения удобства работы как в тонком, так и в веб-клиенте. По этой причине изменились и передаваемые параметры в метод ПоказатьОповещениеПользователя(). Теперь синтаксис выглядят так:

ПоказатьОповещениеПользователя(<Текст>, <ДействиеПриНажатии>, <Пояснение>, <Картинка>, <СтатусОповещенияПользователя>, <КлючУникальности>)

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

Механизм оповещений

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

Следующий параметр СтатусОповещенияПользователя появился впервые. В нем указывается статус оповещения (Информация или Важное).

В случае варианта Важное, если пользователь не отреагировал на сообщение, то после того, как оно будет скрыто с экрана, его можно будет прочитать через Центр оповещений (о нем ниже). В случае же варианта Информация, оповещение удаляется без запоминания в этом центре. Давайте перепишем код из нашего примера, как показано ниже:

Механизм оповещений

После выполнения команды получим приблизительно такой вид окна приложения:

Механизм оповещений

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

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

Механизм оповещений

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

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

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

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

Также к новым возможностям относится и одновременное отображение на экране до трех оповещений.

На этом завершим наше знакомство с программным формированием оповещений. Однако вспомним, что оповещения формируются не только разработчиком программно, но и самой платформой в момент интерактивной записи или изменения объекта. И часто этот факт вызывает непонимание в первую очередь у начинающих пользователей: зачем нужны эти служебные оповещения, которые, кстати, нельзя отключить?

Давайте представим такую простую ситуацию: пользователь установил фильтр в каком-то списке для удобства. Допустим, он сделал это в форме списка справочника Номенклатуры. Потом, через какое-то время, решил ввести новый элемент с наименованием “Стул”, который не соответствует установленному ранее фильтру. Вводит его, записывает и…? И не видит его в списке. Что будет делать среднестатистический пользователь? Конечно, введет его второй раз, но опять не увидит. Дальше может последовать третий, четвертый, пятый раз. Когда ему надоест вводить одно и тоже, он, наконец, спросит у вас: а куда все пропадает?

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

Механизм оповещений

Терминирующие сообщения

Терминирующие сообщения – это те сообщения, которые не позволят работать, пока пользователь не произведет определенные действия, т.е. пока он не обработает сообщение.

О возможности использования терминирующих сообщений в Платформе 8.3 мы поговорим немного позже (в последнее время их стараются не использовать, поэтому рассмотренный пример больше касается Платформы 8.2).

Существуют два метода для выдачи терминирующих сообщений Предупреждение и Вопрос. Предупреждение отличается от Вопроса тем, что у него есть единственная кнопка ОК.

В вопросе могут определяться разные наборы вариантов ответов (ДаНет, ДаНетОтмена, ОК, ОКОтмена, ПовторитьОтмена, ПрерватьПовторитьПропустить), которые задаются с помощью параметра.

Выведем какое-нибудь предупреждение с помощью строки (например, в модуле управляемого приложения):

Предупреждение(“Сейчас будет открыта база”);

Чтобы открыть модуль управляемого приложения, следует в дереве конфигурации выбрать объект Конфигурация, вызвать контекстное меню и выбрать пункт Открыть модуль управляемого приложения.

Открытие модуля управляемого приложения

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

Модальное окно

Аналогичным образом работает и функция Вопрос.

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

Обязательными являются только первые два параметра. Для второго параметра тип данных составной (РежимДиалогаВопрос или СписокЗначений). Третий параметр (<Таймаут>) характеризует интервал времени в секундах, в течение которого система будет ожидать ответа пользователя.

По истечении интервала окно вопроса будет закрыто. Аналогичный параметр(<Таймаут>) есть и у функции Предупреждение.

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

Модуль управляемого приложения

Использование функции Вопрос

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

Особенности использования модальных окон в Платформе 8.3

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

В этом случае использование терминирующих сообщений невозможно. В случае необходимости использования терминирующих сообщений (функции Предупреждение и Вопрос) следует изменить значение свойства конфигурации Режим использования модальности на Использовать.

Режим использования модальности

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

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

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

Браузеры для планшетных компьютеров и для телефонов в большинстве случаев вообще не поддерживают всплывающие окна.

Для замены функций Вопрос и Предупреждение разработаны новые методы: ПоказатьВопрос, ПоказатьПредупреждение.

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

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

Синтаксис функции ПоказатьПредупреждение:

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

Параметр <ОписаниеОповещенияОЗавершении> (необязательный)

Тип данных: ОписаниеОповещения.

Содержит описание процедуры, которая будет вызвана после закрытия окна предупреждения.

Синтаксис функции ПоказатьВопрос:

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

Обязательными являются первые три параметра.

Ниже приведен пример использования функции.

Процедура ОписаниеОповещения

Пример функции оповещения в 1С

Класс СообщениеПользователю

Основное удобство класса сообщений СообщениеПользователю заключается в том, что это контекстное сообщение (в отличии от методов Предупреждение и Вопрос).

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

Следует обратить внимание, что, во-первых, данный объект нужно создавать. Например: Сообщение = Новый СообщениеПользователю;

Таким образом мы создаем экземпляр данного объекта.

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

В-третьих, в свойстве Поле можно указать, к какому элементу формы данное сообщение должно быть привязано.

Внимание! Для привязки к нужному полю формы обратите внимание на инициализацию свойств ПутьКДанным и КлючДанных. Применительно для документа при размещении кода в модуле объекта можно писать:

Сообщение.ПутьКДанным = “Объект”;
Сообщение.КлючДанных = ЭтотОбъект.Ссылка;

Чтобы открыть модуль документа, следует в окне редактирования объекта (документа) на закладке Прочее нажать на кнопку Модуль объекта.

Для эксперимента в модуле объекта какого-либо документа разместим код.

Сообщение пользователю

Ниже представлен полученный в пользовательском режиме результат для Платформы 8.3.

Сообщение пользователю в пользовательском режиме 1С

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

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

Соответственно, в момент обнаружения ошибок отменяется транзакция, т.е. запрещается запись элемента справочника, либо запрещается проведение документа.

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

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

Уведомление о состоянии процесса

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

Синтаксис: Состояние(<ТекстСообщения>, <Прогресс>, <Пояснение>, <Картинка>)
Параметры: <ТекстСообщения> и <Пояснение> – не обязательные, тип – Строка.
Текст выводится на специальную панель состояния.
<Прогресс> параметр тоже необязательный, но наглядный.
Тип: Число. Значение индикатора прогресса (от 1 до 100).
<Картинка> тоже необязательный параметр.
При обработке какого-либо события могут использоваться периодические вызовы функции типа:

Вызов функции

При этом могут меняться надписи, а могут изменяться значения параметра Прогресс.

Функция может вызываться как из одной процедуры (функции), так и из нескольких. Таким образом можно отслеживать состояние выполнения процесса.

Состояние выполнения процесса

Если вы хотите ознакомиться с механизмом уведомления более подробно, то прямо сейчас прервитесь и прочтите нашу новую статью Отображение прогресса длительных операций в 8.3.10. В ней уже не на уровне новичка объясняются все тонкости и подводные камни работы этого механизма.

Мы же завершаем знакомство со способами информирования пользователя. Надеемся, что у вас сложилось понимание, в каких ситуациях следует применять тот или иной способ.

Хочется еще раз акцентировать ваше внимание на том факте, что если ваша конфигурация (версии 8.3.3+) предполагает работу с помощью веб-клиента, то:

  • на уровне конфигурации должна быть установлена настройка режима модальности «Не использовать»
  • в коде должны использоваться методы асинхронной модели взаимодействия с пользователем. Такие методы начинаются со слов Показать или Начать.

Более подробно об отказе от использования модальных окон в платформе 1С:Предприятие 8.3 можно почитать в финальной статье цикла. А мы идем дальше и, наконец, приступаем к изучению долгожданного интерфейса «Такси», который уже не раз упоминался в наших материалах.

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Статья по программированию - в PDF-формате

Полезные ссылки:

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

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

Если Ваша конфигурация применяет БСП, то рекомендуется использовать процедуры БСП для вывода сообщений пользователям.

Примеры вывода сообщений

Если обращение «с сервера», то для вывода сообщения пользователю можно применять следующую процедуру БСП:

ОбщегоНазначения.СообщитьПользователю(«Текст сообщения»);

Если обращение «с клиента», то для вывода сообщения пользователю можно применять следующую процедуру БСП:

ОбщегоНазначенияКлиент.СообщитьПользователю(«Текст сообщения»);

Устаревшая процедура, но которая еще используется в конфигурациях на предыдущих версиях БСП:

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(«Текст сообщения»);

Пример вывода сообщения об ошибке:

Попытка
    ФайлCSV.Прочитать(ПутьКФайлу);
Исключение
    ОбщегоНазначенияКлиент.СообщитьПользователю(«Не удалось загрузить файл: « + ПутьКФайлу + Символы.ПС + ОписаниеОшибки());
КонецПопытки;

Общий синтаксис процедуры:

// Формирует и выводит сообщение, которое
может быть связано с элементом управления формы.
//
// Параметры:
// 
ТекстСообщенияПользователю — Строка — текст сообщения.
// 
КлючДанных — ЛюбаяСсылка — объект или ключ записи информационной базы, к
которому это сообщение относится.
// 
Поле — Строка — наименование реквизита формы.
// 
ПутьКДанным — Строка — путь к данным (путь к реквизиту формы).
// 
Отказ — Булево — выходной параметр, всегда устанавливается в значение
Истина.

Процедура СообщитьПользователю(
    Знач ТекстСообщенияПользователю,
    Знач КлючДанных = Неопределено,
    Знач Поле = «»,
    Знач ПутьКДанным = «»,
    Отказ = Ложь) Экспорт

Примеры:

// 1. Для вывода сообщения у поля
управляемой формы, связанного с реквизитом объекта:
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр(«ru = ‘Сообщение об ошибке.'»), , «ПолеВРеквизитеФормыОбъект», «Объект»);

// Альтернативный вариант использования в
форме объекта:
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр(«ru = ‘Сообщение об ошибке.'»), , «Объект.ПолеВРеквизитеФормыОбъект»);

// 2. Для вывода сообщения рядом с полем
управляемой формы, связанным с реквизитом формы:
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр(«ru = ‘Сообщение об ошибке.'»), , «ИмяРеквизитаФормы»);

// 3. Для вывода сообщения связанного с
объектом информационной базы:
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр(«ru = ‘Сообщение об ошибке.'»), ОбъектИнформационнойБазы, «Ответственный»,,Отказ);

// 4. Для вывода сообщения по ссылке на
объект информационной базы:
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр(«ru = ‘Сообщение об ошибке.'»), Ссылка, , , Отказ);

Случаи некорректного использования:

1. Передача одновременно параметров КлючДанных и ПутьКДанным.

2. Передача в параметре КлючДанных значения типа отличного от допустимого.

3. Установка ссылки без установки поля (и/или пути к данным).

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

Понравилась статья? Поделить с друзьями:
  • 200960 санкт петербург сортировочный центр время работы
  • 250 тыс на открытие бизнеса от государства как получить
  • 250 тысяч рублей на развитие бизнеса в нижнем новгороде
  • 250 тысяч рублей на развитие бизнеса самозанятым отзывы
  • 250000 рублей на открытие бизнеса от государства отзывы