При разработке интерфейсов в среде «1С:Предприятие 8.3» на управляемых формах часто возникает задача сделать проверку заполнения полей максимально лаконичной и понятной для пользователя. Стандартный механизм работы объекта СообщениеПользователю устроен так, что при привязке текста к конкретному элементу (через свойства Поле или ПутьКДанным) платформа одновременно выполняет два действия: подсвечивает само поле красным маркером с подсказкой и открывает общую панель сообщений внизу экрана.
Многих разработчиков не устраивает появление большой нижней панели, которая перекрывает рабочую область формы, особенно если на форме всего одна мелкая ошибка. В этой статье мы подробно разберем, как обойти это ограничение платформы, проанализируем возможные «костыли», рассмотрим их недостатки и изучим штатные альтернативные методы валидации данных.
Прежде чем переходить к программным методам управления интерфейсом, выясним причину такого поведения системы. В свойствах корневого объекта конфигурации существует параметр «Отображение сообщений». Если установить его в значение «Всплывающее», сообщения будут группироваться и выводиться в виде всплывающих уведомлений.
Однако архитектура платформы спроектирована жестко: если у сообщения заполнено поле привязки, оно в любом случае дублируется в общем списке сообщений. Полностью отключить нижнее окно программно, используя исключительно свойства объекта СообщениеПользователю, невозможно. Тем не менее, существуют практические способы решения этой проблемы.
Рассмотрим обходной путь, который часто используется разработчиками для быстрого закрытия панели сообщений сразу после ее появления. Этот метод основан на имитации нажатия горячих клавиш Ctrl + Shift + Z, которые в платформе 1С отвечают за открытие и закрытие панели сообщений. Для автоматизации подобных действий и имитации работы пользователя в интерфейсе без применения API можно использовать платформу One RPA для создания программных роботов.
Для реализации этого метода на клиенте создается объект Windows Script Host, который отправляет операционной системе команду нажатия клавиш. Посмотрим на пример кода:
&НаКлиенте
Процедура ПослеВыводаСообщения()
// Выводим сообщение пользователю с привязкой к полю
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле заполнено некорректно!";
Сообщение.Поле = "Объект.ИмяРеквизита";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
// Эмулируем нажатие клавиш Ctrl+Shift+Z для закрытия всплывающей панели
Попытка
Wsh = Новый COMОбъект("Wscript.Shell");
Wsh.SendKeys("^+(Z)");
Исключение
// Обработка исключения, если запуск COM-объекта запрещен настройками безопасности
КонецПопытки;
КонецПроцедуры
Проанализируем ключевые недостатки и «подводные камни» использования SendKeys:
^+(Z) попросту проигнорирует нажатие.Wscript.Shell возможно только на операционной системе Windows и при наличии соответствующих прав у пользователя. В веб-клиенте или под управлением Linux данный код вызовет ошибку.Чтобы избежать нестабильного кода с эмуляцией клавиатуры, рекомендуется использовать заложенные в платформу механизмы валидации. Если мы хотим, чтобы маркеры ошибок появлялись аккуратно у полей и не вызывали навязчивую нижнюю панель, следует использовать стандартное событие формы ОбработкаПроверкиЗаполненияНаСервере.
Для реквизитов формы, которые обязательно должны быть заполнены, достаточно установить свойство «Автоотметка незаполненного» в значение «Истина». В этом случае платформа сама находит пустые поля и подсвечивает их без вызова громоздких окон.
Если же проверка комплексная и требует написания программной логики, выполним ее в модуле формы:
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
// Проверяем логическое условие
Если Объект.Сумма < 0 Тогда
// Формируем сообщение, привязанное к полю
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сумма не может быть отрицательной!";
Сообщение.Поле = "Объект.Сумма";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
// Устанавливаем отказ, чтобы платформа зафиксировала ошибку валидации
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
При использовании стандартного механизма проверки заполнения платформа более интеллектуально управляет отображением интерфейса. В современном интерфейсе «Такси» такие сообщения группируются в лаконичные всплывающие облака непосредственно рядом с элементами формы и не загромождают нижнюю часть экрана.
Если перед нами стоит задача просто проинформировать пользователя о каком-то событии или некритичной ошибке, не требующей жесткой фиксации на форме, отличной альтернативой объекту СообщениеПользователю является метод ПоказатьОповещениеПользователя.
Этот метод выводит аккуратное, плавно исчезающее окно в правом нижнем углу экрана. Оно не блокирует интерфейс, не открывает никаких нижних панелей и автоматически закрывается через несколько секунд.
Рассмотрим пример вызова такого оповещения:
&НаКлиенте
Процедура ВыполнитьОповещение()
ТекстОповещения = "Документ успешно проверен, но рекомендуется заполнить спецификацию.";
ПоказатьОповещениеПользователя(
"Внимание",
ПолучитьНавигационнуюСсылку(Объект.Ссылка),
ТекстОповещения,
БиблиотекаКартинок.Информация
);
КонецПроцедуры
Важное ограничение: данный метод сообщает информацию в целом по контексту, но он не позволяет визуально «приклеить» маркер ошибки к конкретному полю ввода на форме (например, к полю «Контрагент» или «Договор»).
Иногда появление нижней панели сообщений провоцируется потерей фокуса элемента формы при записи или выполнении команды. Опытные разработчики используют прием принудительной установки фокуса. Если сразу после вывода сообщения перевести фокус на проблемный элемент формы, платформа может приоритетно отрисовать подсказку возле поля ввода, минимизируя акцент на общей панели сообщений.
Для этого используется свойство формы ТекущийЭлемент:
&НаКлиенте
Процедура ПроверитьИФокусировать()
Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Необходимо заполнить контрагента!";
Сообщение.Поле = "Объект.Контрагент";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
// Принудительно возвращаем фокус на поле ввода
ТекущийЭлемент = Элементы.Контрагент;
КонецЕсли;
КонецПроцедуры
Мы проанализировали различные методы управления всплывающими сообщениями в 1С. Использование эмуляции клавиш через Wscript.Shell является нестабильным решением («костылем»), применимым только в закрытых корпоративных средах Windows с одинаковой языковой раскладкой у пользователей. Для разработки тиражируемых и надежных решений настоятельно рекомендуется использовать встроенный механизм проверки заполнения (событие ОбработкаПроверкиЗаполнения) в сочетании с переходом на современный интерфейс «Такси», где логика отображения ошибок изначально оптимизирована под удобство пользователя.