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