Дублирование значений в полях табличных частей (CTRL+D)

02.03.23

Задачи пользователя - Корректировка данных

В Excel есть замечательная комбинация Ctrl+D, позволяющая скопировать значение из поля предшествующего в текущему. В 1С мне такой штуки иногда не хватает, особенно в последней разработке, где необходимо выбрать одно и то же значение в 50 строках.

Скачать исходный код

Наименование Файл Версия Размер
Дублирование значений в полях табличных частей (CTRL+D):
.cfe 96,10Kb
1
.cfe 2.3 96,10Kb 1 Скачать

Лично мне, стандартное действие сочетания Ctrl+D (добавить в избранное) не нужно, но всегда можно указать другое сочетание. Расширенийup 26/10/2022 , обработок делать не буду, просто выложу свое решение задачи, может кому пригодится, а может кто предложит более изящный вариант.

Для использования необходимо поместить код в модуль формы и вызвать СоздатьКомандуДублироватьЗначение() из процедуры ПриСозданииНаСервере() формы.

&НаСервере
Функция СоздатьКомандуДублироватьЗначение()
	НоваяКоманда = Команды.Добавить("ДублироватьЗначение");
	НоваяКоманда.Действие= "ДублироватьЗначение";
	НоваяКоманда.Заголовок= "Дублировать значение";
	НоваяКоманда.ИзменяетСохраняемыеДанные = ?(найти(нрег(этаформа.ИмяФормы),"обработка")>0,Ложь,Истина);
	НоваяКоманда.Отображение= ОтображениеКнопки.Картинка;
	НоваяКоманда.Подсказка= "Дублируется значение предыдыущего поля, аналогично Excel. В т.ч. и выделенные строки";
	НоваяКоманда.СочетаниеКлавиш= Новый СочетаниеКлавиш(Клавиша.D, , Истина); // Ctrl+D
	
	// Опытным путем выявлено, что вызов команды сочетаниемклавиш не работает без кнопки
	// при этом кнопка должна быть на форме, Видимость=Истина
	// также замечено, что нажатие сочетанийклавишь активизирует кнопку
	// из-за чего ЭтаФорма.ТекущийЭлемент вернет кнопку
	// поэтому убираем кнопку в допМеню, этот фокус позволит получить именно текущий элемент
	НоваяКнопка=Элементы.Добавить("ДублироватьЗначение",Тип("КнопкаФормы"),ЭтаФорма.КоманднаяПанель);
	НоваяКнопка.вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
	НоваяКнопка.ИмяКоманды="ДублироватьЗначение";
	НоваяКнопка.ПоложениеВКоманднойПанели=ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
КонецФункции

&НаКлиенте
Функция ДублироватьЗначение()
	Если Типзнч(этаформа.ТекущийЭлемент)=Тип("ТаблицаФормы") Тогда     //работаем только с таблицами
		ИмяТФ=этаформа.ТекущийЭлемент.Имя;	// имя ТаблицыФормы
		ИмяТЗ=ПолучитьПутьКДанным(ИмяТФ);	// имя элемента формы может отличатся от имени реквизита
		ТЗнаФорме=Вычислить(ИмяТЗ);	// данные формы коллекция
		ВыделенныеСтроки=Элементы[ИмяТФ].ВыделенныеСтроки;
		// Определяем источник - строка предшествующая первой выделенной 
		// При удалении, перемещении строк, их идентификатор не меняется, и очень похож на номер строки
		// при этом индекс строки меняется
		ИндексСтрокиИсточника=9999999;
		Для каждого ИдСтроки ИЗ ВыделенныеСтроки Цикл
			ИндексСтроки=ТЗнаФорме.Индекс(ТЗнаФорме.НайтиПоИдентификатору(ИдСтроки));
			ИндексСтрокиИсточника=?(ИндексСтрокиИсточника>ИндексСтроки,ИндексСтроки,ИндексСтрокиИсточника);
		КонецЦикла;                                 
		ИндексСтрокиИсточника=ИндексСтрокиИсточника-1;
		
		Если ИндексСтрокиИсточника>=0 Тогда
			// опять же, имя элемента формы может отличатся от имени реквизита
			// при этом ПутьКДанным колонки содержит и ПутьКДанным таблицы, исключаем
			// обращатся к колонке по индексу также не стоит, т.к. порядок на форме может отличаться от порядка реквизитов
			ИмяТекКолонки=стрзаменить(ПолучитьПутьКДанным(Элементы[ИмяТФ].ТекущийЭлемент.Имя),""+ИмяТЗ+".","");

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

