Как получить данные из текущей ячейки табличной части в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Разберем, почему стандартный обработчик изменения значения не подходит для этой задачи, какое событие таблицы необходимо использовать и как правильно написать код с учетом особенных условий платформы.

Выясним причину ошибки: почему не подходит ПриИзменении

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

Кроме того, если прописать прямой вызов присвоения данных для всех колонок одновременно, будут перезаписываться сразу несколько реквизитов документа, независимо от того, в какой именно колонке находится курсор.

Решение задачи: использование события ПриАктивизацииЯчейки

Для отслеживания перемещения курсора по ячейкам табличного поля необходимо использовать событие ПриАктивизацииЯчейки. Оно вызывается каждый раз, когда пользователь выбирает новую ячейку мышью или переходит на нее с помощью клавиш клавиатуры.

Рассмотрим алгоритм действий по шагам:

  1. Перейдем к свойствам табличной части на форме и создадим обработчик события ПриАктивизацииЯчейки.
  2. Проверим имя активной колонки с помощью свойства ТекущаяКолонка.Имя элемента формы.
  3. В зависимости от имени колонки прочитаем значение из текущей строки и присвоим его соответствующему реквизиту.

Рассмотрим пример реализации кода для обычных форм:


Процедура ТабличнаяЧасть1ПриАктивизацииЯчейки(Элемент)
    
    // Проверяем наличие выбранной строки
    Если Элемент.ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Определяем, какая колонка активна в данный момент
    Если Элемент.ТекущаяКолонка.Имя = "Телефон" Тогда
        
        Телефон = Элемент.ТекущаяСтрока.Телефон;
        
    ИначеЕсли Элемент.ТекущаяКолонка.Имя = "Факс" Тогда
        
        АдресЭлектронный = Элемент.ТекущаяСтрока.Факс;
        
    КонецЕсли;

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

Важная защита от ошибок платформы

При работе с событием ПриАктивизацииЯчейки необходимо учитывать особенности его вызова платформами 1С. Это событие срабатывает не только при клике мышью, но и при открытии формы, автозаполнении, удалении или очистке строк.

Если табличная часть пуста или ни одна строка не выделена, свойства ТекущаяСтрока или ТекущиеДанные возвращают значение Неопределено. Обращение к реквизитам через `Неопределено` вызовет критическую ошибку «Поле объекта не обнаружено».

Поэтому в самом начале процедуры всегда следует добавлять проверку:


Если Элемент.ТекущиеДанные = Неопределено Или Элемент.ТекущаяКолонка = Неопределено Тогда
    Возврат;
КонецЕсли;

Альтернативный подход: событие Выбор (Selection)

Если требуется, чтобы заполнение реквизита происходило не при любом перемещении курсора клавиатурой, а именно при явном двойном клике мышью или нажатии клавиши Enter, проанализируем использование события Выбор.

Преимущества события Выбор:

Пример реализации с помощью события Выбор:


Процедура ТабличнаяЧасть1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    
    Если Колонка.Имя = "Телефон" Тогда
        Телефон = ВыбраннаяСтрока.Телефон;
    ИначеЕсли Колонка.Имя = "Факс" Тогда
        АдресЭлектронный = ВыбраннаяСтрока.Факс;
    КонецЕсли;

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

Различия для управляемых и обычных форм

Проанализируем разницу в обращениях к свойствам элементов в зависимости от типа используемых форм:

← На главную