Сообщения пользователю при нажатии "Записать/Провести и закрыть"

21.01.26

Разработка - Работа с интерфейсом

Вывод сообщений пользователю, которые были сформированы в модуле объекта, при нажатии стандартных команд: "Записать и закрыть", "Провести и закрыть".

Введение

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

 

Решение

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

 

 

Наши неблокирующие (информационные) сообщения, формируемые в модуле объекта, при передаче контекста на клиент тут же выводятся на форму. А затем происходит её закрытие. Рассматриваемое решение заключается в том, что мы:

  1. Переопределим стандартную команду, чтобы понимать, когда нажато "Провести и закрыть", а когда просто "Провести" или "Записать"
  2. Перехватим сообщения до передачи контекста на клиент (В событии "После записи на сервере")
  3. Вызовем метод Сообщить() у перехваченных сообщений, когда окна формы уже не будет (в событии "При закрытии"), тем самым привязав сообщения к какому-то окну, которое активизировалось после закрытия нашей формы.

Ниже приведен пример кода, реализующий данную схему. Реализация сделана в расширении (префикс спз_) т.к. на практике это самый частый случай при внедрениях.

 
 Модуль формы документа

 

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

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

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

&НаКлиенте
Процедура спз_ПриЗакрытииПосле(ЗавершениеРаботы)
	
	// В этом событии формы уже как бы нет, и новые сообщения будут выводиться на активное окно
	Если ЭтотОбъект.спз_НажатоПровестиИЗакрыть Тогда
		Для каждого Сообщение Из ЭтотОбъект.спз_СообщенияПользователю Цикл
			Сообщение.Сообщить();
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

 

На мой взгляд, самое интересное, на что стоит обратить внимание в данном коде, - это обращение к элементам формы, которые автоматически генерируются платформой. "Элементы.ФормаПровестиИЗакрыть" - это элемент стандартной команды. Он не был добавлен на форму через редактор. Другие элементы, привязанные к стандартным командам (например, "Записать и закрыть" для справочника, "Записать", "Провести") можно посмотреть через отладку в коллекции "Элементы" формы.

Если данное решение кажется нестабильным, то второй вариант - отключение стандартных команд через свойство "Состав команд" формы и добавление с нуля своих, аналогичных. Как отключить программно стандартную команду, я не знаю. В редакторе формы есть свойство "Состав команд", а в свойствах типа "ФормаКлиентскогоПриложения" ничего подобного нет, и, по логике вещей, быть не может, так как в обработчике "ПриСозданииНаСервере" все команды из состава уже сформированы на форме. Наверное, единственный вариант убрать их программно - это всё так же обращаться к предопределённым элементам Элементы.ИмяСтандартнойКоманды и удалять или скрывать их уже после того, как они были созданы. Поэтому такой вариант был отброшен, и мы просто подменяем действие кнопки формы на нашу команду.

 

Итог

 

 

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

  • Сохраняет логику работы - не заменяет сообщения на предупреждения и другие способы коммуникации с пользователем.
  • Является универсальным - работает для документов, справочников и других объектов.

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

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

31720 руб.

27.03.2025    75175    47    36    

58

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

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

36600 руб.

28.08.2025    6569    2    2    

6

Работа с интерфейсом Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия Платные (руб)

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

6100 руб.

14.01.2016    59669    22    25    

47

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    1662    3    0    

2

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    47609    mrXoxot    44    

138

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    25979    smielka    38    

114

Инструментарий разработчика Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    17215    180    acces969    31    

132
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SirAlex 21.01.26 14:11 Сейчас в теме
Интересно, а если я подобные статьи буду публиковать, то их заминусуют или пару плюсов всё же получу?
3. krasnoshchekovpavel 238 21.01.26 15:15 Сейчас в теме
(1) Все будет хорошо
5. 3gf 21.01.26 15:49 Сейчас в теме
6. SirAlex 21.01.26 17:35 Сейчас в теме
(5) Извиниться не хотите?
Вижу информацию о вас 13 лет 11 месяцев на сайте и нет публикаций.
От вас примера явно ждать не стоит.
paybaseme; +1 Ответить
2. Kr00mnik 21.01.26 14:57 Сейчас в теме
Здорово, но решение какое-то половинчатое.
Я бы предложил добавить на форму один элемент HTML - и в него перенести всю логику форму, скорректировав то, что нужно.
Ну или как вариант написать свою версию платформы 1С с нуля.
4. krasnoshchekovpavel 238 21.01.26 15:18 Сейчас в теме
(2) Если есть идея как добиться того же эффекта без переопределения стандартных команд на свои - будет интересно с этим ознакомиться
7. Serg O. 318 21.01.26 18:42 Сейчас в теме
у Леонтьева в первых (общих) видео для подготовки к Спец по платформе было решение данной задачи
и вроде как проще... в 2х функциях что-то было без всяких переопределений кнопок
8. krasnoshchekovpavel 238 21.01.26 19:15 Сейчас в теме
(7) В видео https://www.youtube.com/watch?v=g01JjSqLELk&list=PLh28ogpgRJUPQDnx1uV9p19jLbpyBa3ua&index=­37 Леонтьев рассмотрел три способа.
1 и 2 способ - вывод сообщений в событии ПослеЗаписи.
3 способ - он переопределил стандартную команду ПровестиИЗакрыть и в ней сделал:
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
Записать(ПараметрыЗаписи);
Закрыть();

