Как изменить текст и визуальное состояние поля ввода при возникновении ошибки в 1С?

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

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

Почему нельзя просто написать Контрагент = "Ошибка"?

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

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

Способ 1. Использование механизма «Состояние ошибки» (современный стандарт)

Начиная с версии платформы 8.3.15, у элементов формы появилось мощное свойство для валидации данных. Это наиболее правильный путь, так как он не требует изменения самих данных в базе. Проанализируем, как это работает программно:


// Пример установки состояния ошибки для поля Контрагент
ТекстОшибки = "У контрагента не заполнен ИНН!";
Элементы.Контрагент.УстановитьСостояниеОшибки(ТекстОшибки);

При выполнении этого кода платформа автоматически сделает следующее:

  1. Обведет поле ввода красной рамкой.
  2. Добавит специальный значок (восклицательный знак) рядом с полем.
  3. При наведении курсора или клике на значок отобразит ваш текст «У контрагента не заполнен ИНН!».

Чтобы снять выделение, когда пользователь исправил ошибку, достаточно вызвать метод с пустым параметром:


Элементы.Контрагент.УстановитьСостояниеОшибки("");

Способ 2. Использование объекта СообщениеПользователю

Если нам нужно не просто «покрасить» поле, но и официально уведомить пользователя, зафиксировав сообщение в специальном окне, воспользуемся объектом СообщениеПользователю. Главная особенность здесь — возможность «привязать» сообщение к конкретному полю на форме.

Рассмотрим по шагам, как это реализовать в коде:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Ошибка: не заполнен ИНН!";
Сообщение.Поле = "Контрагент"; // Имя реквизита на форме
Сообщение.УстановитьДанные(Объект); // Привязка к объекту (например, документу)
Сообщение.Сообщить();

// Дополнительно можно программно изменить цвет фона, как хотел автор
Элементы.Контрагент.ЦветФона = WebЦвета.Лосось; // Мягкий красный оттенок

В этом случае поле подсветится, а при нажатии на текст сообщения в панели сообщений, фокус автоматически перейдет в нужное поле ввода.

Способ 3. Свойство «ПодсказкаВвода»

Как было отмечено в обсуждении, свойство ПодсказкаВвода позволяет отобразить серый текст внутри поля, но только если оно пустое. Если автор готов очищать значение контрагента при ошибке, этот метод сработает идеально.

Выясним, как настроить это программно:


Если НЕ ЗначениеЗаполнено(Контрагент.ИНН) Тогда
    Контрагент = Справочники.Контрагенты.ПустаяСсылка();
    Элементы.Контрагент.ПодсказкаВвода = "ОШИБКА: Заполните ИНН!";
    Элементы.Контрагент.ЦветФона = WebЦвета.Красный;
КонецЕсли;

Этот метод хорош тем, что текст внутри поля выглядит как часть интерфейса, а не как ошибка системы.

Способ 4. Условное оформление формы

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

Разберем алгоритм настройки:

  1. Перейдем в свойства формы, закладка Условное оформление.
  2. Создадим новое правило.
  3. В Оформлении выберем Цвет фона — Красный.
  4. В Условии укажем: Объект.Контрагент.ИННПусто.
  5. В Оформляемых полях выберем поле Контрагент.

Теперь платформа будет сама следить за состоянием данных и подкрашивать поле мгновенно, как только условие станет истинным.

Способ 5. Изменение представления через модуль менеджера (Продвинутый уровень)

Если стоит задача, чтобы вместо названия «Магазин Огонек» во всей программе (в списках, в полях ввода, в отчетах) выводилось слово «ОШИБКА», если ИНН не заполнен, нам поможет обработчик в модуле менеджера справочника.

Проанализируем пример кода в модуле менеджера Справочник.Контрагенты:


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

Важно: этот метод изменит отображение контрагента для всех пользователей во всей системе. Используйте его с осторожностью, только если это действительно необходимо для бизнес-логики.

Резюме и рекомендации

Мы рассмотрели различные подходы к изменению текста и оформления поля ввода. Подведем итоги:

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

← На главную