К статье
Практический материал

Разработка и Конфигурация · 12 мин

1С: как получить текущую строку таблицы

Как получить текущую строку в 1С: ТекущиеДанные, ТекущаяСтрока, ЭлементыФормы. Разбор для управляемых и обычных форм, примеры кода, типичные ошибки и FAQ.

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

Ключевая путаница у начинающих разработчиков возникает между свойствами ТекущаяСтрока и ТекущиеДанные. Первое возвращает идентификатор строки (число для таблицы значений или ссылку для динамического списка), второе — сами данные строки в виде объекта с полями. Ошибочное использование одного вместо другого — причина большинства ошибок вида «Поле объекта не обнаружено».

Ниже разобраны оба сценария для управляемых и обычных форм, работа с динамическими списками, программная установка текущей строки и типичные ошибки с проверкой результата.

Как получить данные текущей строки в управляемой форме

В управляемых формах (обычный режим работы конфигураций на платформе 8.3) таблица на форме представлена элементом формы типа «Таблица». Обращение к нему идёт через коллекцию Элементы. Основной способ получить данные строки под курсором — свойство ТекущиеДанные:

&НаКлиенте

Процедура ТоварыПриАктивизацииСтроки(Элемент)

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат; // нет активной строки

КонецЕсли;

Сообщить("Выбран товар: " + ТекущиеДанные.Номенклатура);

КонецПроцедуры

Объект ТекущиеДанные имеет тип, соответствующий данным формы: для таблицы значений это ДанныеФормыЭлементКоллекции, для табличной части объекта — данные строки табличной части. Обращение к колонкам идёт через точку по имени реквизита, как в примере выше.

Важный нюанс: если таблица пустая или пользователь снял выделение, ТекущиеДанные возвращает Неопределено. Обращение к полю без проверки приведёт к ошибке выполнения. Проверка на Неопределено — обязательный элемент любого обработчика, работающего с текущей строкой.

Как получить идентификатор текущей строки

Свойство ТекущаяСтрока возвращает не данные, а ключ строки. Для таблицы, связанной с таблицей значений или табличной частью, это число — идентификатор строки в коллекции ДанныеФормыКоллекция. По этому идентификатору строку можно найти методом НайтиПоИдентификатору():

&НаКлиенте

Процедура ПоказатьНомерСтроки(Команда)

Идентификатор = Элементы.Товары.ТекущаяСтрока;

Если Идентификатор = Неопределено Тогда

Возврат;

КонецЕсли;

СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(Идентификатор);

Сообщить("Цена: " + СтрокаДанных.Цена);

КонецПроцедуры

Зачем нужен этот обходной путь, если есть ТекущиеДанные? Идентификатор строки можно передать в серверную процедуру: сами ТекущиеДанные с клиента на сервер напрямую не передаются как объект, а число-идентификатор передаётся без проблем. На сервере строка восстанавливается через НайтиПоИдентификатору() — это стандартный приём для контекстных и внеконтекстных серверных вызовов.

Текущая строка динамического списка

Динамический список (список документов, справочника на форме списка) устроен иначе. Здесь ТекущаяСтрока возвращает не число, а значение ключа записи — для ссылочных списков это ссылка на объект:

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

ТекущаяСсылка = Элементы.Список.ТекущаяСтрока;

Если ТекущаяСсылка = Неопределено Тогда

Возврат;

КонецЕсли;

// ТекущаяСсылка — это уже ссылка на документ/элемент справочника

КонецПроцедуры

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

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

Текущая строка в обычных формах

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

Процедура ТоварыПриАктивизацииСтроки(Элемент)

ТекущаяСтрока = ЭлементыФормы.Товары.ТекущиеДанные;

Если ТекущаяСтрока = Неопределено Тогда

Возврат;

КонецЕсли;

Сообщить("Количество: " + ТекущаяСтрока.Количество);

КонецПроцедуры

Здесь ТекущиеДанные — это строка табличной части или таблицы значений с прямым доступом к колонкам. Свойство ТекущаяСтрока табличного поля в обычных формах тоже существует и возвращает ту же строку данных, а для динамических списков — ссылку. Разделение «идентификатор / данные» в обычных формах менее выражено, потому что вся логика выполняется в одном контексте толстого клиента.

Сравнение вариантов

ТекущиеДанные

Подходит, когда нужно прочитать или изменить значения колонок строки прямо на клиенте. Ограничение: объект нельзя передать на сервер напрямую.

ТекущаяСтрока + НайтиПоИдентификатору

Подходит для передачи строки в серверную процедуру и для программной установки активной строки. Требует дополнительного вызова поиска.

ТекущаяСтрока динамического списка

Даёт сразу ссылку на объект — удобно для открытия, печати, запросов к реквизитам. Не работает для получения изменённых, но не записанных данных.

Программная установка текущей строки

