В процессе разработки на платформе 1С:Предприятие 8.3 (управляемые формы) часто возникает задача автоматизации ввода данных. Типичный сценарий: пользователь вводит значение в одной колонке, и система должна автоматически создать новую строку, позиционировать курсор в определенную ячейку и открыть её для редактирования, чтобы пользователю не приходилось лишний раз использовать мышь или нажимать Enter. В этой статье мы подробно разберем, как правильно реализовать этот механизм, избежав распространенных ошибок, связанных с идентификацией строк.
Прежде чем мы перейдем к коду, давайте проанализируем важный технический нюанс, который часто становится камнем преткновения для начинающих разработчиков. В управляемых формах у элементов табличной части есть два способа адресации:
Свойство таблицы ТекущаяСтрока ожидает именно идентификатор. Если использовать индекс (например, Количество() - 1), код может работать до тех пор, пока из таблицы не будут удалены строки. Как только происходит удаление, внутренние счетчики идентификаторов перестают совпадать с индексами, и позиционирование «ломается». Рассмотрим, как этого избежать.
Для начала рассмотрим правильный метод добавления строки. Метод Добавить() возвращает объект новой строки, у которого мы можем сразу получить уникальный идентификатор. Рассмотрим пример кода на стороне клиента:
&НаКлиенте
Процедура ДобавитьИАктивироватьСтроку()
// 1. Добавляем новую строку в данные (объект или реквизит формы типа ДанныеФормыКоллекция)
НоваяСтрока = Объект.ТаблицаТоваров.Добавить();
// 2. Получаем уникальный идентификатор только что созданной строки
ИдентификаторСтроки = НоваяСтрока.ПолучитьИдентификатор();
// 3. Передаем фокус самой таблице на форме
Элементы.ТаблицаТоваров.ТекущаяСтрока = ИдентификаторСтроки;
КонецПроцедуры
Использование метода ПолучитьИдентификатор() гарантирует, что мы всегда будем обращаться именно к той строке, которую только что создали, независимо от того, сколько строк было удалено ранее.
Просто установить ТекущуюСтроку недостаточно для того, чтобы курсор встал в нужную колонку. По умолчанию система может оставить фокус на первой колонке или на той, которая была активна ранее. Чтобы принудительно «подсветить» нужную ячейку, нам нужно изменить свойство ТекущийЭлемент самой формы. Проанализируем, как это сделать:
&НаКлиенте
Процедура УстановитьФокусНаКолонку()
// Предположим, нам нужно встать в колонку "Количество"
Элементы.ТекущийЭлемент = Элементы.ТаблицаТоваровКоличество;
КонецПроцедуры
Важно помнить, что ТекущийЭлемент формы — это именно элемент управления (поле ввода внутри таблицы), а не просто имя колонки в метаданных.
Теперь, когда мы создали строку и указали нужную колонку, необходимо заставить 1С «войти» в ячейку, чтобы пользователь увидел мигающий курсор и мог сразу печатать. Для этого используется метод ИзменитьСтроку(). Этот метод имитирует нажатие клавиши F2.
Соберем всё вместе в одну процедуру, которую можно вызвать, например, при нажатии кнопки или после изменения значения в другой ячейке:
&НаКлиенте
Процедура ДобавитьИНачатьРедактирование()
// Добавляем строку в данные
НоваяСтрока = Объект.ТаблицаЗаявок.Добавить();
НоваяСтрока.ТипСтроки = "Обычная"; // Пример заполнения данных
// Получаем ID для позиционирования
Идентификатор = НоваяСтрока.ПолучитьИдентификатор();
// Позиционируем визуальный курсор на строку
Элементы.ТаблицаЗаявок.ТекущаяСтрока = Идентификатор;
// Устанавливаем фокус на конкретное поле (колонку)
Элементы.ТекущийЭлемент = Элементы.ТаблицаЗаявокНаименование;
// Переходим в режим редактирования
Элементы.ТаблицаЗаявок.ИзменитьСтроку();
КонецПроцедуры
В некоторых обсуждениях можно встретить советы использовать COM-объект Wscript.Shell для имитации нажатия клавиш (например, SendKeys("{F2}")). Рассмотрим, почему это плохое решение:
Метод Элементы.ИмяТаблицы.ИзменитьСтроку() является штатным, безопасным и рекомендуемым фирмой 1С.
Иногда, несмотря на правильно написанный код, ячейка не активируется. Выясним причины, по которым это может происходить:
ТолькоПросмотр = Истина, метод ИзменитьСтроку() просто не сработает. Проверьте также права доступа пользователя.Доступность = Ложь, элемент не может получить фокус.ПриОткрытии или ПередОткрытием, форма может еще не до конца инициализировать графические элементы. В таких случаях иногда помогает использование обработчика ожидания с минимальной задержкой (0.1 сек).Проанализируем ситуацию с добавлением на сервере. Если строка добавляется в серверном коде, вы не можете управлять ТекущимЭлементом (так как это свойство только для клиента). В этом случае алгоритм должен быть таким: серверная функция возвращает идентификатор новой строки на клиент, и уже клиентская процедура выполняет визуальное позиционирование.
Резюме: Для корректной активации ячейки всегда используйте ПолучитьИдентификатор() вместо индексов, управляйте свойством ТекущийЭлемент формы для выбора колонки и завершайте действие методом ИзменитьСтроку(). Это обеспечит надежную работу интерфейса в любых условиях.