Табличные части – один из самых часто используемых элементов в конфигурациях 1С. При работе с ними часто возникает задача: «Как получить доступ к той строке, с которой пользователь в данный момент работает?». В этой статье мы разберём все способы обращения к текущей строке табличной части, рассмотрим примеры кода и типичные ошибки.
Содержание
- Что такое табличная часть и текущая строка
- Основные методы получения текущей строки
- Примеры использования в разных контекстах
- Лучшие практики и типичные подводные камни
- Краткое резюме
Что такое табличная часть и текущая строка
Табличная часть – это реквизит типа Таблица, который хранит набор строк, каждая из которых представляет собой запись (объект СтрокаТаблицы). При работе в пользовательском интерфейсе (форме) пользователь может выделять одну из строк – эта строка считается текущей.
Текущая строка важна в следующих сценариях:
- Обработчики событий кнопок, меню и команд формы;
- Валидация данных в обработчике
ПередЗаписьюилиПередЗаписьюТабличнойЧасти; - Автоматическое заполнение реквизитов в зависимости от выбранной строки.
Основные методы получения текущей строки
В 1С существует несколько способов «достучаться» до текущей строки. Выбор зависит от того, где вы пишете код: в модуле формы, в модуле объекта, в обработчике события табличной части и т.д.
ТекущаяСтрока (в модуле формы)
Самый простой способ – использовать свойство ТекущаяСтрока табличного поля формы.
// Пример в модуле формы
ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Предупреждение("Не выбрана строка!");
Иначе
Сообщить("Выбран товар: " + ТекСтрока.Наименование);
КонецЕсли;
ТекущийЭлемент (в обработчике события табличной части)
Внутри обработчиков событий табличной части (например, ПередЗаписью, ПослеЗаписи) объект Элемент указывает на текущую строку.
// Обработчик ПередЗаписьюТабличнойЧасти
Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
// Элемент – это текущая строка
Если Элемент.Количество < 0 Тогда
Отказ = Истина;
Предупреждение("Количество не может быть отрицательным");
КонецЕсли;
КонецПроцедуры
Выбрать + ТекущаяСтрока (в модуле объекта)
Если код находится в модуле объекта (например, в обработчике ПередЗаписью самого документа), то прямого доступа к табличному полю формы нет. Нужно получить набор строк через реквизит и затем определить, какая из них была «текущей» в момент вызова.
// Модуль объекта документа
Процедура ПередЗаписью(Отказ, СтандартнаяОбработка)
// Предположим, реквизит ТабличнаяЧастьТовары
Выборка = ТабличнаяЧастьТовары.Выбрать;
Пока Выборка.Следующий Цикл
// Здесь нет понятия «текущей» строки, но можно проверять флаг
Если Выборка.ЭтоТекущаяСтрока Тогда // пользовательский реквизит
// Действия с текущей строкой
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для реализации свойства ЭтоТекущаяСтрока обычно используют дополнительный реквизит типа Булево, который устанавливается в обработчике формы при выборе строки.
ТекущаяСтрока у объекта ТаблицаЗначений
Если табличная часть хранится в переменной типа ТаблицаЗначений, то текущая строка определяется через метод ТекущаяСтрока:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование");
Таблица.Колонки.Добавить("Количество");
// Добавляем строки
Таблица.ДобавитьСтроку(, "Товар А", 10);
Таблица.ДобавитьСтроку(, "Товар Б", 5);
// Выбираем текущую (по умолчанию – первая)
ТекСтрока = Таблица.ТекущаяСтрока;
Сообщить(ТекСтрока.Наименование);
ТекущийЭлемент в обработчике КонтекстноеМеню табличной части
При работе с контекстным меню в табличной части текущий элемент передаётся в параметре Элемент обработчика.
Процедура ТоварыКонтекстноеМеню(Элемент, СтандартнаяОбработка)
// Элемент – строка, над которой открыто меню
Сообщить("Выбран пункт меню для товара: " + Элемент.Наименование);
КонецПроцедуры
Примеры использования в разных контекстах
Кнопка «Скопировать строку» в форме документа
Процедура КнопкаСкопироватьНажатие(Кнопка)
ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Предупреждение("Выберите строку для копирования");
Возврат;
КонецЕсли;
// Создаём копию
НоваяСтрока = ТабличноеПолеТовары.Добавить;
НоваяСтрока.Наименование = ТекСтрока.Наименование;
НоваяСтрока.Количество = ТекСтрока.Количество;
// При необходимости меняем другие реквизиты
КонецПроцедуры
Автоматическое заполнение цены из справочника при выборе товара
Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
Если Элемент.ЭтоНовый Тогда
// Находим цену в справочнике Товары
Товар = Справочники.Товары.НайтиПоНаименованию(Элемент.Наименование);
Если Товар <> Неопределено Тогда
Элемент.Цена = Товар.ЦенаПродажи;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проверка уникальности комбинации полей в табличной части
Процедура ТоварыПередЗаписью(Элемент, Отказ, СтандартнаяОбработка)
Выборка = ТабличнаяЧастьТовары.Выбрать;
Пока Выборка.Следующий Цикл
Если Выборка.ЭтоНеЭлемент(Элемент) И
Выборка.КодТовара = Элемент.КодТовара И
Выборка.Склад = Элемент.Склад Тогда
Отказ = Истина;
Предупреждение("Для выбранного склада уже есть строка с таким товаром.");
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обращение к текущей строке из внешней обработки (например, обработка «Импорт»)
Процедура ОбработатьТабличнуюЧасть(Таблица)
// Таблица – объект ТаблицаЗначений, полученный из внешнего файла
Для Каждого Строка Из Таблица Цикл
// Здесь «текущая» строка – просто текущий элемент цикла
// Пример: проверяем наличие товара в справочнике
Товар = Справочники.Товары.НайтиПоКоду(Строка.КодТовара);
Если Товар = Неопределено Тогда
Предупреждение("Товар с кодом " + Строка.КодТовара + " не найден.");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Лучшие практики и типичные подводные камни
- Не использовать глобальные переменные для хранения текущей строки. Это приводит к конфликтам при работе с несколькими формами одновременно.
- Проверять значение
ТекущаяСтроканаНеопределено. Пользователь может кликнуть кнопку, не выбрав строку. - Не менять структуру табличной части в обработчике
ПередЗаписьюТабличнойЧасти. Добавление/удаление строк в этом событии может вызвать бесконечный цикл записи. - Для массовых операций используйте
Выбратьи циклПока Выборка.Следующий, а не перебирайте строки черезТекущаяСтрокав каждом проходе. - Если требуется знать, какая строка была активна в момент вызова процедуры из модуля объекта, передавайте её явно. Например, через параметр процедуры, установленный в обработчике формы.
- Сохраняйте состояние текущей строки при переключении вкладок. Для этого удобно использовать реквизит
ТекущаяСтрокав форме (тип СтрокаТаблицы).
Пример безопасного доступа к текущей строке в обработчике формы
Процедура КнопкаУдалитьНажатие(Кнопка)
ТекСтрока = ТабличноеПолеТовары.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Предупреждение("Выберите строку для удаления");
Возврат;
КонецЕсли;
// Подтверждение действия
Если Не Подтверждение("Удалить строку " + ТекСтрока.Наименование + "?") Тогда
Возврат;
КонецЕсли;
ТабличноеПолеТовары.УдалитьСтроку(ТекСтрока);
КонецПроцедуры
Краткое резюме
Обращение к текущей строке табличной части – одна из базовых задач разработки в 1С. Основные способы:
- Свойство
ТекущаяСтрокатабличного поля формы; - Параметр
Элементв обработчиках событий табличной части; - Метод
Выбратьи перебор строк в модуле объекта; - Метод
ТекущаяСтрокау объектаТаблицаЗначений.
Помните о проверке на Неопределено, избегайте изменения структуры табличной части в неподходящих событиях и всегда учитывайте контекст (форма, объект, обработка). При соблюдении этих рекомендаций работа с табличными частями будет надёжной и удобной.
Автор статьи: ваш виртуальный помощник. Дата публикации: .