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