При разработке интерактивных форм в 1С часто возникает задача подстановки значений из конкретной ячейки табличной части в реквизиты документа или формы. Например, при щелчке по ячейке с номером телефона необходимо перенести его в реквизит Телефон, а при щелчке по адресу электронной почты — в реквизит АдресЭлектронный.
Разберем, почему стандартный обработчик изменения значения не подходит для этой задачи, какое событие таблицы необходимо использовать и как правильно написать код с учетом особенных условий платформы.
Типичная ошибка начинающих разработчиков — попытка использовать событие ПриИзменении для ячейки или самой таблицы. Это событие срабатывает только при интерактивном редактировании данных в ячейке. Если пользователь просто кликает по ячейкам для навигации или просмотра, событие ПриИзменении не вызывается.
Кроме того, если прописать прямой вызов присвоения данных для всех колонок одновременно, будут перезаписываться сразу несколько реквизитов документа, независимо от того, в какой именно колонке находится курсор.
Для отслеживания перемещения курсора по ячейкам табличного поля необходимо использовать событие ПриАктивизацииЯчейки. Оно вызывается каждый раз, когда пользователь выбирает новую ячейку мышью или переходит на нее с помощью клавиш клавиатуры.
Рассмотрим алгоритм действий по шагам:
ПриАктивизацииЯчейки.ТекущаяКолонка.Имя элемента формы.Рассмотрим пример реализации кода для обычных форм:
Процедура ТабличнаяЧасть1ПриАктивизацииЯчейки(Элемент)
// Проверяем наличие выбранной строки
Если Элемент.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Определяем, какая колонка активна в данный момент
Если Элемент.ТекущаяКолонка.Имя = "Телефон" Тогда
Телефон = Элемент.ТекущаяСтрока.Телефон;
ИначеЕсли Элемент.ТекущаяКолонка.Имя = "Факс" Тогда
АдресЭлектронный = Элемент.ТекущаяСтрока.Факс;
КонецЕсли;
КонецПроцедуры
При работе с событием ПриАктивизацииЯчейки необходимо учитывать особенности его вызова платформами 1С. Это событие срабатывает не только при клике мышью, но и при открытии формы, автозаполнении, удалении или очистке строк.
Если табличная часть пуста или ни одна строка не выделена, свойства ТекущаяСтрока или ТекущиеДанные возвращают значение Неопределено. Обращение к реквизитам через `Неопределено` вызовет критическую ошибку «Поле объекта не обнаружено».
Поэтому в самом начале процедуры всегда следует добавлять проверку:
Если Элемент.ТекущиеДанные = Неопределено Или Элемент.ТекущаяКолонка = Неопределено Тогда
Возврат;
КонецЕсли;
Если требуется, чтобы заполнение реквизита происходило не при любом перемещении курсора клавиатурой, а именно при явном двойном клике мышью или нажатии клавиши Enter, проанализируем использование события Выбор.
Преимущества события Выбор:
Пример реализации с помощью события Выбор:
Процедура ТабличнаяЧасть1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
Если Колонка.Имя = "Телефон" Тогда
Телефон = ВыбраннаяСтрока.Телефон;
ИначеЕсли Колонка.Имя = "Факс" Тогда
АдресЭлектронный = ВыбраннаяСтрока.Факс;
КонецЕсли;
КонецПроцедуры
Проанализируем разницу в обращениях к свойствам элементов в зависимости от типа используемых форм:
Элемент.ТекущаяКолонка.Имя и Элемент.ТекущаяСтрока.Элемент.ТекущийЭлемент.Имя для получения имени поля и Элемент.ТекущиеДанные для получения структуры данных текущей строки. Обращение ТекущаяСтрока в управляемых формах возвращает индекс или идентификатор строки, а не сами данные.