Лично мне, стандартное действие сочетания Ctrl+D (добавить в избранное) не нужно, но всегда можно указать другое сочетание. Расширенийup 26/10/2022 , обработок делать не буду, просто выложу свое решение задачи, может кому пригодится, а может кто предложит более изящный вариант.
Для использования необходимо поместить код в модуль формы и вызвать СоздатьКомандуДублироватьЗначение() из процедуры ПриСозданииНаСервере() формы.
&НаСервере
Функция СоздатьКомандуДублироватьЗначение()
НоваяКоманда = Команды.Добавить("ДублироватьЗначение");
НоваяКоманда.Действие= "ДублироватьЗначение";
НоваяКоманда.Заголовок= "Дублировать значение";
НоваяКоманда.ИзменяетСохраняемыеДанные = ?(найти(нрег(этаформа.ИмяФормы),"обработка")>0,Ложь,Истина);
НоваяКоманда.Отображение= ОтображениеКнопки.Картинка;
НоваяКоманда.Подсказка= "Дублируется значение предыдыущего поля, аналогично Excel. В т.ч. и выделенные строки";
НоваяКоманда.СочетаниеКлавиш= Новый СочетаниеКлавиш(Клавиша.D, , Истина); // Ctrl+D
// Опытным путем выявлено, что вызов команды сочетаниемклавиш не работает без кнопки
// при этом кнопка должна быть на форме, Видимость=Истина
// также замечено, что нажатие сочетанийклавишь активизирует кнопку
// из-за чего ЭтаФорма.ТекущийЭлемент вернет кнопку
// поэтому убираем кнопку в допМеню, этот фокус позволит получить именно текущий элемент
НоваяКнопка=Элементы.Добавить("ДублироватьЗначение",Тип("КнопкаФормы"),ЭтаФорма.КоманднаяПанель);
НоваяКнопка.вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
НоваяКнопка.ИмяКоманды="ДублироватьЗначение";
НоваяКнопка.ПоложениеВКоманднойПанели=ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
КонецФункции
&НаКлиенте
Функция ДублироватьЗначение()
Если Типзнч(этаформа.ТекущийЭлемент)=Тип("ТаблицаФормы") Тогда //работаем только с таблицами
ИмяТФ=этаформа.ТекущийЭлемент.Имя; // имя ТаблицыФормы
ИмяТЗ=ПолучитьПутьКДанным(ИмяТФ); // имя элемента формы может отличатся от имени реквизита
ТЗнаФорме=Вычислить(ИмяТЗ); // данные формы коллекция
ВыделенныеСтроки=Элементы[ИмяТФ].ВыделенныеСтроки;
// Определяем источник - строка предшествующая первой выделенной
// При удалении, перемещении строк, их идентификатор не меняется, и очень похож на номер строки
// при этом индекс строки меняется
ИндексСтрокиИсточника=9999999;
Для каждого ИдСтроки ИЗ ВыделенныеСтроки Цикл
ИндексСтроки=ТЗнаФорме.Индекс(ТЗнаФорме.НайтиПоИдентификатору(ИдСтроки));
ИндексСтрокиИсточника=?(ИндексСтрокиИсточника>ИндексСтроки,ИндексСтроки,ИндексСтрокиИсточника);
КонецЦикла;
ИндексСтрокиИсточника=ИндексСтрокиИсточника-1;
Если ИндексСтрокиИсточника>=0 Тогда
// опять же, имя элемента формы может отличатся от имени реквизита
// при этом ПутьКДанным колонки содержит и ПутьКДанным таблицы, исключаем
// обращатся к колонке по индексу также не стоит, т.к. порядок на форме может отличаться от порядка реквизитов
ИмяТекКолонки=стрзаменить(ПолучитьПутьКДанным(Элементы[ИмяТФ].ТекущийЭлемент.Имя),""+ИмяТЗ+".","");
ЗначениеИсточника=ТЗнаФорме[ИндексСтрокиИсточника][ИмяТекКолонки];
Для Каждого СтрТЧ ИЗ ВыделенныеСтроки Цикл
// ВыделенныеСтроки хранит не индекс строк, а их иденитфикаторы
// при удалении строк из середины обновляется индекс, но не номер строки
ТЗнаФорме.НайтиПоИдентификатору(СтрТЧ)[ИмяТекКолонки]=ЗначениеИсточника;
КонецЦикла;
Элементы[ИмяТФ].Обновить(); //обновляем данные в ТаблицеФормы
КонецЕсли;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьПутьКДанным(ИмяЭлемента)
Возврат(Элементы[ИмяЭлемента].ПутьКДанным);
КонецФункции
Собственно, комментарии рассказывают все подводные камни, с которыми я столкнулся.
В теории можно подключить интерактивную запись и тем самым вызывать событие ПриИзменении(), но:
- Мне оно не нужно
- Нужно немного переделать код
UP 24/10/2022
Благодаря SlavaKron я исправил ошибку и переделал с минимальным вызовом сервера, а в связи с этим реализовать вариант с Интерактивной записью оказалось не так сложно
Может кто предложит как получить ПутьКДанным без вызова сервера, т.к. иначе реализовать вариант расширения с общим модулем не получается
UP 26/10/2022
Нашел таки вариант реализации в расширении (с вызовом события ПриИзменении()), но не назову его прям очень изящным и универсальным по нескольким причинам:
- В расширение нужно добавить все формы документов/справочников к которым хотим прикрутить фичу
- Чтобы вывести основную часть кода в общие модули, пришлось искать путь передачи формы в серверную процедуру общего модуля (ПутьКДанным - свойство доступное только на сервере)
UP 27/10/2022
Пока записывал видео для расширения обнаружил пару косяков:
- Выходит ошибка при попытке продублировать поля в которых выводятся реквизиты других объектов (собственно ничего удивительного, добавил проверку)
- При некоторых условиях в выделенном диапазоне не заменялось значение поля первой строки (исправлено)
- Некорректно копируется значение полей являющихся представлением группы других (например: счета учета), что не удивительного, не исправлял, т.к. этот тот еще геморрой и лишает нас некой универсальности
О расширении (прикреплено):
- Механизмы БСП не задействованы.
- Код открыт для редактирования.
- В расширении подключены только формы документа "Реализация товаров и услуг" конфигурации Бухгалтерия Предприятия 3.0.122.97
- Не копирует значения из полей "представления" (реквизит другого объекта (например: единица измерения)).
- Поля а-ля "Счета учета" изменит значение ("представление"), но не применит.
Протестировано на:
26 октября 2022 года - 8.3.18.1741, БП 3.0.122.97
02 марта 2023 года - 8.3.22.1750, БП 3.0.131.34