В процессе разработки интерфейсов на управляемых формах 1С программисты часто сталкиваются с особенностями поведения платформы, которые могут мешать реализации специфического дизайна или логики. Две наиболее частые проблемы — это автоматическое выделение первой строки в таблице при открытии формы и "дребезг" кнопок, когда пользователь успевает нажать на кнопку несколько раз до того, как основной алгоритм завершит работу. В этой статье мы подробно разберем, как решить эти задачи эффективно и профессионально.
Многие разработчики пробуют программно очищать выделенные строки в процедурах ПриОткрытии или ПриАктивизацииСтроки, используя код Элемент.ВыделенныеСтроки.Очистить(). Однако часто это не дает желаемого результата при открытии формы: платформа 1С по умолчанию устанавливает фокус на первый элемент в порядке обхода. Если этим элементом является таблица, первая строка неизбежно подсвечивается синим цветом.
Метод 1: Использование Условного оформления (Самый надежный)
Вместо того чтобы бороться с механизмом выделения, мы можем сделать его невидимым для пользователя. Проанализируем, как это работает: условное оформление имеет приоритет над стандартной раскраской платформы. Если мы зададим цвет фона и текста для активной строки такими же, как для обычных строк, выделение исчезнет визуально.
РежимВыделенияСтроки установлен в значение Строка или Ячейка (их можно менять через Редактор форм в режиме предприятия), но оформление должно применяться ко всей области.Метод 2: Перенос фокуса при открытии (актуально и для динамических списков)
Рассмотрим ситуацию, когда выделение появляется только потому, что таблица — первый элемент на форме. Мы можем обмануть платформу, программно установив фокус на другой элемент (например, на надпись или вспомогательную кнопку) в процедуре ПриОткрытии или OnOpen на клиенте.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Устанавливаем фокус на другой элемент, чтобы ТЗ не активировалась сразу
ЭтаФорма.ТекущийЭлемент = Элементы.ГруппаДекорацияЗаголовок;
КонецПроцедуры
Когда пользователь быстро кликает по кнопке, вызовы процедур встают в очередь сообщений операционной системы. Пока выполняется первый вызов "тяжелого" алгоритма, интерфейс может не успеть обновиться (свойство Доступность = Ложь не прорисуется мгновенно), и второй клик инициирует повторный запуск процедуры. Выясним, как этого избежать.
Этот метод считается одним из самых изящных в 1С. Суть заключается в том, что основная процедура кнопки лишь "заказывает" выполнение кода через микроскопическую паузу и мгновенно завершается, освобождая интерфейсный поток. Повторные клики в этот момент просто не находят активной процедуры для выполнения.
Разберем реализацию по шагам:
&НаКлиенте
Процедура КомандаОК(Команда)
// Отключаем кнопку сразу
Элементы.КомандаОК.Доступность = Ложь;
// Подключаем однократный обработчик с минимальной задержкой
ЭтаФорма.ПодключитьОбработчикОжидания("ВыполнитьОсновнойАлгоритм", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОсновнойАлгоритм()
Попытка
// Здесь располагается ваш основной код
РассчитатьДанныеНаСервере();
Сообщить("Операция успешно завершена!");
Исключение
// В случае ошибки важно вернуть доступность кнопки
Сообщить("Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
// Возвращаем доступность
Элементы.КомандаОК.Доступность = Истина;
КонецПроцедуры
Если вы не хотите использовать обработчик ожидания, можно применить классический метод с клиентской переменной модуля. Проанализируем этот подход: мы создаем "предохранитель", который проверяется в самом начале выполнения команды.
&НаКлиенте
Переменная ОбработкаИдет; // Объявляем в самом верху модуля формы
&НаКлиенте
Процедура КомандаОК(Команда)
// Проверяем, не запущена ли уже процедура
Если ОбработкаИдет = Истина Тогда
Возврат;
КонецЕсли;
ОбработкаИдет = Истина;
Элементы.КомандаОК.Доступность = Ложь;
Попытка
// Основной алгоритм
ВыполнитьДействие();
Исключение
ОбработкаИдет = Ложь;
Элементы.КомандаОК.Доступность = Истина;
ВызватьИсключение;
КонецПопытки;
ОбработкаИдет = Ложь;
Элементы.КомандаОК.Доступность = Истина;
КонецПроцедуры
Почему Доступность = Ложь часто не спасает сама по себе?
Важно понимать внутреннее устройство платформы. Изменение визуального состояния элементов формы (таких как Доступность или Видимость) происходит в момент передачи управления от встроенного языка обратно платформе. Если ваш код выполняется долго и без прерываний, кнопка визуально станет серой только после того, как код отработает. Обработчик ожидания решает эту проблему, так как процедура КомандаОК завершается почти мгновенно, позволяя платформе перерисовать форму и сделать кнопку недоступной до того, как сработает основной алгоритм.
Используя комбинацию условного оформления для таблиц и обработчиков ожидания для кнопок, вы сделаете интерфейс вашего решения на базе 1С гораздо более стабильным и приятным для конечного пользователя.