При разработке интерфейсов в платформе 1С 7.7 разработчики нередко сталкиваются с ситуацией, когда два элемента управления диалога типа «Текст» накладываются друг на друга в одних и тех же координатах. Типичный сценарий: в зависимости от условий (например, пробит чек ККМ или нет) требуется показывать один текст определенного цвета и скрывать другой. Однако при выполнении программного кода оба текста могут оставаться видимыми либо повторно проявляться на форме. Разберем по шагам, почему возникает такое поведение и какими способами решается эта задача.
Проанализируем механику работы графической подсистемы платформы 1С 7.7 и выделим ключевые факторы, приводящие к эффекту «наложения» надписей:
Форма.ИспользоватьСлой(), а также интерактивное переключение закладок, привязанных к слоям, приводит к автоматическому сбросу индивидуальной видимости элементов. Любое переключение слоев восстанавливает видимость элементов, входящих в активные слои, отменяя ранее выполненные команды вида Форма.ИмяЭлемента.Видимость(0).Форма.Обновить().Рассмотрим случай, когда элементы продолжают управляться через метод Видимость(). Если на форме используются закладки или переключение слоев, установку видимости недостаточно выполнить только в момент проведения операции. Ее обязательно нужно дублировать после любой смены слоя.
Посмотрим на пример правильного размещения кода:
Процедура ОбновитьВидимостьСтатуса()
Если НомерЧекаККМ <> 0 Тогда
Форма.ТекстПробит.Видимость(1);
Форма.ТекстНеПробит.Видимость(0);
Иначе
Форма.ТекстПробит.Видимость(0);
Форма.ТекстНеПробит.Видимость(1);
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореЗакладки()
// Сначала переключаем слои формы
Форма.ИспользоватьСлой(Форма.Закладки.ТекущаяСтрока(), 1);
// После переключения слоев обязательно восстанавливаем индивидуальную видимость
ОбновитьВидимостьСтатуса();
Форма.Обновить(0);
КонецПроцедуры
Обратим внимание: метод Форма.Обновить(0) перерисовывает только элементы управления диалога без повторного чтения реквизитов из базы данных, что исключает лишнюю нагрузку.
В платформе 1С 7.7 наиболее надежным и штатным подходом является отказ от метода Видимость() для перекрывающихся элементов в пользу механизма именованных слоев. Выясним, как это реализовать:
СлойПробит).СлойНеПробит).Посмотрим на пример реализации переключения слоев:
Если НомерЧекаККМ <> 0 Тогда
Форма.ИспользоватьСлой("СлойПробит", 1);
Форма.ИспользоватьСлой("СлойНеПробит", 0);
Иначе
Форма.ИспользоватьСлой("СлойПробит", 0);
Форма.ИспользоватьСлой("СлойНеПробит", 1);
КонецЕсли;
Форма.Обновить();
Данный подход исключает конфликт между переключением закладок и свойствами видимости конкретных надписей, так как платформа самостоятельно контролирует отрисовку активного набора слоев.
Если надписи не требуют разного цвета шрифта, накладывать два элемента друг на друга не требуется. В свойствах одного элемента «Текст» в поле «Формула» можно указать функцию модуля формы, возвращающую нужную строку динамически.
Рассмотрим пример функции модуля:
Функция гетСтатусЧека()
Если НомерЧекаККМ <> 0 Тогда
Возврат "Чек пробит (№ " + СокрЛП(НомерЧекаККМ) + ")";
Иначе
Возврат "Чек НЕ пробит";
КонецЕсли;
КонецФункции
Важное ограничение: штатными средствами встроенного языка 1С 7.7 у элемента «Текст» нельзя программно изменить цвет шрифта (цвет задается статически в конфигураторе). Поэтому, если статус «Пробит» должен быть зеленым, а «Не пробит» — красным, необходимо использовать разделение по слоям (Способ 2) либо средства внешних компонент (например, FormEx).
Чтобы избежать графических артефактов при наложении надписей, проверим следующие настройки формы: