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