Почему СообщениеПользователю выводится два раза и как отобразить ошибку только у поля формы?

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

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

Посмотрим на стандартный код вывода диагностического сообщения:


Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Вы выбрали количество больше чем в остатке";
Сообщение.Поле = "ВыбКоличество";
Сообщение.Сообщить();

Принцип работы объекта СообщениеПользователю

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

Заполнение свойства Поле (или ПутьКДанным) не отменяет вывод в панель, а связывает строку сообщения с конкретным элементом формы. Это позволяет пользователю кликнуть по строке в нижнем списке и сразу перейти к проблемному реквизиту. Выноска с текстом над полем — это лишь интерактивный указатель текущего активного сообщения.

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

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

Вариант 1. Использование динамической декорации-надписи

Разберем по шагам создание локального блока сообщения через элемент формы вида Декорация - Надпись:

  1. Добавим в редакторе формы под нужным полем ввода декорацию с типом Надпись (например, с именем НадписьОшибкаКоличества).
  2. Настроим оформление декорации: установим цвет текста в красный или предупреждающий оттенок, а свойство Видимость по умолчанию отключим (значение Ложь).
  3. В обработчике события (например, ПриИзменении поля ввода) будем программно управлять видимостью и текстом надписи.

Посмотрим на пример программного кода:


&НаКлиенте
Процедура ВыбКоличествоПриИзменении(Элемент)
    
    Если Объект.ВыбКоличество > ОстатокНаСкладе Тогда
        Элементы.НадписьОшибкаКоличества.Заголовок = "Вы выбрали количество больше чем в остатке";
        Элементы.НадписьОшибкаКоличества.Видимость = Истина;
    Иначе
        Элементы.НадписьОшибкаКоличества.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Вариант 2. Динамическое управление подсказкой поля

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

Посмотрим, как изменить оформление поля при обнаружении некорректных данных:


&НаКлиенте
Процедура ПроверитьКоличествоНаКлиенте()
    
    Если Объект.ВыбКоличество > ОстатокНаСкладе Тогда
        Элементы.ВыбКоличество.ПоложениеПодсказки = ПоложениеПодсказкиЭлементаФормы.ОтображатьВнизу;
        Элементы.ВыбКоличество.Подсказка = "Внимание: указанное количество превышает доступный остаток!";
    Иначе
        Элементы.ВыбКоличество.Подсказка = "";
    КонецЕсли;
    
КонецПроцедуры

Вариант 3. Визуальное выделение рамки поля

Для ненавязчивого информирования пользователя можно изменить цвет рамки элемента формы при возникновении ошибки, не выводя громоздкие тексты:


&НаКлиенте
Процедура ВыделитьОшибочноеПоле(ЕстьОшибка)
    
    Если ЕстьОшибка Тогда
        Элементы.ВыбКоличество.ЦветРамки = ЦветаСтиля.ЦветОшибочныхДанных;
    Иначе
        Элементы.ВыбКоличество.ЦветРамки = ЦветаСтиля.ЦветРамки;
    КонецЕсли;
    
КонецПроцедуры

Вариант 4. Всплывающее оповещение пользователя

Если требуется показать временное уведомление без фиксации в нижней панели формы, применим глобальную процедуру ПоказатьОповещениеПользователя(). Она отображает всплывающее Toast-окно в углу экрана и автоматически исчезает через заданный промежуток времени:


&НаКлиенте
Процедура УведомитьПользователя()
    
    ПоказатьОповещениеПользователя(
        "Ошибка ввода",
        ,
        "Вы выбрали количество больше чем в остатке",
        БиблиотекаКартинок.Предупреждение32
    );
    
КонецПроцедуры

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

← На главную