Предисловие
Эта статья - логическое продолжение материала Сообщения пользователю при нажатии "Записать/Провести и закрыть". Предложенный тогда подход решил задачу вывода сообщений, но, как справедливо заметили читатели в комментариях, метод оказался недостаточно универсальным: для каждой формы требовалось прописывать индивидуальную логику, работать с элементами стандартных команд напрямую, а сам код был тесно переплетён с конкретной реализацией.
Более того, предложенный способ сложно поддерживать - при доработке нескольких форм начинается дублирование, растёт риск ошибок, а любое изменение логики превращается в рутинный обход всех точек внедрения. Всё это указывало на то, что решение нужно упаковать иначе.
Поэтому вся рабочая функциональность была вынесена в отдельные общие модули. Теперь подключение формы к механизму вывода сообщений сводится к нескольким шаблонным вставкам - быстрым, однотипным и не требующим погружения в детали реализации. Модули берут на себя и переопределение стандартных команд, и сохранение сообщений, и их отложенный вывод после закрытия формы. Разработчику остаётся лишь разместить вызовы в нужных обработчиках событий.
В этой статье я покажу, как работает модуль «СообщенияПриЗакрытииФормы», и как внедрить его в конфигурацию или расширение за считанные минуты.
Описание
Модуль "СообщенияПриЗакрытииФормы" расположен на github и предназначен для вывода сообщений пользователю, сформированных в обработчиках записи основного реквизита формы, при нажатии пользователем команд, повлекших за собой запись данных и последующее закрытие формы. Например:
- Записать и закрыть
- Провести и закрыть
- "Да", в ответ на вопрос о необходимости сохранения данных при закрытии модифицированной формы
По стандарту, как только контекст переходит на клиент, то сообщения выводятся, и привязываются к текущей форме. Далее эта форма закрывается унося с собой все выведенные сообщения. Данный модуль решает эту проблему.
Модуль работает по принципу:
- Переопределяем стандартные команды влекущие запись и закрытие формы (для фиксации факта нажатия, т.к. платформа не предоставляет подобной информации, мы не знаем была ли нажата кнопка "Записать" или "Записать и закрыть")
- Перед передачей контекста на клиент сохраняем сообщения в реквизите формы
- При закрытии формы выводим сохраненные сообщения. Они привязываются к активному окну.
Более подробно об идее в статье Сообщения пользователю при нажатии "Записать/Провести и закрыть"
Зависимости
Для работы модуля необходима подсистема "Базовая функциональность" библиотеки стандартных подсистем.
Использование
Внедрение в конфигурацию
Можно выбрать из двух вариантов - сравнение с файлом конфигурации или копирование модулей.
Сравнение объединение
- Запустить сравнение-объединение конфигурации с файлом cf из поставки
- Отметить по подсистеме "СообщенияПриЗакрытииФормы"
- Объединить
Ручной перенос
Необходимо перенести в конфигурацию/расширение 2 модуля:
- СообщенияПриЗакрытииФормы
- СообщенияПриЗакрытииФормыКлиент
Настройка форм
Для подключения форм, необходимо:
-
В процедуру
ПриСозданииНаСервере(обработчик события формы) вставить вызов:СообщенияПриЗакрытииФормы.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка, "Объект");- Заменить "Объект" на имя основного реквизита формы (При необходимости).
- В случае, если на форме отсутствуют стандартные команды, такие как "Провести и закрыть", "Записать и закрыть" и т.п., то в пятый, необязательный, параметр
ПереопределитьСтандартныеКомандыможно передатьЛожь. При этом, подразумевается наличие на форме произвольных, созданных в конфигураторе/программно, команд, выполняющих запись данных формы и её последующее закрытие. В обработчиках этих произвольных команд следует вызывать процедурыСообщенияПриЗакрытииФормыКлиент.ОбработчикКоманды...либо самостоятельно устанавливать флаг (реквизит формы, созданный вСообщенияПриЗакрытииФормы.ПриСозданииНаСервере)НажатоЗаписатьИЗакрыть.
Примеры:&НаКлиенте Процедура ПроизвольнаяКомандаЗаписатьИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыЗаписатьИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры&НаКлиенте Процедура ПроизвольнаяКомандаЗаписатьИЗакрыть(Команда) ЭтотОбъект.НажатоЗаписатьИЗакрыть = Истина; // Запись и закрытие формы КонецПроцедуры
-
В процедуру
ПослеЗаписиНаСервере(обработчик события формы) вставить вызов:СообщенияПриЗакрытииФормы.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); -
В процедуру
ПриЗакрытии(обработчик события формы) вставить вызов:СообщенияПриЗакрытииФормыКлиент.ПриЗакрытии(ЭтотОбъект, ЗавершениеРаботы); -
В процедуру
ПередЗакрытием(обработчик события формы) вставить вызов:СообщенияПриЗакрытииФормыКлиент.ПередЗакрытием(ЭтотОбъект, Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка); -
В модуль формы вставить процедуру:
&НаКлиенте Процедура Подключаемый_ПередЗакрытиемПродолжение(Результат, ДополнительныеПараметры) Экспорт СообщенияПриЗакрытииФормыКлиент.ПередЗакрытиемПродолжение(ЭтотОбъект, Результат, ДополнительныеПараметры); КонецПроцедуры
Форма документа
- В модуль формы вставить процедуры (Если
ПереопределитьСтандартныеКоманды = Истина):&НаКлиенте Процедура Подключаемый_ПровестиИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыПровестиИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ЗаписатьИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыЗаписатьИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры
Форма бизнес-процесса
- В модуль формы вставить процедуру (Если
ПереопределитьСтандартныеКоманды = Истина):&НаКлиенте Процедура Подключаемый_СтартИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыСтартИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры
Форма задачи
- В модуль формы вставить процедуру (Если
ПереопределитьСтандартныеКоманды = Истина):&НаКлиенте Процедура Подключаемый_ВыполнитьИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыВыполнитьИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры
Остальные формы
- В модуль формы вставить процедуру (Если
ПереопределитьСтандартныеКоманды = Истина):&НаКлиенте Процедура Подключаемый_ЗаписатьИЗакрыть(Команда) СообщенияПриЗакрытииФормыКлиент.ОбработчикКомандыЗаписатьИЗакрыть(ЭтотОбъект, Команда); КонецПроцедуры
К "остальным" относятся формы, на которых стандартная команда называется "Записать и закрыть". К таким формам относятся формы элемента/записи следующих типов метаданных:
- справочник
- план видов характеристик
- план видов расчета
- план счетов
- регистр сведений
Итог
Модуль "СообщенияПриЗакрытииФормы" реализует отложенный вывод сообщений, сформированных при записи. Логика перехвата и вывода вынесена в общие модули, поэтому подключение формы ограничивается несколькими вызовами в обработчиках. Решение работает для документов, справочников, бизнес-процессов и других объектов - как со стандартными командами закрытия, так и с произвольными. Пользователь при любом сценарии завершения работы с формой видит адресованные ему сообщения, сгенерированные в обработчиках записи объекта.
Вступайте в нашу телеграмм-группу Инфостарт