Как программно обработать двойной клик в таблице 1С и открыть форму нужного документа?

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

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

Разбираем событие Выбор: основы и назначение

Для начала проанализируем, как работает механизм выбора в табличных частях и динамических списках. Когда пользователь дважды щелкает по ячейке таблицы, платформа инициирует событие Выбор. По умолчанию 1С пытается выполнить «стандартное» действие: если это ссылка на объект, открывается его основная форма; если ячейка доступна для редактирования, активируется режим ввода текста.

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


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Здесь будет наш код
КонецПроцедуры

Разберем параметры, которые передает нам платформа, так как они критически важны для корректной работы:

  1. Элемент — это ссылка на сам элемент управления (таблицу), который вызвал событие.
  2. ВыбраннаяСтрока — идентификатор строки, на которой был совершен клик.
  3. Поле — объект типа ПолеФормы, указывающий на конкретную колонку, по которой кликнул пользователь.
  4. СтандартнаяОбработка — Булево значение, которое определяет, должна ли платформа выполнять действия по умолчанию после завершения нашего кода.

Шаг 1. Ограничение области действия (Работа с колонками)

Представим ситуацию: в нашей таблице есть колонки «Отметка» (флажок) и «ПоДокументу» (ссылка на документ). Если мы просто напишем код открытия формы, он будет срабатывать при клике по любой колонке, что неудобно. Мы должны проверить, по какому именно полю нажал пользователь.

Проанализируем ситуацию и добавим проверку имени поля. Это позволит избежать случайного открытия форм при работе с другими данными в строке:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    Если Поле.Имя = "ПоДокументу" Тогда
        // Наша логика только для этой колонки
    КонецЕсли;

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

Шаг 2. Отмена стандартного поведения платформы

Как отмечалось в обсуждении на форуме, важнейшим моментом является управление флагом СтандартнаяОбработка. Если мы открываем свою форму программно, нам нужно установить СтандартнаяОбработка = Ложь. Если этого не сделать, 1С сначала выполнит наш код (откроет форму), а затем попытается выполнить свое действие (например, еще раз откроет ту же форму или перейдет в режим редактирования ячейки), что приведет к визуальному «мерцанию» или ошибкам.

Шаг 3. Реализация открытия формы (Универсальный метод)

Существует несколько способов открыть форму объекта. Самый простой и современный — использование метода ПоказатьЗначение. Этот метод универсален: он сам определяет тип данных в переменной и вызывает соответствующую форму. Это особенно полезно, если в колонке «ПоДокументу» могут находиться разные типы документов (например, «Заказ клиента» и «Сборочный лист»).

Рассмотрим пример реализации:


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

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

Шаг 4. Открытие конкретной формы через ОткрытьФорму

Иногда требуется открыть не просто форму по умолчанию, а конкретную форму (например, форму выбора или специальную форму просмотра) с передачей определенных параметров. В этом случае мы используем метод ОткрытьФорму. Выясним, как это реализовать, если в колонке хранятся разные типы документов.

Проанализируем пример кода с проверкой типов:


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

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

Нюансы работы в Обычных формах

Если вы работаете в старом интерфейсе (Обычные формы), объектная модель немного отличается. Вместо ТекущиеДанные у элемента формы ТабличноеПоле используется обращение через индекс или напрямую к значению. Однако логика с параметром СтандартнаяОбработка остается идентичной.

Пример для обычных форм:


Процедура ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    
    Если Колонка.Имя = "ПоДокументу" Тогда
        СтандартнаяОбработка = Ложь;
        
        СсылкаНаДок = ВыбраннаяСтрока.ПоДокументу;
        Если ЗначениеЗаполнено(СсылкаНаДок) Тогда
            ОткрытьФорму(СсылкаНаДок.ПолучитьФорму());
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Дополнительные настройки интерфейса

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

  1. Откройте форму и выберите нужную колонку таблицы.
  2. В палитре свойств найдите категорию «Использование».
  3. Установите флаг «Кнопка открытия» в значение Да.
  4. Также можно изменить свойство «РежимРедактирования» на ВходПриВводе, чтобы двойной клик по ссылке сразу приводил к ее открытию, а не к попытке редактирования текста.

Важный совет: Если ваша таблица предназначена только для просмотра, установите у всей таблицы свойство ТолькоПросмотр = Истина. В этом случае событие Выбор все равно будет работать, но вам не придется бороться с попытками системы включить режим редактирования ячеек при клике.

Резюме

Мы проанализировали основные подходы к обработке события Выбор в 1С. Подведем итоги совместной работы:

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

← На главную