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