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

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

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

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

Анализ проблемы: как работают слои и видимость элементов в 1С 7.7

В платформе 1С 7.7 механизм слоев не создает физических панелей-контейнеров на уровне операционной системы. Понятие «слой» в конфигураторе представляет собой логическую группировку элементов управления. Когда вызывается метод Форма.ИспользоватьСлой(), платформа просто выполняет групповое скрытие и отображение дескрипторов окон элементов Windows.

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

Ситуация дополнительно усугубляется, когда код управления видимостью помещают в функцию, привязанную к формуле элемента «Текст» на форме:


Функция ИнформацияОбАртикуле()
    ИнфоТекст = "";
    Если Номенклатура.Выбран() = 0 Тогда
        Форма.кнCopy.Видимость(0);
        Возврат(ИнфоТекст);
    Иначе
        Если (ПустоеЗначение(Номенклатура.АртикулПрайс) = 0) Тогда
            ИнфоТекст = СокрЛП(Номенклатура.АртикулПрайс);
        КонецЕсли;
        Форма.кнCopy.Видимость(1);
        Возврат (ИнфоТекст);
    КонецЕсли;
КонецФункции

Формулы текстовых полей формы в 1С 7.7 пересчитываются автоматически при каждой перерисовке окна. В момент переключения закладки последовательность событий выглядит следующим образом:

  1. Срабатывает процедура ПриВыбореЗакладки(), где вызывается Форма.ИспользоватьСлой("Шапка,Основной,Подвал").
  2. Платформа скрывает слой табличной части и начинает перерисовку окна под новый набор реквизитов.
  3. При перерисовке повторно вычисляется формула поля «Текст», которая вызывает функцию ИнформацияОбАртикуле().
  4. Функция видит, что текущая строка номенклатуры заполнена, и выполняет Форма.кнCopy.Видимость(1). Кнопка моментально «пробивает» текущий слой и отображается поверх шапки.

Способ 1. Проверка активной закладки в функции обновления интерфейса

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

Посмотрим на пример реализации:


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

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

Способ 2. Вынесение кнопки на отдельный динамический слой

Более чистое архитектурное решение — не управлять свойством Видимость() напрямую, а поручить управление видимостью штатному механизму слоев платформы.

Разберем по шагам, как это настроить:

  1. В конфигураторе открываем форму документа и создаем новый слой, например с именем СлойКнопкиКопирования.
  2. Переносим кнопку кнCopy на этот выделенный слой.
  3. Формируем список активных слоев динамически в процедурах смены закладки или обновления строк.

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


Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
    Если НомерЗакладки = 1 Тогда
        Форма.ИспользоватьСлой("Шапка,Основной,Подвал", 2);
    ИначеЕсли НомерЗакладки = 2 Тогда
        СтрокаСлоев = "Шапка,ТабличнаяЧасть,Подвал";
        Если (Номенклатура.Выбран() = 1) И (ПустоеЗначение(Номенклатура.АртикулПрайс) = 0) Тогда
            СтрокаСлоев = СтрокаСлоев + ",СлойКнопкиКопирования";
        КонецЕсли;
        Форма.ИспользоватьСлой(СтрокаСлоев, 2);
    КонецЕсли;
    УстановкаВидимостиСуммВПодвале();
КонецПроцедуры

Важно: второй параметр метода ИспользоватьСлой(СтрокаСлоев, 2) задает строгий режим видимости, при котором отображаются только перечисленные слои, а все остальные принудительно скрываются.

Способ 3. Использование доступности вместо видимости

С точки зрения пользовательского интерфейса постоянное исчезновение и появление кнопки может дезориентировать пользователя. Практичнее оставлять кнопку на слое табличной части видимой всегда, но управлять ее доступностью (активностью).

Посмотрим, как изменить логику:


Функция ИнформацияОбАртикуле()
    ИнфоТекст = "";
    ДоступностьКнопки = 0;
    
    Если Номенклатура.Выбран() = 1 Тогда
        Если ПустоеЗначение(Номенклатура.АртикулПрайс) = 0 Тогда
            ДоступностьКнопки = 1;
            ИнфоТекст = СокрЛП(Номенклатура.АртикулПрайс);
        КонецЕсли;
    КонецЕсли;
    
    // Кнопка становится неактивной (серой), но не ломает маску слоев
    Форма.кнCopy.Доступность(ДоступностьКнопки);
    Возврат ИнфоТекст;
КонецФункции

В самой процедуре нажатия на кнопку также полезно предусмотреть контроль входных данных:


Процедура НажатиеКнCopy()
    Если (Номенклатура.Выбран() = 0) Или (ПустоеЗначение(Номенклатура.АртикулПрайс) = 1) Тогда
        Предупреждение("У выбранной номенклатуры отсутствует артикул для копирования!");
        Возврат;
    КонецЕсли;
    
    // Код помещения артикула в буфер обмена
    ЗаписатьБуферОбмена(СокрЛП(Номенклатура.АртикулПрайс));
КонецПроцедуры

При использовании метода Доступность() элемент управления подчиняется стандартным правилам видимости своего слоя и не будет всплывать на чужих закладках формы.

← На главную