Как убрать выделение строки в таблице значений при открытии и защитить кнопку от повторных нажатий

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

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

Проблема 1: Отключение визуального выделения строки в таблице значений

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

Метод 1: Использование Условного оформления (Самый надежный)

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

  1. Перейдем в свойства формы и откроем список «Условное оформление» (ускорить работу поможет Декомпиляция условного оформления).
  2. Добавим новый элемент оформления.
  3. В поле «Оформление» установим «Цвет фона» (например, Белый или Авто) и «Цвет текста» (Черный).
  4. В поле «Условие» ничего не указываем, если хотим, чтобы оформление применялось всегда, либо задаем условие, которое всегда истинно.
  5. В поле «Оформляемые поля» выберем все колонки нашей таблицы.
  6. Важный нюанс: чтобы перекрыть именно выделение, убедитесь, что в свойствах таблицы РежимВыделенияСтроки установлен в значение Строка или Ячейка (их можно менять через Редактор форм в режиме предприятия), но оформление должно применяться ко всей области.

Метод 2: Перенос фокуса при открытии (актуально и для динамических списков)

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Устанавливаем фокус на другой элемент, чтобы ТЗ не активировалась сразу
    ЭтаФорма.ТекущийЭлемент = Элементы.ГруппаДекорацияЗаголовок;
КонецПроцедуры

Проблема 2: Защита от повторных (двойных) нажатий кнопки

Когда пользователь быстро кликает по кнопке, вызовы процедур встают в очередь сообщений операционной системы. Пока выполняется первый вызов "тяжелого" алгоритма, интерфейс может не успеть обновиться (свойство Доступность = Ложь не прорисуется мгновенно), и второй клик инициирует повторный запуск процедуры. Выясним, как этого избежать.

Решение через обработчик ожидания

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

Разберем реализацию по шагам:


&НаКлиенте
Процедура КомандаОК(Команда)
    // Отключаем кнопку сразу
    Элементы.КомандаОК.Доступность = Ложь;
    
    // Подключаем однократный обработчик с минимальной задержкой
    ЭтаФорма.ПодключитьОбработчикОжидания("ВыполнитьОсновнойАлгоритм", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОсновнойАлгоритм()
    Попытка
        // Здесь располагается ваш основной код
        РассчитатьДанныеНаСервере();
        Сообщить("Операция успешно завершена!");
    Исключение
        // В случае ошибки важно вернуть доступность кнопки
        Сообщить("Произошла ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Возвращаем доступность
    Элементы.КомандаОК.Доступность = Истина;
КонецПроцедуры

Решение через переменную-флаг (Семафор)

Если вы не хотите использовать обработчик ожидания, можно применить классический метод с клиентской переменной модуля. Проанализируем этот подход: мы создаем "предохранитель", который проверяется в самом начале выполнения команды.


&НаКлиенте
Переменная ОбработкаИдет; // Объявляем в самом верху модуля формы

&НаКлиенте
Процедура КомандаОК(Команда)
    
    // Проверяем, не запущена ли уже процедура
    Если ОбработкаИдет = Истина Тогда
        Возврат;
    КонецЕсли;
    
    ОбработкаИдет = Истина;
    Элементы.КомандаОК.Доступность = Ложь;
    
    Попытка
        // Основной алгоритм
        ВыполнитьДействие();
    Исключение
        ОбработкаИдет = Ложь;
        Элементы.КомандаОК.Доступность = Истина;
        ВызватьИсключение;
    КонецПопытки;
    
    ОбработкаИдет = Ложь;
    Элементы.КомандаОК.Доступность = Истина;
    
КонецПроцедуры

Почему Доступность = Ложь часто не спасает сама по себе?

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

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

← На главную