Обратная задача — сделать строку текущей из кода. Для этого свойству ТекущаяСтрока присваивается идентификатор нужной строки. Типичный сценарий — вернуть курсор на строку после обновления данных или позиционироваться на новой добавленной строке:

&НаКлиенте

Процедура ПозиционироватьНаСтроке(Команда)

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрокаТовара.Номенклатура = ИскомыйТовар Тогда

Элементы.Товары.ТекущаяСтрока = СтрокаТовара.ПолучитьИдентификатор();

Прервать;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Для динамического списка установка ещё проще: свойству присваивается ссылка на объект, и список сам позиционируется на нужной записи (например, Элементы.Список.ТекущаяСтрока = СсылкаНаДокумент;). Это стандартный способ открыть форму списка с позиционированием на конкретном объекте.

Если строка не найдена или скрыта отбором, присвоение идентификатора не вызовет ошибки, но и позиционирования не произойдёт. Проверяйте результат визуально или через повторное чтение ТекущаяСтрока после присвоения.

Порядок действий для получения строки на сервере
  1. 1
    На клиенте получите идентификатор: Элементы.Товары.ТекущаяСтрока
  2. 2
    Проверьте, что идентификатор не равен Неопределено
  3. 3
    Передайте идентификатор параметром в серверную процедуру
  4. 4
    На сервере найдите строку: Объект.Товары.НайтиПоИдентификатору(Идентификатор)
  5. 5
    Проверьте, что найденная строка не Неопределено, и работайте с её полями

Типичные ошибки и как их проверить

Первая ошибка — обращение к ТекущиеДанные в серверном контексте. Свойства элемента формы Элементы доступны только на клиенте; в серверной процедуре Элементы.Товары.ТекущиеДанные недоступно или работает иначе. Правильный путь — передать идентификатор с клиента и использовать НайтиПоИдентификатору() на сервере.

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

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

Типичные ошибки
01
Чтение полей ТекущиеДанные без проверки на Неопределено — ошибка выполнения при пустой таблице
02
Передача объекта ТекущиеДанные в серверную процедуру — объект недоступен на сервере, нужно передавать идентификатор
03
Путаница между НомерСтроки и идентификатором строки — поиск по номеру через НайтиПоИдентификатору не работает
04
Обращение к Элементы.Товары в серверном контексте — свойство недоступно, работайте через данные формы
05
Использование сохранённого идентификатора после перезаполнения таблицы — строка не находится

Проверка результата и отладка

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

В отладчике поставьте точку останова внутри обработчика и добавьте в табло выражения Элементы.Товары.ТекущаяСтрока и Элементы.Товары.ТекущиеДанные. Сравнение значений сразу покажет разницу между идентификатором и данными и поможет найти место, где используется не то свойство.

Контрольные точки

Как проверить результат

Значение ТекущиеДанные при активной строке
Норма

Объект с доступными полями колонок

Тревожный признак

Неопределено — строка не выбрана или таблица пуста

Тип значения ТекущаяСтрока
Норма

Число для таблицы значений, ссылка для динамического списка

Тревожный признак

Не тот тип — проверьте источник данных таблицы

Результат НайтиПоИдентификатору
Норма

Строка коллекции с нужными данными

Тревожный признак

Неопределено — идентификатор устарел или взят из другой коллекции

Итог

Что важно запомнить

Данные строки — через ТекущиеДанные, идентификатор — через ТекущаяСтрока. Для сервера передавайте идентификатор и ищите строку через НайтиПоИдентификатору. Всегда проверяйте результат на Неопределено. Для динамического списка ТекущаяСтрока — это ссылка на объект.

Частые вопросы

Чем ТекущаяСтрока отличается от ТекущиеДанные?

ТекущаяСтрока — это ключ строки (число-идентификатор для таблицы значений или ссылка для динамического списка), а ТекущиеДанные — объект со значениями колонок этой строки. Для чтения полей используйте ТекущиеДанные, для передачи строки на сервер и программного позиционирования — ТекущаяСтрока.

Как получить текущую строку табличной части в серверной процедуре?

Напрямую на сервере обратиться к элементу формы нельзя. На клиенте получите идентификатор через Элементы.ИмяТаблицы.ТекущаяСтрока, передайте его параметром в серверную процедуру и там выполните Объект.ИмяТабличнойЧасти.НайтиПоИдентификатору(Идентификатор).

Почему ТекущиеДанные возвращает Неопределено?

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

Как получить номер текущей строки, как в колонке «№»?

Прочитайте реквизит НомерСтроки у данных строки: Элементы.Товары.ТекущиеДанные.НомерСтроки. Не путайте его с идентификатором из ТекущаяСтрока — это разные значения, и один не может заменить другой.

Как получить текущую строку динамического списка документов?

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

Работает ли ТекущиеДанные в обычных формах?

Да. В обычных формах используется ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные — возвращается строка данных с прямым доступом к колонкам. Разделения на клиентский и серверный контекст там нет, поэтому код проще, но подход устарел вместе с обычными формами.