&НаСервере
Функция ПолучитьПутьКДанным(ИмяЭлемента)
	Возврат(Элементы[ИмяЭлемента].ПутьКДанным);
КонецФункции

Собственно, комментарии рассказывают все подводные камни, с которыми я столкнулся.

В теории можно подключить интерактивную запись и тем самым вызывать событие ПриИзменении(), но:

  1. Мне оно не нужно
  2. Нужно немного переделать код

 

UP 24/10/2022

Благодаря SlavaKron я исправил ошибку и переделал с минимальным вызовом сервера, а в связи с этим реализовать вариант с Интерактивной записью оказалось не так сложно

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

Может кто предложит как получить ПутьКДанным без вызова сервера, т.к. иначе реализовать вариант расширения с общим модулем не получается

 

UP 26/10/2022

Нашел таки вариант реализации в расширении (с вызовом события ПриИзменении()), но не назову его прям очень изящным и универсальным по нескольким причинам:

  1. В расширение нужно добавить все формы документов/справочников к которым хотим прикрутить фичу
     
     В модуле каждой формы нужно добавить код
  2. Чтобы вывести основную часть кода в общие модули, пришлось искать путь передачи формы в серверную процедуру общего модуля (ПутьКДанным - свойство доступное только на сервере)
     
     Для этого нужно в модуль каждой формы добавить функцию

 

UP 27/10/2022

Пока записывал видео для расширения обнаружил пару косяков:

  1. Выходит ошибка при попытке продублировать поля в которых выводятся реквизиты других объектов (собственно ничего удивительного, добавил проверку)
  2. При некоторых условиях в выделенном диапазоне не заменялось значение поля первой строки (исправлено)
  3. Некорректно копируется значение полей являющихся представлением группы других (например: счета учета), что не удивительного, не исправлял, т.к. этот тот еще геморрой и лишает нас некой универсальности

О расширении (прикреплено):

  • Механизмы БСП не задействованы.
  • Код открыт для редактирования.
  • В расширении подключены только формы документа "Реализация товаров и услуг" конфигурации Бухгалтерия Предприятия 3.0.122.97
  • Не копирует значения из полей "представления" (реквизит другого объекта (например: единица измерения)).
  • Поля а-ля "Счета учета" изменит значение ("представление"), но не применит.

 

Протестировано на:

26 октября 2022 года - 8.3.18.1741, БП 3.0.122.97
02 марта 2023 года - 8.3.22.1750, БП 3.0.131.34

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2799    31    15    

37

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    28387    83    146    

61

Тестирование и исправление ключей аналитики ERP, УТ11, КА

Корректировка данных Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    107678    638    173    

680

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22718    303    35    

75

Исправление ошибок по НДФЛ и взаиморасчетам с сотрудниками в 1С:Бухгалтерия 3.0

Корректировка данных Зарплата Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    826    4    4    

7

Корректировка банковской выписки в УНФ

Банковские операции Корректировка данных Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Платные (руб)

Корректировка банковской выписки после загрузки из клиент-банка (статья, корреспонденция, вид операции, валюта и зарплата)

3000 руб.

25.12.2023    663    2    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SlavaKron 18.10.22 10:32 Сейчас в теме
Также, можно закешировать пути к данным на клиенте, чтобы избавиться от серверных вызовов. Непонятно, зачем вы работаете с индексами, если можно работать только идентификаторами строки без всякого обращения на сервер.
2. arshanskiyav 29 18.10.22 10:45 Сейчас в теме
Предположим что пользователь удалил строку или изменил их порядок, как я смогу получить строку предшествующую выделенной без индекса? Идентификатор не является порядковым номером
3. SlavaKron 18.10.22 11:09 Сейчас в теме
(2) А зачем надо получать предшествующую строку? Логичное поведение – скопировать значение текущей строки в остальные.
4. arshanskiyav 29 18.10.22 11:37 Сейчас в теме
(3) Не, задача чуть другая, копировать из предшествующей в выделенные, не важно сколько их одна или пятьдесят. Поведение как в excel
5. SlavaKron 18.10.22 11:40 Сейчас в теме
(4) В любом случае, метод Индекс() доступен на клиенте.
6. arshanskiyav 29 26.10.22 09:58 Сейчас в теме
(5), Сначала не понял, а потом как понял. Спасибо, исправил
Оставьте свое сообщение