Как заменить стандартный восклицательный знак в предупреждении на зеленую галочку в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Почему стандартный метод ПоказатьПредупреждение() нам не подходит

Метод ПоказатьПредупреждение() является базовым способом вывода модальных (или блокирующих интерфейс) сообщений пользователю. Однако его визуальное оформление жестко зашито в платформу 1С. Мы не можем напрямую передать в него альтернативную иконку.

Давайте проанализируем два популярных заблуждения разработчиков, которые пытаются кастомизировать это окно:

  1. Использование форматированной строки: Существует мнение, что если в качестве текста предупреждения передать объект ФорматированнаяСтрока со встроенной картинкой, то задача будет решена. На практике это работает не так, как ожидает заказчик. Платформа действительно отобразит вашу зеленую галочку, но она будет выведена внутри текстового блока. При этом стандартный желтый треугольник с восклицательным знаком никуда не исчезнет и останется на своем месте в левой части окна. В итоге пользователь увидит сразу два противоречащих друг другу значка.
  2. Использование шестнадцатеричных кодов и системных вызовов: В старых версиях платформы (например, в 1С 7.7 или при использовании COM-объектов в операционной системе Windows) разработчики могли вызывать системные диалоги через WinAPI, где код иконки (например, STOP, WARNING, INFO) передавался числовым параметром. В современных управляемых формах 1С 8.3 этот подход не применим. Платформа является кроссплатформенной, работает на Linux, macOS и в веб-клиентах, поэтому все диалоговые окна отрисовываются самой платформой унифицированно, без прямой привязки к WinAPI.

Таким образом, стандартное предупреждение изменить не удастся. Рассмотрим два альтернативных и полностью рабочих метода решения этой задачи.

Решение 1: Использование метода ПоказатьОповещениеПользователя()

Если клиенту не требуется жестко блокировать интерфейс и заставлять пользователя нажимать кнопку «ОК», мы можем использовать механизм всплывающих оповещений. Этот метод позволяет выводить кастомные картинки в правом нижнем углу экрана. Для отправки системных сообщений также подойдёт инструмент для отображения уведомлений 1С в центре уведомлений Windows.

Давайте разберем, как вызвать такое оповещение программно. Мы можем использовать предопределенные картинки из библиотеки конфигурации или платформы:


// Пример вывода всплывающего оповещения с зеленой галочкой
ТекстОповещения = "Данные успешно выгружены в бухгалтерию!";
Пояснение = "Все операции обработаны без ошибок.";
КартинкаУспеха = БиблиотекаКартинок.Успешно; // Используем стандартную картинку успехов

ПоказатьОповещениеПользователя(
	ТекстОповещения, 
	, 
	Пояснение, 
	КартинкаУспеха, 
	СтатусОповещенияПользователя.Информация
);

Проанализируем особенности этого подхода:

Решение 2: Создание собственной вспомогательной формы диалога

Если заказчик настаивает на полноценном блокирующем сообщении строго по центру экрана с зеленой галочкой и кнопкой «ОК», единственным верным решением будет создание собственной формы. Мы спроектируем ее так, чтобы ее можно было универсально использовать в любых модулях конфигурации. Для графического оформления таких диалогов можно использовать набор графических ресурсов и иконок платформы 1С.

Рассмотрим пошагово процесс создания и вызова такой формы.

Шаг 1. Создание общей формы в конфигураторе

  1. В дереве метаданных найдем ветку Общие -> Общие формы и добавим новую форму. Назовем ее ПредупреждениеКрасивое.
  2. В свойствах формы установим режим открытия окна: РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс (или БлокироватьОкноВладельца).
  3. Добавим реквизиты формы:
    • ТекстСообщения (тип: Строка) — для хранения выводимого текста.
    • ПутьККартинке (тип: Картинка или Строка) — для динамической установки пиктограммы.
  4. Разместим элементы на форме:
    • Создадим горизонтальную группу для выравнивания элементов.
    • Внутри группы слева разместим элемент Декорация с видом Картинка (назовем его ИконкаПредупреждения). Данные этого элемента свяжем с реквизитом ПутьККартинке.
    • Справа разместим элемент Декорация с видом Текст (назовем его ПолеТекста). Свяжем его с реквизитом ТекстСообщения.
    • В подвале формы добавим стандартную кнопку ОК, при нажатии на которую форма будет закрываться и возвращать управление.

Шаг 2. Программный код модуля нашей общей формы

В модуле формы настроим обработку параметров при открытии, чтобы форма была универсальной и могла отображать не только зеленую галочку, но и другие статусы по запросу разработчика:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Получаем переданные параметры
	ТекстСообщения = Параметры.ТекстСообщения;
	ТипДиалога = Параметры.ТипДиалога; // Например: "Успех", "Инфо", "Внимание"
	
	// Устанавливаем иконку в зависимости от типа диалога
	Если ТипДиалога = "Успех" Тогда
		// Задаем зеленую галочку из библиотеки картинок платформы или конфигурации
		ПутьККартинке = БиблиотекаКартинок.Успешно;
		Автозаголовок = Ложь;
		Заголовок = "Успешное действие";
	ИначеЕсли ТипДиалога = "Инфо" Тогда
		ПутьККартинке = БиблиотекаКартинок.Информация;
		Заголовок = "Информация";
	Иначе
		// Стандартный вариант по умолчанию
		ПутьККартинке = БиблиотекаКартинок.Предупреждение;
		Заголовок = "Внимание";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаОК(Команда)
	// Закрываем форму и возвращаем успешный результат
	Закрыть(Истина);
КонецПроцедуры

Шаг 3. Асинхронный вызов кастомной формы в коде

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


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

КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияКрасивогоПредупреждения(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	// Здесь мы обрабатываем логику после закрытия окна пользователем
	Если РезультатЗакрытия = Истина Тогда
		// Продолжаем выполнение алгоритма, если это необходимо
		ОчиститьВременныеФайлы();
	КонецЕсли;
	
КонецПроцедуры

Сравнительный анализ решений

Для того чтобы вам было проще сделать выбор в конкретной бизнес-ситуации, проанализируем оба решения с помощью сравнительной таблицы:

  1. Простота внедрения: Вызов ПоказатьОповещениеПользователя() пишется в одну строку кода. Собственная общая форма требует проектирования интерфейса в конфигураторе и написания обработчиков закрытия.
  2. Внимание пользователя: Собственная форма блокирует весь интерфейс программы, пользователь гарантированно прочитает сообщение. Всплывающее оповещение в углу экрана легко пропустить, если пользователь отвлекся.
  3. Гибкость настройки: На собственной форме вы можете разместить дополнительные кнопки (например, «Подробнее», «Перейти в журнал»), гиперссылки, таблицы или детальные логи ошибок. Метод всплывающих оповещений жестко ограничен стандартным набором параметров платформы.

Таким образом, для простых информационных уведомлений об успешном фоновом действии лучше применять первый способ. Если же бизнес-процесс требует явного подтверждения от пользователя в центре экрана — не пожалейте времени и создайте универсальную общую форму предупреждений для вашей конфигурации. Это решит проблему раз и навсегда для всех последующих задач.

← На главную