Как разрешить ввод данных в ячейку табличной части по двойному клику вместо открытия формы?

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

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

Разбор механики: почему открывается форма объекта?

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

Важно понимать различие между событиями отдельной колонки и всей таблицы. Многие начинающие разработчики ищут событие «Нажатие» или «Выбор» в свойствах конкретного поля (колонки), но событие Выбор принадлежит именно всей ТаблицеФормы.

Решение через событие «Выбор» табличной части

Для реализации задачи нам потребуется использовать обработчик события Выбор. Главным инструментом здесь выступает параметр СтандартнаяОбработка. Установив его в значение Ложь, мы сообщаем системе, что встроенные механизмы (открытие формы) выполнять не нужно.

Рассмотрим пример кода, который позволяет организовать ввод числового значения через асинхронное окно:


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

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

В данном примере мы используем метод ПоказатьВводЗначения. Это современный асинхронный подход, который не блокирует интерфейс и корректно работает в веб-клиенте.

Особенности работы в расширениях: &Вместо vs &После

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

Проанализируем ситуацию: если в основной конфигурации уже прописан обработчик события Выбор, который устанавливает какие-то свои правила, использование аннотации &После может быть бесполезным. Код расширения выполнится уже после того, как отработал основной код. Если стандартная обработка уже была запущена или, наоборот, прервана, ваш код может не возыметь эффекта.

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

Проверка иерархии ограничений «Только просмотр»

Иногда даже после написания корректного кода поле остается недоступным для редактирования. Проанализируем основные уровни блокировки, которые нужно проверить в 1С:

  1. Свойство формы «Только просмотр»: Если у всей формы установлено ТолькоПросмотр = Истина, настройки отдельных элементов (таблиц и колонок) игнорируются.
  2. Свойства элемента «Доступность» и «Только просмотр»: Проверьте эти флаги как у самой таблицы, так и у конкретного поля ввода внутри колонки.
  3. Условное оформление: Это «невидимый» враг. Часто в динамических списках или таблицах документа прописаны правила условного оформления, которые блокируют доступность ячеек при определенных условиях (например, если документ проведен).
  4. Права доступа (Роли): Если у текущего пользователя нет права «Редактирование» на данный реквизит в метаданных, программное снятие флага ТолькоПросмотр в коде формы не поможет — платформа заблокирует изменение на уровне ядра.

Использование свойства «Режим редактирования»

Выясним причину, по которой двойной клик вообще может игнорироваться как попытка входа в режим редактирования. У таблицы есть важное свойство — РежимРедактирования (EditMode). Оно определяет, как ведет себя ячейка при взаимодействии:

Различие событий «Выбор» и «НачалоВыбора»

Важно не путать эти механизмы. Выбор срабатывает на самой таблице при двойном клике. А НачалоВыбора — это событие конкретного поля ввода. Оно срабатывает, когда пользователь нажимает кнопку выбора («три точки») в уже активной ячейке.

Если ваша задача — запретить открытие списка справочника даже при нажатии на «три точки», вам нужно продублировать логику с СтандартнаяОбработка = Ложь и в событии НачалоВыбора для этого поля. Это обеспечит единообразие интерфейса: и при двойном клике, и при нажатии на кнопку выбора пользователь увидит ваше окно ввода, а не форму справочника.

Типичные ошибки: динамическое управление свойствами

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


&НаКлиенте
Процедура ТабЧастьПриАктивизацииСтрокиПосле(Элемент)
    Элементы.ТабЧасть.ТолькоПросмотр = Ложь;
    Элементы.ТабЧастьРеквизитТЧ.ТолькоПросмотр = Ложь;
КонецПроцедуры

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

Итоги

Для реализации ввода данных в таблицу по двойному клику вместо открытия ссылочного объекта:

  1. Используйте событие таблицы Выбор.
  2. Всегда устанавливайте СтандартнаяОбработка = Ложь.
  3. При работе в расширениях отдавайте предпочтение аннотации &Вместо.
  4. Проверяйте свойство таблицы РежимРедактирования.
  5. Убедитесь, что редактирование не заблокировано на уровне прав доступа или условного оформления.
← На главную