Как отобразить состояние документа (Проведен, Не проведен, Удален) на форме в 1С 8.3

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

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

Анализ проблемы и выбор инструментария

Типичная ошибка начинающего разработчика — попытка обратиться к элементу формы как к обычному значению. Рассмотрим ситуацию: мы хотим создать текстовое поле ЭлементСостояния и менять его текст. Важно понимать различие между реквизитом формы (данными) и элементом формы (визуальным объектом). У таких визуальных элементов, как «Декорация — надпись», нет свойства Текст, доступного для записи напрямую через точку от реквизита. Вместо этого необходимо управлять свойством Заголовок через коллекцию Элементы.

Для реализации задачи нам потребуются следующие механизмы:

  1. Элемент формы типа «Декорация» — для вывода текста.
  2. Обработчики событий ПриОткрытии и ПослеЗаписи — для обновления статуса при изменении данных.
  3. Программное управление свойствами ЦветТекста и Заголовок.

Способ 1. Программное управление декорацией формы

Рассмотрим наиболее гибкий вариант, когда мы программно меняем свойства элемента формы в зависимости от состояния объекта. Этот метод позволяет динамически менять не только текст, но и цвета, делая интерфейс «живым».

Для начала создадим процедуру, которая будет анализировать свойства Объект.Проведен и Объект.ПометкаУдаления. Проанализируем пример кода:


&НаСервере
Процедура ОбновитьСостояниеДокументаНаСервере()
    
    // Получаем доступ к элементу декорации через коллекцию Элементы
    ЭлементСтатуса = Элементы.ЭлементСостояния;
    
    Если Объект.Проведен Тогда
        ЭлементСтатуса.Заголовок = "Проведен";
        ЭлементСтатуса.ЦветТекста = Новый Цвет(0, 150, 70); // Насыщенный зеленый
        ЭлементСтатуса.ЦветРамки = Новый Цвет(0, 150, 70);
    ИначеЕсли Объект.ПометкаУдаления Тогда
        ЭлементСтатуса.Заголовок = "Удалён";
        ЭлементСтатуса.ЦветТекста = Новый Цвет(255, 0, 0); // Яркий красный
        ЭлементСтатуса.ЦветРамки = Новый Цвет(255, 0, 0);
    Иначе
        ЭлементСтатуса.Заголовок = "Не проведен";
        ЭлементСтатуса.ЦветТекста = Новый Цвет(0, 0, 0);   // Черный
        ЭлементСтатуса.ЦветРамки = Новый Цвет(128, 128, 128); // Серый
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: Обратите внимание, что мы используем &НаСервере. Хотя в последних версиях платформы 8.3 многие визуальные свойства доступны на клиенте, работа с объектами метаданных и сложными цветами надежнее отрабатывает на стороне сервера. Однако для оптимизации скорости работы интерфейса старайтесь минимизировать количество серверных вызовов.

События для обновления статуса

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОбновитьСостояниеДокументаНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОбновитьСостояниеДокументаНаСервере();
КонецПроцедуры

Способ 2. Программное создание элемента формы

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


&НаСервере
Процедура СоздатьЭлементСтатусаПрограммно()
    
    // Добавляем декорацию в группу заголовка (например, ГруппаШапка)
    // Если группы нет, можно добавить прямо в ЭтаФорма
    ИмяЭлемента = "ЭлементСостояния";
    
    Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        
        // Добавляем элемент типа ДекорацияФормы
        НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Элементы.ГруппаЗаголовок);
        НовыйЭлемент.Вид = ВидДекорацииФормы.Надпись;
        
        // Настраиваем внешний вид
        НовыйЭлемент.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 1);
        НовыйЭлемент.Ширина = 15;
        НовыйЭлемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
        НовыйЭлемент.Шрифт = Новый Шрифт(,,Истина); // Делаем текст жирным
        
    КонецЕсли;
    
КонецПроцедуры

Совет: Программное создание элементов — процедура ресурсоемкая. Рекомендуется один раз создать элемент в редакторе форм (в режиме «Конфигуратор»), а в коде лишь управлять его видимостью и текстом. Это значительно ускорит открытие формы.

Способ 3. Использование Условного оформления (Декларативный метод)

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

  1. Откройте форму документа в Конфигураторе.
  2. Перейдите на закладку «Условное оформление».
  3. Добавьте новое правило:
    • Оформление: установите нужный Цвет текста или Цвет фона.
    • Условие: Объект.Проведен Равно Истина.
    • Оформляемые поля: выберите ваш элемент ЭлементСостояния.

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

Оптимизация: использование «ПриЧтенииНаСервере»

Проанализируем архитектуру вызовов. Если мы используем процедуру ПриОткрытии (которая является клиентской) и вызываем из нее серверную процедуру для установки заголовков, мы совершаем лишний «поход» на сервер. Правильнее будет инициализировать состояние в обработчике ПриЧтенииНаСервере.

Этот обработчик выполняется на сервере в момент получения данных из базы. В нем уже доступны все значения Объекта, и мы можем настроить декорацию без дополнительных клиент-серверных вызовов:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Вызываем нашу общую процедуру обновления
    ОбновитьСостояниеДокументаНаСервере();
КонецПроцедуры

Продвинутая визуализация: Форматированные строки и Картинки

Если стандартный текст кажется вам слишком простым, посмотрим на пример использования ФорматированнойСтроки. Это позволит добавить, например, иконку рядом с текстом или выделить цветом только часть надписи.


&НаСервере
Процедура УстановитьКрасивыйСтатус()
    
    Если Объект.Проведен Тогда
        ТекстСтатуса = Новый ФорматированнаяСтрока("● ", Новый Цвет(0, 255, 0), , "Проведен");
        Элементы.ЭлементСостояния.Заголовок = ТекстСтатуса;
    КонецЕсли;
    
КонецПроцедуры

Также можно использовать стандартную библиотеку картинок. Для этого добавьте на форму элемент типа Поле картинки и программно меняйте его значение:

Резюме

Мы проанализировали различные подходы к отображению состояния документа. Самым надежным и производительным решением является сочетание ручного размещения декорации на форме в Конфигураторе и управление её свойствами в процедурах ПриЧтенииНаСервере и ПослеЗаписи. Избегайте лишних программных созданий элементов формы «на лету», если структура формы известна заранее — это сэкономит ресурсы системы и сделает интерфейс более отзывчивым для пользователя.

← На главную