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