Как программно добавить строку в таблицу, активировать нужную колонку и сразу начать редактирование текста

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

В процессе разработки на платформе 1С:Предприятие 8.3 (управляемые формы) часто возникает задача автоматизации ввода данных. Типичный сценарий: пользователь вводит значение в одной колонке, и система должна автоматически создать новую строку, позиционировать курсор в определенную ячейку и открыть её для редактирования, чтобы пользователю не приходилось лишний раз использовать мышь или нажимать Enter. В этой статье мы подробно разберем, как правильно реализовать этот механизм, избежав распространенных ошибок, связанных с идентификацией строк.

Разница между индексом и идентификатором строки

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

  1. Индекс — это порядковый номер строки в коллекции (начинается с 0). Он меняется, если строки сортируются или удаляются.
  2. Идентификатор (ID) — это уникальное числовое значение, закрепленное за строкой на время её «жизни» в текущем сеансе формы.

Свойство таблицы ТекущаяСтрока ожидает именно идентификатор. Если использовать индекс (например, Количество() - 1), код может работать до тех пор, пока из таблицы не будут удалены строки. Как только происходит удаление, внутренние счетчики идентификаторов перестают совпадать с индексами, и позиционирование «ломается». Рассмотрим, как этого избежать.

Шаг 1: Программное добавление строки и получение её идентификатора

Для начала рассмотрим правильный метод добавления строки. Метод Добавить() возвращает объект новой строки, у которого мы можем сразу получить уникальный идентификатор. Рассмотрим пример кода на стороне клиента:


&НаКлиенте
Процедура ДобавитьИАктивироватьСтроку()
    
    // 1. Добавляем новую строку в данные (объект или реквизит формы типа ДанныеФормыКоллекция)
    НоваяСтрока = Объект.ТаблицаТоваров.Добавить();
    
    // 2. Получаем уникальный идентификатор только что созданной строки
    ИдентификаторСтроки = НоваяСтрока.ПолучитьИдентификатор();
    
    // 3. Передаем фокус самой таблице на форме
    Элементы.ТаблицаТоваров.ТекущаяСтрока = ИдентификаторСтроки;
    
КонецПроцедуры

Использование метода ПолучитьИдентификатор() гарантирует, что мы всегда будем обращаться именно к той строке, которую только что создали, независимо от того, сколько строк было удалено ранее.

Шаг 2: Активация конкретной колонки (ячейки)

Просто установить ТекущуюСтроку недостаточно для того, чтобы курсор встал в нужную колонку. По умолчанию система может оставить фокус на первой колонке или на той, которая была активна ранее. Чтобы принудительно «подсветить» нужную ячейку, нам нужно изменить свойство ТекущийЭлемент самой формы. Проанализируем, как это сделать:


&НаКлиенте
Процедура УстановитьФокусНаКолонку()
    
    // Предположим, нам нужно встать в колонку "Количество"
    Элементы.ТекущийЭлемент = Элементы.ТаблицаТоваровКоличество;
    
КонецПроцедуры

Важно помнить, что ТекущийЭлемент формы — это именно элемент управления (поле ввода внутри таблицы), а не просто имя колонки в метаданных.

Шаг 3: Переход в режим редактирования текста

Теперь, когда мы создали строку и указали нужную колонку, необходимо заставить 1С «войти» в ячейку, чтобы пользователь увидел мигающий курсор и мог сразу печатать. Для этого используется метод ИзменитьСтроку(). Этот метод имитирует нажатие клавиши F2.

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


&НаКлиенте
Процедура ДобавитьИНачатьРедактирование()
    
    // Добавляем строку в данные
    НоваяСтрока = Объект.ТаблицаЗаявок.Добавить();
    НоваяСтрока.ТипСтроки = "Обычная"; // Пример заполнения данных
    
    // Получаем ID для позиционирования
    Идентификатор = НоваяСтрока.ПолучитьИдентификатор();
    
    // Позиционируем визуальный курсор на строку
    Элементы.ТаблицаЗаявок.ТекущаяСтрока = Идентификатор;
    
    // Устанавливаем фокус на конкретное поле (колонку)
    Элементы.ТекущийЭлемент = Элементы.ТаблицаЗаявокНаименование;
    
    // Переходим в режим редактирования
    Элементы.ТаблицаЗаявок.ИзменитьСтроку();
    
КонецПроцедуры

Почему не стоит использовать Wscript.Shell?

В некоторых обсуждениях можно встретить советы использовать COM-объект Wscript.Shell для имитации нажатия клавиш (например, SendKeys("{F2}")). Рассмотрим, почему это плохое решение:

Метод Элементы.ИмяТаблицы.ИзменитьСтроку() является штатным, безопасным и рекомендуемым фирмой 1С.

Разбор типовых проблем и ограничений

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

  1. Свойство "Только просмотр": Если у таблицы, строки или конкретного поля установлено ТолькоПросмотр = Истина, метод ИзменитьСтроку() просто не сработает. Проверьте также права доступа пользователя.
  2. Доступность: Если Доступность = Ложь, элемент не может получить фокус.
  3. Контекст вызова: Если вы пытаетесь вызвать этот код в процедурах ПриОткрытии или ПередОткрытием, форма может еще не до конца инициализировать графические элементы. В таких случаях иногда помогает использование обработчика ожидания с минимальной задержкой (0.1 сек).

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

Резюме: Для корректной активации ячейки всегда используйте ПолучитьИдентификатор() вместо индексов, управляйте свойством ТекущийЭлемент формы для выбора колонки и завершайте действие методом ИзменитьСтроку(). Это обеспечит надежную работу интерфейса в любых условиях.

← На главную