Почему в 1С 7.7 не скрываются наложенные элементы формы при программном управлении видимостью?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Причины некорректного отображения элементов

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

  1. Влияние слоев и закладок на видимость элементов. В платформе 1С 7.7 вызов метода Форма.ИспользоватьСлой(), а также интерактивное переключение закладок, привязанных к слоям, приводит к автоматическому сбросу индивидуальной видимости элементов. Любое переключение слоев восстанавливает видимость элементов, входящих в активные слои, отменяя ранее выполненные команды вида Форма.ИмяЭлемента.Видимость(0).
  2. Особенности перерисовки элементов со свойством «Прозрачный». Если у статического текста в свойствах диалога установлен флаг «Прозрачный», платформа при изменении видимости не всегда сразу перерисовывает прямоугольную область под элементом, из-за чего нижний текст визуально накладывается на предыдущий до момента полной перерисовки окна.
  3. Отсутствие вызова принудительного обновления диалога. В ряде процедур изменения состояния элементов вступают в силу визуально только после завершения обработчика или явного вызова метода Форма.Обновить().

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

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

Посмотрим на пример правильного размещения кода:


Процедура ОбновитьВидимостьСтатуса()
    Если НомерЧекаККМ <> 0 Тогда
        Форма.ТекстПробит.Видимость(1);
        Форма.ТекстНеПробит.Видимость(0);
    Иначе
        Форма.ТекстПробит.Видимость(0);
        Форма.ТекстНеПробит.Видимость(1);
    КонецЕсли;
КонецПроцедуры

Процедура ПриВыбореЗакладки()
    // Сначала переключаем слои формы
    Форма.ИспользоватьСлой(Форма.Закладки.ТекущаяСтрока(), 1);
    
    // После переключения слоев обязательно восстанавливаем индивидуальную видимость
    ОбновитьВидимостьСтатуса();
    Форма.Обновить(0);
КонецПроцедуры

Обратим внимание: метод Форма.Обновить(0) перерисовывает только элементы управления диалога без повторного чтения реквизитов из базы данных, что исключает лишнюю нагрузку.

Способ 2. Разнесение элементов по отдельным слоям формы

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

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

Посмотрим на пример реализации переключения слоев:


Если НомерЧекаККМ <> 0 Тогда
    Форма.ИспользоватьСлой("СлойПробит", 1);
    Форма.ИспользоватьСлой("СлойНеПробит", 0);
Иначе
    Форма.ИспользоватьСлой("СлойПробит", 0);
    Форма.ИспользоватьСлой("СлойНеПробит", 1);
КонецЕсли;
Форма.Обновить();

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

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

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

Рассмотрим пример функции модуля:


Функция гетСтатусЧека()
    Если НомерЧекаККМ <> 0 Тогда
        Возврат "Чек пробит (№ " + СокрЛП(НомерЧекаККМ) + ")";
    Иначе
        Возврат "Чек НЕ пробит";
    КонецЕсли;
КонецФункции

Важное ограничение: штатными средствами встроенного языка 1С 7.7 у элемента «Текст» нельзя программно изменить цвет шрифта (цвет задается статически в конфигураторе). Поэтому, если статус «Пробит» должен быть зеленым, а «Не пробит» — красным, необходимо использовать разделение по слоям (Способ 2) либо средства внешних компонент (например, FormEx).

Рекомендации по настройке элементов в конфигураторе

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

  1. Флаг «Прозрачный»: для статических надписей с цветным текстом рекомендуется снять флаг «Прозрачный» и убедиться, что фон элемента совпадает с фоном диалога («Цвет фона формы»). Это предотвратит размытие букв при повторном отображении.
  2. Порядок обхода: порядок отрисовки элементов на форме соответствует их расположению в списке порядка обхода (пункт меню «Диалог — Порядок обхода»). Элемент, находящийся ниже по списку, отрисовывается поверх предыдущих.
← На главную