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