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

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"!

29280 руб.

27.03.2025    67048    41    29    

53

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

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

36600 руб.

28.08.2025    5180    2    2    

5

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

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

6088 руб.

17.10.2025    1361    3    0    

2

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

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

6100 руб.

14.01.2016    59168    20    25    

46

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

Обработка предназначена для создания и управления дашбордами (виджетами) в 1С.

5246 руб.

29.06.2020    23501    33    6    

52

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

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

20.08.2024    45992    mrXoxot    44    

138

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

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

27.05.2024    25596    smielka    38    

112

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

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

3 стартмани

10.04.2023    16950    180    acces969    31    

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

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

Все три способа магические и на 27 платформе (проверил) уже не работают.
Sindbad_M; +1 Ответить
9. rozer 314 22.01.26 08:52 Сейчас в теме
На практике не встречался чтобы нужно было сообщение выводить если НЕ ошибка. Кстати в типовых и нет сообщений "пользователю" при проведении, записи и чуть что отказ=истина, форма не закрыта и все отчетливо видно.
10. SerVer1C 998 22.01.26 11:52 Сейчас в теме
Ваш метод - жесточайший костыль. Он не универсален. Придётся переписать все формы, чтобы подобное везде заюзать. Это НЕ универсально.
Есть обкатанный механизм: создается РС для сообщений, в предопределенных событиях мы кладём сообщение в этот РС с привязкой его к сеансу. А фоновое задание читает этот РС каждые N секунд и пуляет сообщения юзерам согласно их сеансам. В итоге: пользователь в любом случае получит сообщение через (N/2 в среднем) секунд после закрытия формы.
11. krasnoshchekovpavel 189 22.01.26 13:15 Сейчас в теме
(10) Под универсальностью я подразумевал то, что метод можно использовать во всех формах с подобными командами. Я не считаю это костылем. Это один из вариантов решения. Ваш вариант тоже имеет свои плюсы и минусы и каждый выберет в контексте специфики задачи и конфигурации свой метод.
12. Spacer 364 23.01.26 10:09 Сейчас в теме
Мне кажется п.1 - это лишнее. Достаточно п.2 и п.3
13. krasnoshchekovpavel 189 23.01.26 11:10 Сейчас в теме
(12) Если я правильно понял речь о "1. Переопределим стандартную команду, чтобы понимать, когда нажато "Провести и закрыть", а когда просто "Провести" или "Записать"". Если смоделировать вариант логики без этого пункта, то будет ясно, что без него не обойтись.
14. kMidas 15 23.01.26 15:17 Сейчас в теме
А ещё есть вариант - в проведенном документе не кнопкой "Провести и закрыть" пользуются, а "крестиком", соглашаясь на изменения...
triviumfan; krasnoshchekovpavel; +2 Ответить
15. krasnoshchekovpavel 189 23.01.26 16:10 Сейчас в теме
(14) Спасибо что обратили на это внимание! Описанный в статье метод это не учитывает и я об этом даже не задумывался.
Для отправки сообщения требуется регистрация/авторизация