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