Как программно задать смещение выделенного ряда в табличной форме 1С? Возможно ли выделить весь ряд целиком в пользовательском режиме и сместить его вручную? Как выделить весь ряд сразу, а не по отдельным элементам? Как в Excel кликнуть на заголовок столбца для выделения всего ряда?
В 1С программирование табличных форм существует несколько способов управления выделением строк и их смещением. Можно программно задать смещение выделенного ряда, выделить весь ряд целиком в пользовательском режиме и сместить его вручную, а также использовать различные методы выделения целого ряда вместо отдельных элементов, аналогично функции Excel с заголовками столбцов.
Содержание
- Программное управление выделением строк
- Выделение всего ряда в пользовательском режиме
- Методы выделения целого ряда
- Аналогия с Excel и реализация в 1С
- Практические примеры кода
- Заключение
Программное управление выделением строк
В 1С программное управление выделением строк в табличной форме осуществляется через объект формы и его элементы. Основные методы и свойства для работы с выделением включают:
Элементы.ТабличнаяФорма.ТекущаяСтрока- получение и установка текущей строкиЭлементы.ТабличнаяФорма.ВыделенныеСтроки- коллекция выделенных строкЭлементы.ТабличнаяФорма.ВыделитьСтроку()- метод для выделения строки
Для программного задания смещения выделенного ряда можно использовать следующий подход:
// Получаем текущую выделенную строку
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
// Если строка выделена
Если ТекущаяСтрока <> Неопределено Тогда
// Получаем индекс текущей строки
ИндексСтроки = ТекущаяСтрока.Индекс;
// Задаем смещение (например, на 2 позиции вниз)
Смещение = 2;
НовыйИндекс = ИндексСтроки + Смещение;
// Проверяем, что новый индекс находится в пределах таблицы
Если НовыйИндекс >= 0 И НовыйИндекс < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
// Устанавливаем новую текущую строку
Элементы.ТабличнаяФорма.ТекущаяСтрока = Элементы.ТабличнаяФорма.Строки[НовыйИндекс];
КонецЕсли;
КонецЕсли;
Выделение нескольких строк и их массовое смещение также возможно через коллекцию ВыделенныеСтроки:
// Получаем коллекцию выделенных строк
ВыделенныеСтроки = Элементы.ТабличнаяФорма.ВыделенныеСтроки;
// Если есть выделенные строки
Если ВыделенныеСтроки.Количество() > 0 Тогда
// Задаем смещение
Смещение = 1;
// Проходим по выделенным строкам в обратном порядке
// чтобы избежать проблем с изменением индексов
Для i = ВыделенныеСтроки.Количество() - 1 По 0 Шаг -1 Цикл
ТекущаяСтрока = ВыделенныеСтроки[i];
НовыйИндекс = ТекущаяСтрока.Индекс + Смещение;
// Проверяем границы
Если НовыйИндекс >= 0 И НовыйИндекс < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
// Сдвигаем строку
Элементы.ТабличнаяФорма.Строки.Переместить(НовыйИндекс, ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Выделение всего ряда в пользовательском режиме
Да, возможно выделить весь ряд целиком в пользовательском режиме и сместить его вручную. Для этого табличная форма должна иметь соответствующие настройки:
-
Настройки табличной формы:
- Свойство “Режим выделения” должно быть установлено в “Строка”
- Должен быть разрешен режим редактирования
-
Ручное смещение строк:
- Выделите строку кликом на заголовке строки (обычно слева)
- Перетащите выделенную строку в новое положение
- Или используйте кнопки перемещения в панели инструментов
Для программной поддержки ручного перемещения строк необходимо:
// В обработчике события НачалоПереноса
&НаКлиенте
Процедура ТабличнаяФормаНачалоПереноса(Элемент, ПеретаскиваемыеДанные, Источник)
// Проверяем, что перетаскивается строка таблицы
Если ТипЗнч(Источник) = Тип("СтрокаТабличнойЧасти") Тогда
// Разрешаем операцию
ПеретаскиваемыеДанные.Допустимо = Истина;
КонецЕсли;
КонецПроцедуры
// В обработчике события ЗавершениеПереноса
&НаКлиенте
Процедура ТабличнаяФормаЗавершениеПереноса(Элемент, ПеретаскиваемыеДанные, Цель)
// Обрабатываем завершение переноса
Если ТипЗнч(Цель) = Тип("СтрокаТабличнойЧасти") Тогда
// Можно добавить дополнительную логику
Сообщить("Строка успешно перемещена");
КонецЕсли;
КонецПроцедуры
Методы выделения целого ряда
В 1С существует несколько способов выделить целый ряд сразу, а не по отдельным элементам:
1. Через заголовки строк
Если в табличной форме отображаются заголовки строк, клик по заголовку строки выделяет всю строку целиком:
// Настройка отображения заголовков строк
Элементы.ТабличнаяФорма.ПоказыватьЗаголовкиСтрок = Истина;
2. Выделение по первому столбцу
Можно настроить выделение всей строки при клике на первом столбце:
// В обработчике события НачалоВыбора
&НаКлиенте
Процедура ТабличнаяФормаНачалоВыбора(Элемент, СтандартнаяОбработка, ВыбранноеЗначение, Источник)
// Если кликнули на первом столбце
Если Элемент.Имя = "ПервыйСтолбец" Тогда
// Выделяем всю строку
СтандартнаяОбработка = Ложь;
Элементы.ТабличнаяФорма.ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
КонецЕсли;
КонецПроцедуры
3. Массовое выделение строк
Для выделения нескольких строк сразу используйте клавиатурные сочетания:
- Ctrl + клик - выделение нескольких несмежных строк
- Shift + клик - выделение диапазона строк
// Программное выделение диапазона строк
&НаКлиенте
Процедура ВыделитьДиапазонСтрок(НачальныйИндекс, КонечныйИндекс)
// Очищаем текущее выделение
Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
// Выделяем строки в диапазоне
Для i = НачальныйИндекс По КонечныйИндекс Цикл
Если i < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
Элементы.ТабличнаяФорма.ВыделитьСтроку(Элементы.ТабличнаяФорма.Строки[i], Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Аналогия с Excel и реализация в 1С
В Excel клик на заголовке столбца выделяет весь столбец, а клик на заголовке строки - всю строку. В 1С можно реализовать аналогичную функциональность:
Выделение столбца по заголовку
// В обработчике события ЗаголовокОформления
&НаКлиенте
Процедура ТабличнаяФормаЗаголовокОформления(Элемент, Оформление, ДанныеСтроки)
// Если это заголовок столбца
Если Оформление.ЭлементФормы.Заголовок Тогда
// Добавляем обработчик клика
Оформление.ЭлементФормы.УстановитьДействие("Нажатие", "ВыделитьВесьСтолбец");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыделитьВесьСтолбец(Элемент)
// Получаем индекс столбца
ИндексСтолбца = Элемент.Индекс;
// Выделяем все строки в этом столбце
Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
Для Каждая Строка Из Элементы.ТабличнаяФорма.Строки Цикл
Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
КонецЦикла;
// Устанавливаем фокус на столбец
Элементы.ТабличнаяФорма.ТекущийСтолбец = ИндексСтолбца;
КонецПроцедуры
Выделение строки по заголовку
// В обработчике события ЗаголовокОформления
&НаКлиенте
Процедура ТабличнаяФормаЗаголовокОформления(Элемент, Оформление, ДанныеСтроки)
// Если это заголовок строки
Если Оформление.ЭлементФормы.ТипЗаголовка = ТипЗаголовкаСтроки.Строка Тогда
// Добавляем обработчик клика
Оформление.ЭлементФормы.УстановитьДействие("Нажатие", "ВыделитьВсюСтроку");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыделитьВсюСтроку(Элемент)
// Получаем строку по заголовку
Строка = Элементы.ТабличнаяФорма.Строки[Элемент.Индекс];
// Выделяем только эту строку
Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
// Устанавливаем фокус на строку
Элементы.ТабличнаяФорма.ТекущаяСтрока = Строка;
КонецПроцедуры
Практические примеры кода
Пример 1: Перемещение выделенных строк вверх
&НаКлиенте
Процедура ПереместитьВыделенныеСтрокиВверх(Команда)
ВыделенныеСтроки = Элементы.ТабличнаяФорма.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Сортируем выделенные строки по индексу
ВыделенныеСтроки.Сортировать("Индекс");
// Перемещаем каждую строку вверх
Для Каждая Строка Из ВыделенныеСтроки Цикл
Индекс = Строка.Индекс;
Если Индекс > 0 Тогда
Элементы.ТабличнаяФорма.Строки.Переместить(Индекс - 1, Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Пример 2: Расширенное выделение с клавиатурными сочетаниями
&НаКлиенте
Процедура ТабличнаяФормаПриНажатииКлавиши(Элемент, Клавиша, ОбработкаКлавиши)
// Ctrl+A - выделить все строки
Если Клавиша = Клавиши.Ctrl + "A" Тогда
Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
Для Каждая Строка Из Элементы.ТабличнаяФорма.Строки Цикл
Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
КонецЦикла;
ОбработкаКлавиши = Истина;
Возврат;
КонецЕсли;
// Ctrl+Up - выделить строку выше
Если Клавиша = Клавиши.Ctrl + Клавиши.Up Тогда
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс > 0 Тогда
НоваяСтрока = Элементы.ТабличнаяФорма.Строки[ТекущаяСтрока.Индекс - 1];
Элементы.ТабличнаяФорма.ТекущаяСтрока = НоваяСтрока;
Элементы.ТабличнаяФорма.ВыделитьСтроку(НоваяСтрока, Истина);
КонецЕсли;
ОбработкаКлавиши = Истина;
Возврат;
КонецЕсли;
// Ctrl+Down - выделить строку ниже
Если Клавиша = Клавиши.Ctrl + Клавиши.Down Тогда
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс < Элементы.ТабличнаяФорма.Строки.Количество() - 1 Тогда
НоваяСтрока = Элементы.ТабличнаяФорма.Строки[ТекущаяСтрока.Индекс + 1];
Элементы.ТабличнаяФорма.ТекущаяСтрока = НоваяСтрока;
Элементы.ТабличнаяФорма.ВыделитьСтроку(НоваяСтрока, Истина);
КонецЕсли;
ОбработкаКлавиши = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Пример 3: Контекстное меню для управления строками
// В модуле формы
&НаКлиенте
Функция ПолучитьКонтекстноеМенюДляСтроки(Элемент, ДанныеСтроки) Экспорт
Команды = Новый СписокЗначений;
// Добавляем команды управления строкой
Команды.Добавить("Переместить вверх", "Переместить строку вверх", "ВыполнитьПеремещениеВверх");
Команды.Добавить("Переместить вниз", "Переместить строку вниз", "ВыполнитьПеремещениеВниз");
Команды.Добавить("Дублировать", "Скопировать строку", "ВыполнитьДублированиеСтроки");
Команды.Добавить("Удалить", "Удалить строку", "ВыполнитьУдалениеСтроки");
Возврат Команды;
КонецФункции
&НаКлиенте
Процедура ВыполнитьПеремещениеВверх(Команда)
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс > 0 Тогда
Элементы.ТабличнаяФорма.Строки.Переместить(ТекущаяСтрока.Индекс - 1, ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПеремещениеВниз(Команда)
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс < Элементы.ТабличнаяФорма.Строки.Количество() - 1 Тогда
Элементы.ТабличнаяФорма.Строки.Переместить(ТекущаяСтрока.Индекс + 1, ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДублированиеСтроки(Команда)
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
Копия = ТекущаяСтрока.Скопировать();
Элементы.ТабличнаяФорма.Строки.Добавить(Копия);
Элементы.ТабличнаяФорма.ТекущаяСтрока = Копия;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьУдалениеСтроки(Команда)
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
Элементы.ТабличнаяФорма.Строки.Удалить(ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Заключение
Программирование табличных форм в 1С предоставляет широкие возможности для управления выделением и перемещением строк. Основные выводы:
-
Программное управление выделением осуществляется через свойства
ТекущаяСтрокаиВыделенныеСтроки, а также методы выделения строк. -
Ручное выделение и перемещение строк возможно в пользовательском режиме при правильной настройке табличной формы и разрешении операций переноса.
-
Целостное выделение ряда достигается через заголовки строк, столбцов или программно через коллекции выделенных элементов.
-
Аналогия с Excel реализуется через обработчики событий заголовков и дополнительные функции для выделения столбцов или строк целиком.
-
Практические рекомендации:
- Используйте клавиатурные сочетания для быстрого выделения диапазонов
- Реализуйте контекстные меню для удобного управления строками
- Обрабатывайте события начала и завершения переноса для плавной работы с пользовательским интерфейсом
- Проверяйте границы при программном перемещении строк
Для эффективной работы с табличными формами рекомендуется комбинировать программные методы и пользовательские взаимодействия, создавая интуитивно понятный и функциональный интерфейс.