Как открыть другую форму документа при нажатии на ячейку табличной части?

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

При разработке интерфейсов в управляемых формах 1С часто возникает задача организовать расшифровку или детальный ввод информации по отдельной строке табличной части. Например, требуется открыть дополнительную форму этого же документа (вспомогательную форму расчетов, спецификаций или трудоемкости) по клику на конкретную колонку.

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

Почему не стоит использовать событие ПриАктивизацииЯчейки

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


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

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

Посмотрим на более надежные и удобные для пользователя способы реализации.

Способ 1. Использование события Выбор таблицы формы (Рекомендуемый)

Штатный механизм вызова расшифровки в 1С — это событие Выбор самой таблицы формы. Оно инициируется только при явном действии пользователя: при двойном клике левой кнопкой мыши или при нажатии клавиши Enter.

Разберем по шагам реализацию данного варианта:

  1. Выделим таблицу формы в дереве элементов и перейдем в панель свойств.
  2. Найдем событие Выбор и создадим процедуру-обработчик на клиенте.
  3. Проверим имя колонки, в которой произошло событие, и отключим стандартную обработку, чтобы платформа не переводила ячейку в режим прямого редактирования текста.

Посмотрим на пример кода:


&НаКлиенте
Процедура ТабличнаяЧасть1Выбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    Если Поле.Имя = "ТабличнаяЧасть1Трудоемкость" Тогда
        СтандартнаяОбработка = Ложь;
        
        ТекДанные = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
        Если ТекДанные = Неопределено Тогда
            Возврат;
        КонецЕсли;
        
        ПараметрыФормы = Новый Структура;
        ПараметрыФормы.Вставить("Ключ", Объект.Ссылка);
        ПараметрыФормы.Вставить("НомерСтроки", ТекДанные.НомерСтроки);
        
        ОткрытьФорму("Документ.РасчетПУ.Форма.ФормаТрудоемкости", ПараметрыФормы, ЭтотОбъект);
    КонецЕсли;
КонецПроцедуры

Способ 2. Кнопка открытия внутри ячейки

Если требуется предоставить пользователю визуальную подсказку о том, что значение можно развернуть в отдельном окне, включим специальную кнопку в поле ввода:

  1. В дереве элементов формы выберем поле колонки (например, ТабличнаяЧасть1Трудоемкость).
  2. В свойствах элемента включим флаг КнопкаОткрытия = Истина.
  3. В списке событий этого же элемента назначим обработчик события Открытие.

В этом случае в ячейке появится кнопка с лупой, а форма будет открываться по нажатию на кнопку или по клавише F4:


&НаКлиенте
Процедура ТабличнаяЧасть1ТрудоемкостьОткрытие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
    ОткрытьФорму("Документ.РасчетПУ.Форма.ФормаТрудоемкости", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

Способ 3. Колонка в режиме гиперссылки

Когда требуется открывать дополнительную форму строго по одиночному щелчку мыши, настроим колонку как гиперссылку:

  1. В свойствах поля колонки включим флаг Гиперссылка = Истина.
  2. Создадим обработчик события Нажатие для этого элемента.
  3. Установим СтандартнаяОбработка = Ложь; и вызовем форму.

&НаКлиенте
Процедура ТабличнаяЧасть1ТрудоемкостьНажатие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Ключ", Объект.Ссылка);
    
    ОткрытьФорму("Документ.РасчетПУ.Форма.ФормаТрудоемкости", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

Важные особенности при работе с дополнительными формами документа

Выясним технические нюансы, с которыми можно столкнуться при открытии второй формы одного и того же объекта:

  1. Несохраненные данные: В управляемом приложении каждая форма изолирована. Если документ еще ни разу не записан (Объект.Ссылка.Пустая()) или пользователь изменил строки в основной форме, открываемая вторая форма прочитает данные из базы и не увидит текущих правок. Перед вызовом второй формы необходимо либо записать документ, либо передавать значения напрямую через структуру параметров.
  2. Синхронизация результатов: Правки, внесенные во второй форме, не обновят основную форму автоматически. Для передачи информации обратно используем оповещения: вызываем метод Оповестить или ОповеститьОВыборе во второй форме и ловим результат через обработчик ОбработкаОповещения или ОбработкаВыбора в основной форме документа.
  3. Отказ от модальности: Использование метода ОткрытьФормуМодально устарело. Модальные вызовы блокируют работу в веб-клиенте и вызывают системные ошибки, если в конфигурации включен режим «Запрещать модальные вызовы». Рекомендуется использовать стандартный асинхронный метод ОткрытьФорму.
  4. Альтернатива без дополнительных окон: Если вторая форма нужна только для вывода вспомогательных полей или сложных расчетов строки, практичнее отказаться от отдельного окна. Достаточно разместить под табличной частью сворачиваемую панель или вкладки (элемент Страницы) и привязать поля панели к свойствам Элементы.ТабличнаяЧасть1.ТекущиеДанные. Это избавит конфигурацию от лишних окон и проблем с синхронизацией данных.
← На главную