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

```1c
    &НаКлиенте
    Процедура КомандаВставитьСимвол(Команда)
    Перем Текст;

    Если Команда = Команды.КомандаВставитьВопрос Тогда
    Текст = "?";
    ИначеЕсли Команда = Команды.КомандаВставитьВосклицательный Тогда
    Текст = "!";
    КонецЕсли;

    Элемент = ЭтаФорма.ТекущийЭлемент;
    Если Элемент = Элементы.Строка1 или Элемент = Элементы.Строка2 Тогда
    ВставитьТекст(Элемент, Текст);
    КонецЕсли;

    КонецПроцедуры
```
---
Прописывать такое в каждом элементе формы очень не хочется, их очень много. Ты программист или где? Пропиши программно. Циклы в школе проходил?
---
Такого события нет. На для строк таблицы есть. Обычно этого за глаза хватает. Лучше напиши, задачу подробнее, возможно подскажут более подходящее решение.
---
если коротко, то задача следующая:
предыдущий активный элемент формы запоминать и при определенных нажатиях на кнопки формы вносить изменения в этот предыдущий элемент формы, так как при нажатии на кнопку формы текущим элементом становится нажимаемая кнопка формы.
---
Не стало понятнее. Как вариант для элементов, ставить рядом кнопки, которые только этот элемент и меняют.
---
на форме есть несколько реквизитов текстовых и всего один ряд уникальных кнопок.
К каждой кнопке привязан один специфичный символ.
Нужно чтобы при нажатии на кнопку мышкой, символ назначенный этой кнопке, записывался в текстовый реквизит, который был активен до нажатия кнопки.
Так надеюсь понятнее написал.

Дублировать ряд кнопок под каждый текстовый реквизит не получиться.
Перевести все реквизиты в таблицу тоже не получится.
---
На попробовать такой вариант. Если символы надо вставлять не прям очень часто и можно это делать двумя нажатиями.
То можно попробовать сделать рядом с реквизитами выпадающие списки для выбора нужного символа.
Или открывать форму с таблицей символов по нажатии кнопки Открыть в реквизитах.
---
(15) Кнопки часто используются. Пользователи не согласятся дважды кликать на них.
---
Вот что сейчас откопал.
Если разместить кнопки в командной панели в выпадающем подменю, то текущий элемент не пропадает. То есть работает так, как тебе надо. Просто команды расположенные в командной панели не проверял, но с меню точно работает.

```1c
    &НаКлиенте
    Процедура КомандаВставитьСимвол(Команда)
    Перем Текст;

    Если Команда = Команды.КомандаВставитьВопрос Тогда
    Текст = "?";
    ИначеЕсли Команда = Команды.КомандаВставитьВосклицательный Тогда
    Текст = "!";
    КонецЕсли;

    Элемент = ЭтаФорма.ТекущийЭлемент;
    Если Элемент = Элементы.Строка1 или Элемент = Элементы.Строка2 Тогда
    ВставитьТекст(Элемент, Текст);
    КонецЕсли;

    КонецПроцедуры
```
---
Супер, отличный вариант, спасибо. Жаль что у меня не таблица а разрозненные реквизиты формы.
Но попробую может удастся использовать кнопки Командной панели или что-то похожее что не перехватывает активность формы на себя.
---
Чем не устраивает вариант с автоподбором?
---
что за вариант с автоподбором?
---
Который в (12) и (13)
---
Пример в (16) для без таблицы
---
(16) Еще раз спасибо.
Использовал эту возможность что кнопки командной панели не перехватывают на себя активный элемент формы.
Правда пришлось логику переписать создания этих кнопок.
Но в целом вроде работает.
За помощь могу предложить скачать с этого сайта что-нибудь полезное.
---
Обработчик ожидания, записывающий в переменную текущий элемент формы
---
Обработчик ожидания держу в уме, но у него есть минусы.
он имеет таймаут минимум секунда. И есть вероятность что пользователь совершит действия меньше чем за секунду.
+ нагрузка на форму
---
Кто тебе назвиздел про 1 секунду?
---
Это отвратительная логика.

Предыдущим элементом перед нажатием кнопки может быть что угодно, а не только твой целевой элемент. В этом случае кнопка будет нерабочей, а пользователь будет поминать программиста разными словами.

Думай ещё.
---
Какого типа элементы формы, которые нужно запоминать? Возможно, это проще реализовать через таблицу формы.
---
нет, через таблицу реализовать не получиться, текстовые реквизиты разбросаны по форме и их не собрать в одной таблице.
---
Попробуй воспользоваться событием элемента формы - АвтоПодбор. Даже при простой активизации поля событие выполняется. Запиши оттуда имя элемента формы в реквизит формы, а затем при нажатии кнопки с символом получи реквизит объекта по имени из сохраненного значения реквизита и допиши в него символы.

Придётся для всех элементов, в которые ты записываешь, сделать такое событие.

Объект[ИмяПоляФормыИзРеквизита] = Объект[ИмяПоляФормыИзРеквизита] + СимволСКнопки;
---
Кстати, если у тебя много элементов формы, то ты можешь их затолкать в массив, затем обойти его и каждому элементу из коллекции установить действие - Элементы[ИмяЭлемента].УстановитьДействие("АвтоПодбор", "ОбщаяПроцедураАвтоПодбор");

У тебя получится, что для всех твоих элементов одно событие, которое будет отрабатывать на все эти элементы, куда нужно значение писать, и оно будет тебе последний активированный элемент в переменную записывать, а дальше уже как выше написал
---
Чтобы корректно отработало нужно всем элементам формы присвоить данное действие.
Иначе не всегда информация по текущему элементу будет актуальная.
Не уверен что в дальнейшем по какому-нибудь элементу не потребуется данное действие для другой цели.
Пока решил свою задачу путем создания кнопок в командной панели.
Но всё равно спасибо за помощь.