При работе с конфигурацией «Управление производственным предприятием» (УПП), которая базируется на обычных формах, разработчики и пользователи часто сталкиваются с неочевидным поведением элементов управления. Одной из таких проблем является «залипание» или неактивность кнопок в ячейках табличного поля (например, кнопки выбора или кнопки открытия в виде лупы). Пользователь замечает, что кнопка становится доступной только после определенных манипуляций: перехода между колонками или активации строки. Разберем детально, почему это происходит и как это исправить.
Для начала проанализируем, как платформа 1С работает с элементами управления в табличных полях. В обычных формах отрисовка кнопок в ячейках не всегда статична. Платформа оптимизирует ресурсы, поэтому многие элементы «оживают» только в момент получения фокуса. Посмотрим на основные свойства колонки табличного поля, которые влияют на видимость кнопок:
Никогда, Всегда или В текущей строке. Если установлено значение В текущей строке, кнопка появится только тогда, когда строка станет активной.Выясним причину странного поведения, когда кнопка становится доступной только после «подсвечивания» соседней колонки. Это часто связано с тем, что фокус ввода при первом клике не переводит ячейку в полноценный режим редактирования, и программные обработчики не успевают отработать корректно.
Проанализируем ситуацию, описанную в теме. Пользователь обнаружил в коде фрагмент, который напрямую управляет доступностью действия. В сложных типовых конфигурациях, таких как УПП, разработчики часто используют один общий обработчик события для всей таблицы. Рассмотрим пример кода, который может вызывать подобную проблему:
Процедура ТабличноеПолеНачалоВыбора(Элемент, Колонка, СтандартнаяОбработка)
Если Элемент.ТекущаяКолонка <> Неопределено Тогда
Отказ = Элемент.ТекущаяКолонка.Имя <> "ПутьЛокальный";
Иначе
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;
КонецПроцедуры
Разберем, что здесь происходит. Программа проверяет имя текущей колонки. Если фокус находится не на колонке ПутьЛокальный, то переменная Отказ (или в данном случае блокировка СтандартнаяОбработка = Ложь) предотвращает выполнение действия. Если логика написана не в том событии или завязана на ТекущуюКолонку, то при «кривом» позиционировании курсора (когда визуально мы кликнули по кнопке, но ТекущаяКолонка еще не обновилась в памяти платформы) действие не сработает.
Выясним, почему переход в первую колонку и обратно помогает. Это классическая проблема обновления состояния (Refresh) интерфейса в 1С 8.2. При смене активной колонки или строки платформа принудительно пересчитывает свойства элементов управления. Если доступность кнопки зависит от условий, прописанных в событии ПриАктивизацииСтроки или ПриВыводеСтроки, то именно переключение между ячейками заставляет интерфейс «перерисоваться» и осознать, что кнопка должна быть доступна.
Чтобы кнопка открытия (лупа) работала стабильно и сразу, рекомендуем выполнить следующие действия:
ПутьЛокальный) свойство ОтображатьКнопку установлено в значение Всегда. Это гарантирует, что кнопка будет отрисована сразу, не дожидаясь активации ячейки.Колонка, который передается в обработчик события напрямую, вместо обращения к Элемент.ТекущаяКолонка. Рассмотрим исправленный пример:
Процедура ТабличноеПолеОткрытие(Элемент, СтандартнаяОбработка)
// Используем Элемент.ТекущаяКолонка осмотрительно
ТекущаяКолонка = Элемент.ТекущаяКолонка;
Если ТекущаяКолонка.Имя = "ПутьЛокальный" Тогда
// Описываем логику открытия файла или карточки
СтандартнаяОбработка = Ложь;
ЗапуститьПриложение(Элемент.ТекущаяСтрока.ПутьЛокальный);
КонецЕсли;
КонецПроцедуры
Проанализируем еще один нюанс: тип данных в колонке. Кнопка открытия в 1С по умолчанию предназначена для ссылочных типов (справочники, документы). Если в колонке хранится строка (как в случае с путем к файлу ПутьЛокальный), платформа может считать кнопку открытия неактуальной. В этом случае в свойствах элемента управления табличного поля нужно принудительно включить флаг КнопкаОткрытия и обязательно прописать обработчик события НажатиеКнопкиОткрытия или Открытие.
Если визуальное состояние кнопок всё равно «залипает», можно принудительно обновлять форму в событии ПриАктивизацииЯчейки, хотя этим методом не стоит злоупотреблять из-за возможного снижения производительности:
Процедура ТабличноеПолеПриАктивизацииЯчейки(Элемент)
// Принудительно заставляем форму пересчитать доступность кнопок
ЭлементыФормы.ВашеТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры
Таким образом, проблема обычно кроется либо в жесткой проверке имени колонки в коде, которая не учитывает особенности позиционирования курсора, либо в настройках отрисовки элементов в обычных формах 1С.