УФ. Информационные сообщения пользователям при "Записать и закрыть" или "Провести и закрыть".

11.10.13

Задачи пользователя - Адаптация типовых решений

Как показать пользователю некритические информационные сообщения если он нажал "Записать и закрыть" или "Провести и закрыть".

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

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

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

В итоге реализовал так (для записи элемента справочника, для документов реализация будет подобной же):

1. В форме элемента создал реквизит МассивСообщений типа СписокЗначений для хранения перехваченных с сервера сообщений пользователю.

2. Процедура ПослеЗаписиНаСервере()

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    МассивСообщений.Очистить();

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

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

    ФиксМассивСообщений = ПолучитьСообщенияПользователю(Истина);

//Записываем сообщения в список значений (реквизит формы МассивСообщений)
    Для Сч = 0 По ФиксМассивСообщений.Количество() - 1 Цикл
        МассивСообщений.Добавить(ФиксМассивСообщений.Получить(Сч));
    КонецЦикла;
КонецПроцедуры

 

3. Процедура ПослеЗаписи()

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)

//Если сообщения есть, то инициируем их показ пользователю
    Если МассивСообщений.Количество() > 0 Тогда
        ПоказатьСообщенияПользователю();
        МассивСообщений.Очистить();
    КонецЕсли;
КонецПроцедуры

 

4. Создал процедуру ПоказатьСообщенияПользователю()

&НаКлиенте
Процедура ПоказатьСообщенияПользователю()
    Для Каждого Сообщение Из МассивСообщений Цикл

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

//чтобы пользователь увидел сообщения перед закрытием формы
        Предупреждение("" + Сообщение.Значение.Текст);
    КонецЦикла;
КонецПроцедуры

 

 

Все вышеописанные процедуры описаны в модуле формы.

Сообщение Провести и закрыть Сохранить и закрыть

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4454    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

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

7200 руб.

02.08.2023    2957    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1294    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    1996    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RailMen 823 12.10.13 00:46 Сейчас в теме
Довольно популярная задачка.

Есть несколько мыслей вслух:
1) реквизит формы МассивСообщений типа СписокЗначений лучше назвать СписокСообщений.
2) показывать столько Предупреждений, сколько и сообщений не совсем правильно. Представим, что сообщений 10 - тогда пользователь вынужден будет 10 раз закрывать окошки.
2. iRounder 99 12.10.13 17:02 Сейчас в теме
Да вариантов реализации может быть масса, например создание реквизита формы не интерактивно, а программно. Каждый под себя допилит :)
У меня максимум 2 сообщения - поэтому мне удобнее показывать по очереди.
Публиковал не как идеальное решение - а как идею :)
3. nixel 1404 16.10.13 17:10 Сейчас в теме
Я для этих целей использую более простой на мой взгляд вариант - показ СообщенияПользователю в основном окне.

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

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

КонецПроцедуры
Показать


Кода много. Но основная фишка вот здесь -
СообщениеОсновноеОкно.ПутьКДанным = ОсновноеОкно.ПолучитьНавигационнуюСсылку();

ОсновноеОкно.Активизировать();
СообщениеОсновноеОкно.Сообщить();
ЭтаФорма.Окно.Активизировать();
4. iRounder 99 16.10.13 20:16 Сейчас в теме
Я пытался сделать так же. Только нужно было когда пользователь нажмет просто "Записать" или "Провести", то сообщения показывать в форме элемента/документа, а если "Записать и закрыть" или "Провести и закрыть", то в главном окне. Однако на моей версии платформы не взлетело - в любых случая показывало в главном окне. Меня это не устраивало.
5. guy_septimiy 30.10.17 13:46 Сейчас в теме
Если в конфигурации есть форма рабочего стола, то кажется, что можно было использовать Оповестить и ОбработкаОповещения в этой форме. Показывать модальные предупреждения сейчас вроде как уже не в моде?
6. vl-sher1 42 22.02.22 16:04 Сейчас в теме
У меня работает так (БП 3.0.52.36, платформа 8.3.19.1467, тонкий и толстый клиент):
// Модуль "закрываемой" формы:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи) 
	Если ПараметрыЗаписи.Свойство("Сообщения") Тогда 
		ПустойУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
		Для Каждого Элемент Из ПараметрыЗаписи.Сообщения Цикл
		    Сообщение = Элемент;
		    Сообщение.ИдентификаторНазначения = ПустойУИД;
		    Сообщение.Сообщить();
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

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

// Код вывода сообщения (в серверных процедурах)
// ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Сообщение");
Показать

Взято частично отсюда.
Оставьте свое сообщение