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