(По сути то же самое что делает и стандартная команда) и сообщение вывелось.

Все три способа магические и на 27 платформе (проверил) уже не работают.
Xershi; Sindbad_M; +2 Ответить
18. Xershi 1543 01.02.26 13:10 Сейчас в теме
(8) спасибо за видео. Много воды только на 11 минуте до сути вопроса добрались.
И там интересная мысль. Можно в параметры записи добавить свою переменную и потом её проверять и выводить сообщения. Вопрос очень легко и универсально дорабатывается!
23. Fruit83 28 22.02.26 22:47 Сейчас в теме
(8) У меня тоже не работает, но потом взглянул на схему событий при нажатии команды "Записать и закрыть" приведенную тут и понял почему.... Перенес код из процедуры ПослеЗаписи в ПриЗакрытии и все взлетело.
9. rozer 315 22.01.26 08:52 Сейчас в теме
На практике не встречался чтобы нужно было сообщение выводить если НЕ ошибка. Кстати в типовых и нет сообщений "пользователю" при проведении, записи и чуть что отказ=истина, форма не закрыта и все отчетливо видно.
mrChOP93; +1 Ответить
19. Xershi 1543 01.02.26 13:12 Сейчас в теме
(9) а у меня такие кейсы регулярно. Например, ввели регулирования цен, наценку нельзя давать выше 10 процентов или продавать ниже себестоимости. Проводить должно давать, но сказать пользователю что не получит ЗП рекомендуется))
10. SerVer1C 1039 22.01.26 11:52 Сейчас в теме
Ваш метод - жесточайший костыль. Он не универсален. Придётся переписать все формы, чтобы подобное везде заюзать. Это НЕ универсально.
Есть обкатанный механизм: создается РС для сообщений, в предопределенных событиях мы кладём сообщение в этот РС с привязкой его к сеансу. А фоновое задание читает этот РС каждые N секунд и пуляет сообщения юзерам согласно их сеансам. В итоге: пользователь в любом случае получит сообщение через (N/2 в среднем) секунд после закрытия формы.
11. krasnoshchekovpavel 238 22.01.26 13:15 Сейчас в теме
(10) Под универсальностью я подразумевал то, что метод можно использовать во всех формах с подобными командами. Я не считаю это костылем. Это один из вариантов решения. Ваш вариант тоже имеет свои плюсы и минусы и каждый выберет в контексте специфики задачи и конфигурации свой метод.
12. Spacer 364 23.01.26 10:09 Сейчас в теме
Мне кажется п.1 - это лишнее. Достаточно п.2 и п.3
13. krasnoshchekovpavel 238 23.01.26 11:10 Сейчас в теме
(12) Если я правильно понял речь о "1. Переопределим стандартную команду, чтобы понимать, когда нажато "Провести и закрыть", а когда просто "Провести" или "Записать"". Если смоделировать вариант логики без этого пункта, то будет ясно, что без него не обойтись.
14. kMidas 15 23.01.26 15:17 Сейчас в теме
А ещё есть вариант - в проведенном документе не кнопкой "Провести и закрыть" пользуются, а "крестиком", соглашаясь на изменения...
mrChOP93; triviumfan; krasnoshchekovpavel; +3 Ответить
15. krasnoshchekovpavel 238 23.01.26 16:10 Сейчас в теме
(14) Спасибо что обратили на это внимание! Описанный в статье метод это не учитывает и я об этом даже не задумывался.
16. Xershi 1543 01.02.26 08:01 Сейчас в теме
(15) по поводу переопределения, разве типовой код сам не добавляет этот признак закрывается форма или нет?
Я сам делал проверку, что вывод сообщения только, если форма не закрывается. А вот вывести сообщение при закрытии прикрепив его к другой форме интересная идея.
20. krasnoshchekovpavel 238 01.02.26 14:43 Сейчас в теме
(16) в свойствах формы, параметра событий записи нет признака, который бы указывал на то, что форма будет в дальнейшем закрыта
21. Xershi 1543 01.02.26 14:49 Сейчас в теме
(20) у вас типовая конфигурация? Этот признак бсп мне кажется добавляет.
Завтра буду делать доработку, напишу более точно.
17. Xershi 1543 01.02.26 08:07 Сейчас в теме
По факту нам нужно проверить
Нет ли отказа, сделать реквизит куда сохранить сообщения потому что сообщения на сервере забираем, а выводим на клиенте, и потом если он заполнен вывести.
22. plushko 35 20.02.26 16:56 Сейчас в теме
Я использую
ПоказатьОповещениеПользователя
+ самодельный регистр сведений "УведомленияКлиентамОтСервера" и подключённый при запуске программы обработчик ожидания "СообщенияПользователям", который раз в минуту ищет + адресно сообщает + отмечает в регистре, что сообщение отправлено. В этих оповещениях удобно использовать ссылку на объект (клик по сообщению открывает объект, про который идёт оповещение), а также картинки в заголовок из библиотеки. Мои пользователи быстро привыкли к хорошему и стандартные
Сообщить
и
СообщениеПользователю.Сообщить
воспринимают как информацию, которую не хочется принимать во внимание.
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация