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

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Табличные части – один из самых часто используемых элементов в конфигурациях 1С. При работе с ними часто возникает задача: «Как получить доступ к той строке, с которой пользователь в данный момент работает?». В этой статье мы разберём все способы обращения к текущей строке табличной части, рассмотрим примеры кода и типичные ошибки.


Содержание

  1. Что такое табличная часть и текущая строка
  2. Основные методы получения текущей строки
  3. Примеры использования в разных контекстах
  4. Лучшие практики и типичные подводные камни
  5. Краткое резюме

Что такое табличная часть и текущая строка

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

Текущая строка важна в следующих сценариях:

  • Обработчики событий кнопок, меню и команд формы;
  • Валидация данных в обработчике ПередЗаписью или ПередЗаписьюТабличнойЧасти;
  • Автоматическое заполнение реквизитов в зависимости от выбранной строки.

Основные методы получения текущей строки

В 1С существует несколько способов «достучаться» до текущей строки. Выбор зависит от того, где вы пишете код: в модуле формы, в модуле объекта, в обработчике события табличной части и т.д.

ТекущаяСтрока (в модуле формы)

Самый простой способ – использовать свойство ТекущаяСтрока табличного поля формы.

// Пример в модуле формы
ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
 Предупреждение("Не выбрана строка!");
Иначе
 Сообщить("Выбран товар: " + ТекСтрока.Наименование);
КонецЕсли;

ТекущийЭлемент (в обработчике события табличной части)

Внутри обработчиков событий табличной части (например, ПередЗаписью, ПослеЗаписи) объект Элемент указывает на текущую строку.

// Обработчик ПередЗаписьюТабличнойЧасти
Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
 // Элемент – это текущая строка
 Если Элемент.Количество < 0 Тогда
 Отказ = Истина;
 Предупреждение("Количество не может быть отрицательным");
 КонецЕсли;
КонецПроцедуры

Выбрать + ТекущаяСтрока (в модуле объекта)

Если код находится в модуле объекта (например, в обработчике ПередЗаписью самого документа), то прямого доступа к табличному полю формы нет. Нужно получить набор строк через реквизит и затем определить, какая из них была «текущей» в момент вызова.

// Модуль объекта документа
Процедура ПередЗаписью(Отказ, СтандартнаяОбработка)
 // Предположим, реквизит ТабличнаяЧастьТовары
 Выборка = ТабличнаяЧастьТовары.Выбрать;
 Пока Выборка.Следующий Цикл
 // Здесь нет понятия «текущей» строки, но можно проверять флаг
 Если Выборка.ЭтоТекущаяСтрока Тогда // пользовательский реквизит
 // Действия с текущей строкой
 КонецЕсли;
 КонецЦикла;
КонецПроцедуры

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

ТекущаяСтрока у объекта ТаблицаЗначений

Если табличная часть хранится в переменной типа ТаблицаЗначений, то текущая строка определяется через метод ТекущаяСтрока:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование");
Таблица.Колонки.Добавить("Количество");

// Добавляем строки
Таблица.ДобавитьСтроку(, "Товар А", 10);
Таблица.ДобавитьСтроку(, "Товар Б", 5);

// Выбираем текущую (по умолчанию – первая)
ТекСтрока = Таблица.ТекущаяСтрока;
Сообщить(ТекСтрока.Наименование);

ТекущийЭлемент в обработчике КонтекстноеМеню табличной части

При работе с контекстным меню в табличной части текущий элемент передаётся в параметре Элемент обработчика.

Процедура ТоварыКонтекстноеМеню(Элемент, СтандартнаяОбработка)
 // Элемент – строка, над которой открыто меню
 Сообщить("Выбран пункт меню для товара: " + Элемент.Наименование);
КонецПроцедуры

Примеры использования в разных контекстах

Кнопка «Скопировать строку» в форме документа

Процедура КнопкаСкопироватьНажатие(Кнопка)
 ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
 Если ТекСтрока = Неопределено Тогда
 Предупреждение("Выберите строку для копирования");
 Возврат;
 КонецЕсли;

 // Создаём копию
 НоваяСтрока = ТабличноеПолеТовары.Добавить;
 НоваяСтрока.Наименование = ТекСтрока.Наименование;
 НоваяСтрока.Количество = ТекСтрока.Количество;
 // При необходимости меняем другие реквизиты
КонецПроцедуры

Автоматическое заполнение цены из справочника при выборе товара

Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
 Если Элемент.ЭтоНовый Тогда
 // Находим цену в справочнике Товары
 Товар = Справочники.Товары.НайтиПоНаименованию(Элемент.Наименование);
 Если Товар <> Неопределено Тогда
 Элемент.Цена = Товар.ЦенаПродажи;
 КонецЕсли;
 КонецЕсли;
КонецПроцедуры

Проверка уникальности комбинации полей в табличной части

Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
 Выборка = ТабличнаяЧастьТовары.Выбрать;
 Пока Выборка.Следующий Цикл
 Если Выборка.ЭтоНеЭлемент(Элемент) И
 Выборка.КодТовара = Элемент.КодТовара И
 Выборка.Склад = Элемент.Склад Тогда
 Отказ = Истина;
 Предупреждение("Для выбранного склада уже есть строка с таким товаром.");
 Возврат;
 КонецЕсли;
 КонецЦикла;
КонецПроцедуры

Обращение к текущей строке из внешней обработки (например, обработка «Импорт»)

Процедура ОбработатьТабличнуюЧасть(Таблица)
 // Таблица – объект ТаблицаЗначений, полученный из внешнего файла
 Для Каждого Строка Из Таблица Цикл
 // Здесь «текущая» строка – просто текущий элемент цикла
 // Пример: проверяем наличие товара в справочнике
 Товар = Справочники.Товары.НайтиПоКоду(Строка.КодТовара);
 Если Товар = Неопределено Тогда
 Предупреждение("Товар с кодом " + Строка.КодТовара + " не найден.");
 КонецЕсли;
 КонецЦикла;
КонецПроцедуры

Лучшие практики и типичные подводные камни

  • Не использовать глобальные переменные для хранения текущей строки. Это приводит к конфликтам при работе с несколькими формами одновременно.
  • Проверять значение ТекущаяСтрока на Неопределено. Пользователь может кликнуть кнопку, не выбрав строку.
  • Не менять структуру табличной части в обработчике ПередЗаписьюТабличнойЧасти. Добавление/удаление строк в этом событии может вызвать бесконечный цикл записи.
  • Для массовых операций используйте Выбрать и цикл Пока Выборка.Следующий, а не перебирайте строки через ТекущаяСтрока в каждом проходе.
  • Если требуется знать, какая строка была активна в момент вызова процедуры из модуля объекта, передавайте её явно. Например, через параметр процедуры, установленный в обработчике формы.
  • Сохраняйте состояние текущей строки при переключении вкладок. Для этого удобно использовать реквизит ТекущаяСтрока в форме (тип СтрокаТаблицы).

Пример безопасного доступа к текущей строке в обработчике формы

Процедура КнопкаУдалитьНажатие(Кнопка)
 ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
 Если ТекСтрока = Неопределено Тогда
 Предупреждение("Выберите строку для удаления");
 Возврат;
 КонецЕсли;

 // Подтверждение действия
 Если Не Подтверждение("Удалить строку " + ТекСтрока.Наименование + "?") Тогда
 Возврат;
 КонецЕсли;

 ТабличноеПолеТовары.УдалитьСтроку(ТекСтрока);
КонецПроцедуры

Краткое резюме

Обращение к текущей строке табличной части – одна из базовых задач разработки в 1С. Основные способы:

  • Свойство ТекущаяСтрока табличного поля формы;
  • Параметр Элемент в обработчиках событий табличной части;
  • Метод Выбрать и перебор строк в модуле объекта;
  • Метод ТекущаяСтрока у объекта ТаблицаЗначений.

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


Автор статьи: ваш виртуальный помощник. Дата публикации: .