Разработка и Конфигурация · 11 мин
Как программно активировать строку табличной части в 1С
Как программно активировать строку табличной части в 1С: свойство ТекущаяСтрока, поиск нужной строки, активация поля, типичные ошибки и примеры кода для формы.
Активизация строки табличной части — типовая задача при доработке форм документов и справочников в 1С:Предприятии. Например, после программного добавления товара нужно сразу поставить курсор на новую строку, чтобы пользователь ввёл количество и цену, или после проверки заполнения — подсветить строку с ошибкой. Делать это вручную поиском по форме нельзя: у таблицы формы есть специальное свойство, которое управляет текущей (активной) строкой.
За активизацию отвечает свойство ТекущаяСтрока расширения таблицы формы (объект, доступный через Элементы.<ИмяТаблицы>). В него присваивается не сама строка данных, а её идентификатор — значение свойства ПолучитьИдентификатор() у строки коллекции данных формы. Это ключевой момент, который чаще всего вызывает ошибки у начинающих разработчиков.
Ниже разобраны рабочие приёмы: активизация последней добавленной строки, поиск и активация строки по условию, перевод фокуса в конкретную колонку, а также типичные ситуации, когда активация «не срабатывает».
Как устроена активация строки на форме
Табличная часть на форме представлена двумя связанными объектами. Первый — реквизит формы с данными (например, Объект.Товары или отдельный реквизит типа «ДанныеФормыКоллекция»). Второй — элемент формы «ТаблицаФормы», который отображает эти данные и управляет интерактивностью: текущей строкой, выделением, текущим полем.
Активизировать строку можно только через элемент формы, но ссылаться нужно на строку данных. Связующее звено — идентификатор строки, уникальное число, которое платформа присваивает каждой строке коллекции данных формы. Именно поэтому прямое присваивание Элементы.Товары.ТекущаяСтрока = СтрокаТаблицы не работает: ожидается число, а не объект.
Правильный шаблон выглядит так: получить строку коллекции данных (по индексу, поиском или как результат добавления), взять у неё идентификатор и присвоить его свойству ТекущаяСтрока таблицы формы.
Активизация последней добавленной строки
Самый частый сценарий — после программного добавления строки сразу сделать её активной. Метод Добавить() коллекции возвращает новую строку, поэтому идентификатор известен сразу:
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденныйТовар;
Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
После выполнения кода курсор в таблице переместится на добавленную строку. Если таблица содержит много строк и новая строка не попадает в видимую область, платформа автоматически прокрутит таблицу до неё — отдельный код для прокрутки обычно не требуется.
Если строка добавляется не методом Добавить(), а, например, заполнением коллекции целиком, последнюю строку можно получить по индексу: Объект.Товары[Объект.Товары.Количество() - 1]. Далее действует тот же приём с ПолучитьИдентификатор().
- 1Получите строку коллекции данных формы (Добавить(), по индексу или поиском)
- 2Вызовите у строки метод ПолучитьИдентификатор()
- 3Присвойте идентификатор свойству Элементы.<ИмяТаблицы>.ТекущаяСтрока
- 4При необходимости задайте Элементы.<ИмяТаблицы>.ТекущийЭлемент для перевода курсора в нужную колонку
- 5Проверьте результат: курсор стоит на нужной строке, таблица прокручена до неё
Активация строки, найденной по условию
Когда нужно активировать не новую, а уже существующую строку — например, строку с незаполненной ценой при проверке документа, — сначала выполняется поиск в коллекции данных. Для табличной части объекта доступен метод НайтиСтроки(), который возвращает массив подходящих строк.
ПараметрыОтбора = Новый Структура("Цена", 0);
НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;
Если табличная часть на форме представлена динамическим списком или деревом значений, поиск выполняется иначе: для динамического списка идентификатор текущей строки — это ссылка на объект, и активация делается присваиванием ссылки тому же свойству ТекущаяСтрока. Для дерева значений применяется обход строк с рекурсией, так как НайтиСтроки() ищет только на одном уровне.
Полезный приём — активировать строку с ошибкой в цикле проверки и прервать обход на первой найденной проблеме. Пользователь сразу видит проблемную строку и может исправить данные без ручного поиска по документу.
Перевод курсора в конкретную колонку
Активировать строку часто недостаточно: требуется, чтобы фокус ввода встал в определённое поле, например в «Количество». Для этого у таблицы формы есть свойство ТекущийЭлемент, которому присваивается ссылка на элемент формы — поле нужной колонки.
Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыКоличество;
Важно: ТекущийЭлемент принимает именно элемент формы (объект из коллекции Элементы), а не имя колонки строкой и не поле данных. Имя элемента можно посмотреть в редакторе формы в конфигураторе — оно не всегда совпадает с именем колонки данных.
Порядок присваивания имеет значение: сначала активируется строка, затем устанавливается текущее поле. Если поменять местами, установка поля может быть проигнорирована, так как оно относится к другой строке.
Активация из клиентского и серверного контекста
Управление текущей строкой — операция над элементом формы, поэтому код активации должен выполняться там, где доступна коллекция Элементы. В модуле формы это и клиентские, и серверные процедуры с признаком «НаСервере» (при вызове из формы, где элементы доступны). В модуле объекта или общем модуле доступа к элементам формы нет — активация оттуда невозможна в принципе.
Типовая схема для управляемого приложения: серверная процедура формы выполняет поиск или добавление строки и возвращает идентификатор, а клиентская процедура присваивает его свойству ТекущаяСтрока. Это снижает число серверных вызовов и соответствует рекомендуемой архитектуре тонкого клиента.
Если активация выполняется в обработчике ожидания или после асинхронного вызова (например, после закрытия диалога ввода), убедитесь, что форма ещё открыта и таблица не пересоздана. При динамическом пересоздании элементов формы идентификаторы строк могут измениться, и сохранённый ранее идентификатор окажется недействительным.
Типичные ошибки и как их исправить
Первая и самая распространённая ошибка — присваивание в ТекущаяСтрока самой строки данных или её индекса вместо идентификатора. Индекс строки (0, 1, 2...) и идентификатор — разные вещи: идентификаторы не обязаны идти подряд и не совпадают с индексами после удаления строк. Признак проблемы — активируется не та строка или возникает ошибка преобразования значения.
Вторая ошибка — попытка активировать строку в обработчике ПриСозданииНаСервере до того, как данные загружены в форму, либо до отображения формы пользователю. В ряде случаев присваивание «сбрасывается» при последующей инициализации. Надёжнее выполнять активацию в обработчике ПриОткрытии на клиенте или после явного действия пользователя.
Третья группа проблем связана с отбором строк. Если для таблицы установлен отбор (свойство ОтборСтрок), активировать строку, не проходящую отбор, нельзя — она просто не отображается. Перед активацией либо сбросьте отбор, либо убедитесь, что строка ему удовлетворяет.
Проверка результата и альтернативные приёмы
Проверить, что активация сработала, можно чтением свойства ТекущаяСтрока сразу после присваивания: оно должно вернуть тот же идентификатор. Дополнительно через Элементы.Товары.ТекущиеДанные доступны значения полей активной строки — сверьте ключевые поля с ожидаемыми.
Если нужно не только активировать, но и выделить несколько строк, используется свойство ВыделенныеСтроки таблицы формы — коллекция идентификаторов, в которую можно добавлять значения методом Добавить(). Это удобно, например, для подсветки всех строк с ошибками.
Альтернатива активации — метод ИзменитьСтроку() таблицы формы, который переводит текущую строку в режим редактирования, как при двойном щелчке мышью. Он уместен, когда после активации пользователь должен сразу начать ввод, но требует, чтобы строка уже была текущей.
Как проверить результат
Возвращается тот же идентификатор, что был присвоен
Возвращается Неопределено или другой идентификатор — строка не активировалась
Содержит значения полей нужной строки
Содержит данные другой строки или Неопределено
Курсор на нужной строке, таблица прокручена до неё, фокус в заданной колонке
Выделена другая строка или фокус остался в прежнем поле
Часто задаваемые вопросы
Можно ли активировать строку по номеру строки, который видит пользователь?
Напрямую по номеру — нет, так как ТекущаяСтрока принимает идентификатор, а не номер. Но номер строки совпадает с индексом плюс единица, поэтому можно взять строку по индексу: Объект.Товары[НомерСтроки - 1], а затем получить её идентификатор методом ПолучитьИдентификатор().
Почему активация работает в отладчике, но не работает у пользователя?
Частые причины — установленный отбор строк, скрывающий нужную строку, пересоздание формы или реквизитов между получением идентификатора и присваиванием, а также выполнение кода до открытия формы. Проверяйте активацию в том же контексте и в тот же момент жизненного цикла формы, что и в рабочем сценарии.
Как активировать строку в динамическом списке?
У динамического списка идентификатором строки служит ссылка на объект. Достаточно присвоить нужную ссылку свойству ТекущаяСтрока таблицы формы, связанной со списком. Если строки со ссылкой нет в текущей выборке из-за отбора списка, активация не сработает.
Можно ли активировать строку и сразу открыть её редактирование?
Да. Сначала присвойте идентификатор свойству ТекущаяСтрока, затем вызовите метод ИзменитьСтроку() у таблицы формы. Строка перейдёт в режим редактирования, как при двойном щелчке. При необходимости дополнительно установите ТекущийЭлемент, чтобы ввод начался с нужной колонки.
Чем ТекущиеДанные отличается от ТекущаяСтрока?
ТекущаяСтрока — это идентификатор (число или ссылка), который можно читать и присваивать для управления активной строкой. ТекущиеДанные — объект с фактическими значениями полей активной строки, доступный только для чтения в клиентском контексте. Для активации используется ТекущаяСтрока, для проверки содержимого — ТекущиеДанные.
Работает ли этот приём в обычных формах?
В обычных формах механика иная: у элемента управления «ТабличноеПоле» есть свойство ТекущаяСтрока, но оно принимает саму строку табличной части, а не идентификатор. Присваивание выглядит как ЭлементыФормы.Товары.ТекущаяСтрока = СтрокаТабличнойЧасти. Метод ПолучитьИдентификатор() там не используется.
Что важно запомнить
Активация строки выполняется присваиванием идентификатора строки свойству ТекущаяСтрока таблицы формы; идентификатор получают методом ПолучитьИдентификатор() непосредственно перед присваиванием. Для фокуса в конкретной колонке дополнительно задаётся ТекущийЭлемент. Учитывайте отбор строк, момент выполнения кода и недопустимость повторного использования старых идентификаторов.